私のチーム内での最近の議論は私を不思議に思いました。基本的なトピックは、機能/統合テストでいくら、何をカバーするかということです(確かに、それらは同じではありませんが、例は重要ではないのでダミーです)。
次のような「コントローラ」クラスがあるとします。
public class SomeController {
@Autowired Validator val;
@Autowired DataAccess da;
@Autowired SomeTransformer tr;
@Autowired Calculator calc;
public boolean doCheck(Input input) {
if (val.validate(input)) {
return false;
}
List<Stuff> stuffs = da.loadStuffs(input);
if (stuffs.isEmpty()) {
return false;
}
BusinessStuff businessStuff = tr.transform(stuffs);
if (null == businessStuff) {
return false;
}
return calc.check(businessStuff);
}
}
確かに多くの単体テストが必要です(たとえば、検証が失敗した場合、またはDBにデータがない場合など)、それは問題外です。
私たちの主な問題と私たちが同意できないことについては、どれだけの統合テストがそれをカバーするかということです:-)
統合テスト(テストピラミッド)を減らすことを目指します。私がこれからカバーするのは、実行が最後の行から戻る単一の幸福不幸のパスだけです。これらをまとめて爆発しないかどうかを確認するためだけです。
問題は、テスト結果がfalseになった理由を簡単に判断できないことであり、それによって一部の人はそれについて不安を感じます(たとえば、単に戻り値のみをチェックする場合、テストが緑色であることが隠されています)誰かが検証を変更してfalseを返したためです)。もちろん、そうです、すべてのケースをカバーできますが、それは重いやりすぎです。
誰かがこの種の問題について良い経験則を持っていますか?または推奨ですか?読む?トーク?ブログ投稿?トピックについて何か?
よろしくお願いします!
PS:醜い例を試してみてください。ただし、特定のコード部分を例に変換するのは非常に困難です。ええ、例外を投げる/別の戻り値の型を使用するなどについて議論することができます。しかし、私たちの手は、外部の依存関係のため、多かれ少なかれ拘束されています。
PS2:このトピックをSOからここに移動しました(元の質問、保留中としてマーク)