不足しているブランチを簡単に確認する方法はありますか?つまりこのようなコードがいくつかあります:
if (x || y) {
// do stuff
}
強調表示されているカバレッジには、Eclipseに次のような黄色の点があります。
4つのブランチのうち1つが欠落しています
しかし、どのブランチが欠落しているかを知りたいです。
未解決の問題 Eclemmaの親のgithubリポジトリにある jacoco は、このような機能を実際に組み込むのが少し難しいことを示唆しています。
ただし、Eclemma機能がなくても、特定のケースで失敗したブランチを見つけることが目的であれば、コードをインスツルメントして追跡することができます。最も単純な例は、昔ながらの印刷ステートメントです。
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
次に、出力を見て、実際にヒットしたブランチを確認します(例:Java ... | grep "BRANCH:" | sort | uniq
)。 (ひどく満足していない、私は知っている。)
x
とy
はどうなりますか?
true || true
はtrue(JVM最適化のためカバーされません:最初の条件がtrue
の場合、2番目は短絡評価のため評価されません)false || true
はtrueですtrue || false
はtrueですfalse || false
はfalseです答えはtrue|| true
はカバーされていません。
これは、JVMが最初の条件がtrueであると判断すると、2番目の条件は実行されない(最適化される)ため、コードの一部が実行されないためです。
Marounが言ったように、4つのブランチのうち3つが条件を通過させます。それでもコードカバレッジが心配な場合は、&&
ではなく||
になるように条件をリファクタリングできます。
(x || y)
は(!(!x && !y))
と同じです。これにより、現在3つのブランチしかないため、すべての条件をテストできます。
条件文の元の形式は、ガードステートメントでよく見られます。
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
これにより、obj
がnull
であるかどうかを確認できず、Nullポインタ例外がスローされるためエラーが発生します。
コードカバレッジが重要な場合は、次のフォームを使用します。
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
非常に簡単なワーカラウンドがあります-ちょうど各論理述語を別々の行に置く、このように:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
これで、analisysを実行するときに、マーカーは欠落しているブランチを直接ポイントするはずです。隠蔽した後、コードを正しい方法で再フォーマットできます。
HTH
以下の式の結果はどうなりますか?
true || true
はtrueですtrue || false
はtrueですfalse || true
はtrueですfalse || false
はfalseです[〜#〜] true [〜#〜]のように1番目のパラメーターがある場合、1番目と2番目のケースに気づいた場合、2番目のパラメーターをチェックする必要はありません。
true && true
はtrueですtrue && false
はfalseですfalse && true
はfalseですfalse && false
はfalseですまたは、[〜#〜] and [〜#〜]演算子を使用したシナリオを見る場合、最初のパラメーターが[〜#〜] false [〜#〜]の場合2番目のパラメーターを確認する必要があります。
したがって、4つのブランチのうち1つのブランチをチェックすることはできません。
if
ブロック内のネストされたステートメント、またはx
またはy
述語を展開するステートメントからの暗黙的な分岐が存在する可能性があります。
これを読んでください: http://emma.sourceforge.net/faq.html#q.fractional.examples