web-dev-qa-db-ja.com

JavaScript単体テストのコードカバレッジの分岐とは

AngularJSプロジェクトの単体テストのコードカバレッジに Istanbul を使用します。カバレッジには4つのタイプがあり、それらは

  • ステートメント
  • ブランチ
  • 関数
  • ライン

ステートメント、関数、行は大丈夫ですが、「ブランチ」が何であるか理解できません。ブランチとは何ですか?

32
Evren Kutar

ブランチは、ランタイムが1つのパスを取るか別のパスを取るかを選択できる場所です。次の例を見てみましょう。

_if(a) {
    Foo();
}

if(b) {
    Bar();
}

Yay();
_

最初の行に到達すると、if(a)- statementの本文内に移動するかどうかを決定できます。また、それをしないこともできます。この段階では、すでに2つのパス(1つのブランチ)が表示されています。

その後の次のステートメントはより興味深いものになります。 if本体の内部に移動して、Barを実行できます。それもできません。ただし、以前にブランチを作成したことがあることを忘れないでください。 Fooが呼び出されたかどうかによって、結果は異なる場合があります。

したがって、次の4つの可能なパスになります。

  • Fooを呼び出さない、またはBarを呼び出さない
  • Fooを呼び出すのではなく、Barを呼び出す
  • Fooを呼び出さない、Barを呼び出す
  • FooBarの両方を呼び出す

YayまたはFooが呼び出されたかどうかに関係なく、最後のBarが常に実行されるため、ブランチとしてカウントされません。したがって、上記のコードスニペットには、4つのパス/ 2つのブランチが含まれています(Foo()を呼び出すかどうか、Bar()を呼び出すかどうか)。

すでに言及した他の回答と同様に、分岐を引き起こす可能性のあるステートメントが多数あります(if/switch)。 while/for/_do-while_などの条件ループ、または短絡(例_&&_/_||_)演算子のいずれかを忘れないでください。

コードカバレッジツールは、すべてのブランチをテストしたことを確認する必要があります。最良の方法は、ブランチだけでなく、すべてのパス、またはすべての(エッジケース)値さえテストされている場合です。これにより、不要な動作が実行されないようにします。

34
Caramiriel

コードが複数のルートを取ることができる場所、つまり分岐します。分岐ステートメントのいくつかの例は、if/elseおよびswitchステートメントです。

ブランチカバレッジは、これらのブランチのどれが実行されたかを追跡するため、すべてのルートが適切にテストされていることを確認できます。

2
James Thorpe

から ウィキペディア

各制御構造の各ブランチ(DDパスとも呼ばれます)(ifステートメントやcaseステートメントなど)が実行されましたか?たとえば、ifステートメントを指定すると、trueブランチとfalseブランチの両方が実行されましたか?別の言い方をすると、プログラムのすべてのEdgeが実行されたということです。

各制御構造について、考えられるすべてのケースをテストする必要があります(ifステートメント、つまりスイッチのすべてのケースに入力/入力しない)。ブランチカバレッジは、テストがカバーするブランチの合計数を測定するメトリックです(通常はパーセンテージ)。

1