26

欠落しているブランチを簡単に確認する方法はありますか? つまり、次のようなコードがあります。

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

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

4 つのブランチのうちの 1 つが見落とされました

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

4

7 に答える 7

16

何をすることができxますyか?

  • true || truetrue (JVM の最適化のため対象外: 最初の条件が の場合、true短絡評価のため 2 番目の条件は評価されません)
  • false || true本当です
  • true || false本当です
  • false || falseです
于 2013-03-19T06:55:14.523 に答える
12

Eclemmaの親である jacoco の github リポジトリに関する未解決の問題、そのような機能を実際に含めるのは少し難しいことを示唆しています。

ただし、Eclemma 機能がなくても、特定のケースで見逃されたブランチを特定することが目標である場合は、コードを計測して追跡することができます。最も単純な例は、昔ながらの print ステートメントです。

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

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

于 2016-05-11T16:50:51.827 に答える
5

答えは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();
}
于 2013-11-12T04:05:43.647 に答える
0

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

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

于 2013-03-19T08:02:55.230 に答える
-1

コンパイラの暗黙の選択を回避して完全なカバレッジを得るには、次のように if ステートメントを 2 つに書き直す必要があります。

if (x) {
    // do stuff
} else if (y) {
    // do the same stuff
}

これは完全にカバーされますが、冗長コードとして正しくフラグ付けされます。この厄介な構造をコードに追加するよりも、問題が発生したら黄色の線を使用したいと思います。

于 2020-12-02T01:27:59.590 に答える