カバレッジ100%にならない理由とは?

※当サイトではアフィリエイト広告を利用しています

djunitを使用し、カバレッジの試験を実施中のトラブル。

どう考えても処理を通過しているにも関わらず、カバレッジが100%にならない問題が発生しました。

カバレッジ100%にならない処理

該当する処理を簡単に書くと以下のような感じ。

カバレッジ100%にならないソースコードの例

public static void main(String[] args) {
    String a = null;
    while (true) {
        if (a == null) {
            break;
        }
    }
    System.out.println();
}

問題の箇所は5行目。
このbreakを通過していないと言われてしまった。

しかし、本当にこの5行目を実行していないのであれば、無限ループに陥っているハズである。
また、この5行目の前に、プリント出力の文を入れると、きちんと出力されるため間違いなく通過している。

カバレッジ100%にならない原因

調査したところ、どうやらコンパイラがコンパイルする際に最適化している関係で、ここの処理が書き変わってしまうようです。

確かに、ブレークポイントを止めてみても、5行目には止まらずにループを抜けています。
コンパイルしたclassファイルを逆コンパイルしても同じことが起きてしまいます。

どうしてもエビデンスとして100%という結果を残したいのであれば、breakの直前に何らかの処理をするしかないようです。
(例えば、最も低いレベルでログを出力するなど)
 

同様の事象

ちなみに、breakに限らず、continueやfinalyの場合でも同様の事象が発生するようです。

コメント