modul Coverage

Coverage bietet eine Funktion zur Messung der Codeabdeckung für Ruby. Diese Funktion ist experimentell, daher können sich diese APIs in Zukunft ändern.

Vorsicht: Derzeit wird nur die prozessweite Codeabdeckung unterstützt. Sie können keine Thread-spezifische Abdeckung messen.

Verwendung

  1. require “coverage”

  2. do Coverage.start

  3. require oder laden Sie eine Ruby-Quelldatei

  4. Coverage.result gibt einen Hash zurück, der den Dateinamen als Schlüssel und ein Abdeckungsarray als Wert enthält. Ein Abdeckungsarray gibt für jede Zeile die Anzahl der Zeilenausführungen durch den Interpreter an. Ein Wert von nil bedeutet, dass die Abdeckung für diese Zeile deaktiviert ist (Zeilen wie else und end).

Beispiele

[foo.rb]
s = 0
10.times do |x|
  s += x
end

if s == 45
  p :ok
else
  p :ng
end
[EOF]

require "coverage"
Coverage.start
require "foo.rb"
p Coverage.result  #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}

Zeilen-Coverage

Wenn beim Starten der Abdeckung kein Abdeckungsmodus explizit angegeben wird, wird die Zeilenabdeckung ausgeführt. Sie meldet die Anzahl der Zeilenausführungen für jede Zeile.

require "coverage"
Coverage.start(lines: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:lines=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}}

Der Wert des Zeilenabdeckungsergebnisses ist ein Array, das angibt, wie oft jede Zeile ausgeführt wurde. Die Reihenfolge in diesem Array ist wichtig. Beispielsweise meldet das erste Element in diesem Array, an Index 0, wie oft Zeile 1 dieser Datei ausgeführt wurde, während die Abdeckung lief (was in diesem Beispiel einmal ist).

Ein Wert von nil bedeutet, dass die Abdeckung für diese Zeile deaktiviert ist (Zeilen wie else und end).

Einmalige Zeilen-Coverage

Die einmalige Zeilenabdeckung verfolgt und meldet die ausgeführten Zeilen, während die Abdeckung läuft. Sie meldet nicht, wie oft eine Zeile ausgeführt wurde, sondern nur, dass sie ausgeführt wurde.

require "coverage"
Coverage.start(oneshot_lines: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:oneshot_lines=>[1, 2, 3, 6, 7]}}

Der Wert des Ergebnisses der einmaligen Zeilenabdeckung ist ein Array, das die Nummern der ausgeführten Zeilen enthält.

Zweigstellen-Coverage

Die Zweigstellenabdeckung meldet, wie oft jede Zweigstelle innerhalb jeder Bedingung ausgeführt wurde.

require "coverage"
Coverage.start(branches: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:branches=>{[:if, 0, 6, 0, 10, 3]=>{[:then, 1, 7, 2, 7, 7]=>1, [:else, 2, 9, 2, 9, 7]=>0}}}}

Jeder Eintrag im Zweigstellen-Hash ist eine Bedingung, deren Wert ein weiterer Hash ist, bei dem jeder Eintrag eine Zweigstelle in dieser Bedingung darstellt. Die Werte sind die Anzahl der Ausführungen der Methode, und die Schlüssel sind identifizierende Informationen über die Zweigstelle.

Die Informationen, die jeden Schlüssel zur Identifizierung von Zweigstellen oder Bedingungen bilden, sind von links nach rechts die folgenden:

  1. Ein Label für den Typ der Zweigstelle oder Bedingung.

  2. Eine eindeutige Kennung.

  3. Die Startzeilennummer, unter der sie in der Datei erscheint.

  4. Die Startspaltennummer, unter der sie in der Datei erscheint.

  5. Die Endzeilennummer, unter der sie in der Datei erscheint.

  6. Die Endspaltennummer, unter der sie in der Datei erscheint.

Methoden-Coverage

Die Methodenabdeckung meldet, wie oft jede Methode ausgeführt wurde.

[foo_method.rb]
class Greeter
  def greet
    "welcome!"
  end
end

def hello
  "Hi"
end

hello()
Greeter.new.greet()
[EOF]

require "coverage"
Coverage.start(methods: true)
require "foo_method.rb"
p Coverage.result #=> {"foo_method.rb"=>{:methods=>{[Object, :hello, 7, 0, 9, 3]=>1, [Greeter, :greet, 2, 2, 4, 5]=>1}}}

Jeder Eintrag im Methoden-Hash stellt eine Methode dar. Die Werte in diesem Hash sind die Anzahl der Ausführungen der Methode, und die Schlüssel sind identifizierende Informationen über die Methode.

Die Informationen, die jeden Schlüssel zur Identifizierung einer Methode bilden, sind von links nach rechts die folgenden:

  1. Die Klasse.

  2. Der Methodenname.

  3. Die Startzeilennummer, unter der die Methode in der Datei erscheint.

  4. Die Startspaltennummer, unter der die Methode in der Datei erscheint.

  5. Die Endzeilennummer, unter der die Methode in der Datei erscheint.

  6. Die Endspaltennummer, unter der die Methode in der Datei erscheint.

Alle Abdeckungsmodi

Sie können auch alle Abdeckungsmodi gleichzeitig mit dieser Verknüpfung ausführen. Beachten Sie, dass die Ausführung aller Abdeckungsmodi nicht sowohl Zeilen als auch einmalige Zeilen ausführt. Diese Modi können nicht gleichzeitig ausgeführt werden. Die Zeilenabdeckung wird in diesem Fall ausgeführt, da Sie sie immer noch verwenden können, um festzustellen, ob eine Zeile ausgeführt wurde oder nicht.

require "coverage"
Coverage.start(:all)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:lines=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil], :branches=>{[:if, 0, 6, 0, 10, 3]=>{[:then, 1, 7, 2, 7, 7]=>1, [:else, 2, 9, 2, 9, 7]=>0}}, :methods=>{}}}