web-dev-qa-db-ja.com

Eclemmaは4つのブランチのうち1つはカバーされていないと言いますが、どのブランチですか?

不足しているブランチを簡単に確認する方法はありますか?つまりこのようなコードがいくつかあります:

if (x || y) {
    // do stuff
}

強調表示されているカバレッジには、Eclipseに次のような黄色の点があります。

4つのブランチのうち1つが欠落しています

しかし、どのブランチが欠落しているかを知りたいです。

22
tor

未解決の問題 Eclemmaの親のgithubリポジトリにある jacoco は、このような機能を実際に組み込むのが少し難しいことを示唆しています。

ただし、Eclemma機能がなくても、特定のケースで失敗したブランチを見つけることが目的であれば、コードをインスツルメントして追跡することができます。最も単純な例は、昔ながらの印刷ステートメントです。

if (x || y) {
    System.out.println("BRANCH: " + x + ", " + y);
    // Do stuff
}

次に、出力を見て、実際にヒットしたブランチを確認します(例:Java ... | grep "BRANCH:" | sort | uniq)。 (ひどく満足していない、私は知っている。)

9
user3780389

xyはどうなりますか?

  • true || truetrue(JVM最適化のためカバーされません:最初の条件がtrueの場合、2番目は短絡評価のため評価されません)
  • false || truetrueです
  • true || falsetrueです
  • false || falsefalseです
17
Maroun

答えはtrue|| trueはカバーされていません。

これは、JVMが最初の条件がtrueであると判断すると、2番目の条件は実行されない(最適化される)ため、コードの一部が実行されないためです。

Marounが言ったように、4つのブランチのうち3つが条件を通過させます。それでもコードカバレッジが心配な場合は、&&ではなく||になるように条件をリファクタリングできます。

(x || y)(!(!x && !y))と同じです。これにより、現在3つのブランチしかないため、すべての条件をテストできます。

条件文の元の形式は、ガードステートメントでよく見られます。

if (obj == null || obj.hasError())
{
    throw new RuntimeException();
}

これにより、objnullであるかどうかを確認できず、Nullポインタ例外がスローされるためエラーが発生します。

コードカバレッジが重要な場合は、次のフォームを使用します。

if (!(obj != null && !obj.hasError()))
{
    throw new RuntimeException();
}
5
Brett Pyke

非常に簡単なワーカラウンドがあります-ちょうど各論理述語を別々の行に置く、このように:

if (x 
    || y) {
    System.out.println("BRANCH: " + x + ", " + y);
    // Do stuff
}

これで、analisysを実行するときに、マーカーは欠落しているブランチを直接ポイントするはずです。隠蔽した後、コードを正しい方法で再フォーマットできます。

HTH

4
Bolesław Denk

以下の式の結果はどうなりますか?

  • true || truetrueです
  • true || falsetrueです
  • false || truetrueです
  • false || falsefalseです

[〜#〜] true [〜#〜]のように1番目のパラメーターがある場合、1番目と2番目のケースに気づいた場合、2番目のパラメーターをチェックする必要はありません。

  • true && truetrueです
  • true && falsefalseです
  • false && truefalseです
  • false && falsefalseです

または、[〜#〜] and [〜#〜]演算子を使用したシナリオを見る場合、最初のパラメーターが[〜#〜] false [〜#〜]の場合2番目のパラメーターを確認する必要があります。

したがって、4つのブランチのうち1つのブランチをチェックすることはできません。

0
Anshul Dhyani

ifブロック内のネストされたステートメント、またはxまたはy述語を展開するステートメントからの暗黙的な分岐が存在する可能性があります。

これを読んでください: http://emma.sourceforge.net/faq.html#q.fractional.examples

0
Tim Bender