欠落しているブランチを簡単に確認する方法はありますか? つまり、次のようなコードがあります。
if (x || y) {
// do stuff
}
カバレッジの強調表示には、Eclipse に次のような黄色い点があります。
4 つのブランチのうちの 1 つが見落とされました
しかし、どのブランチが欠落しているか知りたいです。
欠落しているブランチを簡単に確認する方法はありますか? つまり、次のようなコードがあります。
if (x || y) {
// do stuff
}
カバレッジの強調表示には、Eclipse に次のような黄色い点があります。
4 つのブランチのうちの 1 つが見落とされました
しかし、どのブランチが欠落しているか知りたいです。
何をすることができx
ますy
か?
true || true
はtrue (JVM の最適化のため対象外: 最初の条件が の場合、true
短絡評価のため 2 番目の条件は評価されません)false || true
本当ですtrue || false
本当ですfalse || false
偽ですEclemmaの親である jacoco の github リポジトリに関する未解決の問題は、そのような機能を実際に含めるのは少し難しいことを示唆しています。
ただし、Eclemma 機能がなくても、特定のケースで見逃されたブランチを特定することが目標である場合は、コードを計測して追跡することができます。最も単純な例は、昔ながらの print ステートメントです。
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
次に、出力を見て、実際にヒットしたブランチを確認します (例: java ... | grep "BRANCH:" | sort | uniq
)。(ひどく満足のいくものではありません、私は知っています。)
答えはtrue|| true
カバーされていません。
これは、JVM が最初の条件が true であることを検出すると、2 番目の条件を実行しない (最適化されている) ためです。つまり、コードの一部は実行されません。
Maroun が言ったように、4 つの分岐のうち 3 つが条件分岐を通過させます。それでもコード カバレッジが心配な場合は、条件を&&
ではなく にリファクタリングできます||
。
(x || y)
は と同じで、(!(!x && !y))
ブランチが 3 つしかないため、すべての条件をテストできます。
条件文の元の形式は、ガード ステートメントでよく見られます。
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
Null Pointer Exception がスローされるため、AND にエラーがあるobj
かどうかを確認することはできません。null
コード カバレッジが重要な場合は、次のフォームを使用してください。
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
if
ブロック内のネストされたステートメント、または展開されたステートメントx
またはy
述語からの暗黙的な分岐が存在する可能性があります。
これを読んでください: http://emma.sourceforge.net/faq.html#q.fractional.examples
コンパイラの暗黙の選択を回避して完全なカバレッジを得るには、次のように if ステートメントを 2 つに書き直す必要があります。
if (x) {
// do stuff
} else if (y) {
// do the same stuff
}
これは完全にカバーされますが、冗長コードとして正しくフラグ付けされます。この厄介な構造をコードに追加するよりも、問題が発生したら黄色の線を使用したいと思います。