自動テストに期待することはいくつかありますが、
この観点における期待外れの自動テストは2つ考えられます。失敗すべきでないときに失敗するテストと、失敗すべきときに失敗しないテストです。
失敗すべきでないときに失敗してしまうことを
4象限で整理する
偽陽性と偽陰性は4象限で整理すると理解しやすくなります。プロダクトコードの正しさ、自動テストの実行結果
プロダクトコードが→ ↓テスト結果が |
正しい | 誤っている |
---|---|---|
成功 | 期待どおり | 偽陰性 |
失敗 | 偽陽性 | 期待どおり |
偽陽性とは、プロダクトコードが正しいにもかかわらずテストが失敗してしまう状況です。偽陰性とは、プロダクトコードが誤っているにもかかわらずテストが成功してしまう状況です。これらは火災報知器をイメージするとわかりやすいでしょう。火が出ていないのに、火災報知器が鳴るなら誤検知
偽陽性その1:脆いテスト
偽陽性は、自動テストの世界で近年よく議論されるようになりました。代表的な偽陽性のパターンは2つあり、その1つ目が
偽陽性その2:信頼不能テスト
もう一つが
偽陰性その1:空振り
代表的な偽陰性のパターンは3つあり、その中でも最も単純なものが
偽陰性その2:カバレッジ不足
2つ目の代表的な偽陰性が
実装レベルのカバレッジ不足は、テスト対象のコードにテストから実行されないコード片がある状況です。たとえば、プロダクトコードの条件分岐に誤りがある場合に、その分岐を通るテストが書かれていなければ誤りの検知漏れが発生してしまいます。
仕様レベルのカバレッジ不足は、書かれるべきプロダクトコードが書かれておらず、そのコードに対するテストコードも存在しない状況です。たとえば、本来書かれるべき条件分岐が実装者の認識漏れにより書かれておらず、その実装者がテストの書き手でもある場合には、条件分岐をテストするコードも書かれていないでしょう。プロダクトコードが不足し、対応するテストコードも等しく不足しているので、皮肉にもテスト全体では成功してしまいます。
実装レベルのカバレッジ不足はテストカバレッジツールで可視化できますが、仕様レベルのカバレッジ不足はそもそもコードが書かれていないので可視化が難しく、偽陰性の中でも特に手強い相手です。
偽陰性その3:テスト対象ロジックのテストコードへの漏れ出し
3つ目の代表的な偽陰性が
実は、プロダクトコードの計算ロジックには誤りがあり、税額に1円未満の端数が発生しています
プロダクトコードが誤っているものの、それに対応するテストコードも等しく誤っているので、むしろテストは成功してしまうというパターンです。このパターンはさまざまな形でテストコードに現れるので注意が必要です。テストコードでは期待値を直接書くか
欠陥挿入:テストコードのテスト
発生がわかりやすい偽陽性と異なり、静かで気付きにくい偽陰性に立ち向かうには、成功しているテスト群を疑う姿勢が必要です。テストコードの質に不安があるのでテストコードのテストを行いたくなりますが、テストコードのテストコードを書いても際限がありません。テストコードのテストはプロダクトコードで行います。
具体的には、プロダクトコードに明らかな誤りを一時的に混入させ、その誤りをテストが検知できるかを確かめます。明らかな誤りを入れたのにテストが成功のままならば、偽陰性が発生しています。このような手法を欠陥挿入と言います。
おわりに
自動テストの偽陽性と偽陰性は、どちらも手強い問題です。偽陽性を放置すると、テストの失敗に対して鈍感になったり、テストが失敗しやすいためリファクタリングに後ろ向きになったりしてしまいます。偽陰性は、テストできていると思っていたらできていない、静かで恐ろしい問題です。まずは概念を正確に理解し、問題を認識できるようになることが上達への第一歩です。