Java 8が登場して以来、現在のJava用ツールによる条件付きコードカバレッジの測定は時代遅れではないのかと思っています。Javaの8のではOptional
とStream
私たちはしばしば、それが簡単にすべての可能な実行パスをテストすることなく、非常に高い条件カバレッジを取得することができますコード分岐/ループを回避することができます。古いJavaコードとJava 8コードを比較してみましょう。
Java 8より前:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
上記のメソッドには3つの実行パスがあります。条件付きカバレッジを100%取得するには、3つの単体テストを作成する必要があります。
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
この場合、ブランチは非表示になり、100%のカバレッジを得るために必要なテストは1つだけで、テストするケースは関係ありません。カバーすべき3つの論理ブランチはまだありますが、信じています。最近の条件付きカバレッジ統計は完全に信頼できないものになっていると思います。
Java 8コードの条件付きカバレッジを測定するのは理にかなっていますか?十分にテストされていないコードを発見する他のツールはありますか?
getName
何ですか?user
nullの場合、「不明」を返す必要があるようです。user
nullでなくnullの場合user.getName()
、「不明」を返す必要があります。user
がuser.getName()
nullではなく、nullではない場合、それを返す必要があります。それで、あなたはそれらの3つのケースをユニットテストするでしょう、なぜならそれが契約でgetName
あるからです。あなたはそれを逆方向にやっているようです。ブランチを見たり、それらに従ってテストを書いたり、契約に従ってテストを書いたり、契約が満たされていることを確認したくはありません。それはあなたが良いカバレッジを持っているときです。