統合テストを削除するのに十分な単体テストのカバレッジがあるかどうかを知るにはどうすればよいですか?


15

私はレガシーシステムで作業しています(つまり、テストなしで作成されたという意味です)。外部から機能をテストする統合テストを作成して、システムの一部をテストしようとしました。

これにより、コードの破損を心配することなく、コードの一部をリファクタリングする自信が得られます。しかし、問題は、これらの統合テストを実行するのに2分以上かかり、数分かかることです。また、それらは維持するのが苦痛です。それらはそれぞれ数千行のコードをカバーしており、そのうちの1つが壊れた場合、その理由をデバッグするのに1時間かかることがあります。

私は最近行ったこれらの機能変更のために多くの単体テストを書いてきましたが、コミットする前に常に新しいデプロイを行い、すべての統合テストを実行します。この時点で、ユニットテストと統合テストの一部がテスト内容と重複していることがわかりました。

統合テストを削除できるように、適切な単体テストが不適切な統合テストを適切にカバーしていることをどのようにして知ることができますか?

回答:


18

最も簡単なメトリックは、依頼することです「最後の時間は、この統合テストされたときに合法的に失敗しました?」統合テストが失敗してから長い時間が経過した(多くの変更があった)場合、ユニットテストはおそらく十分に機能しています。統合テストが最近失敗した場合は、単体テストで検出されなかった欠陥がありました。

私の好みは、一般的に、統合テストの堅牢性を、無人で確実に実行できる程度まで高めることです。実行に時間がかかる場合は、一晩実行します。たまにしか実行されない場合でも、それらは依然として貴重です。これらのテストが非常に脆弱であるか、手動での介入が必要な場合は、テストを実行し続けるのに時間を費やす価値がない場合があり、最も成功するテストを破棄することを検討できます。


3
テストを自動化することを推奨するための+1は、「なぜ自動化されたテストを強制終了するのか」という明白な質問につながるためです。

1
ええ、私はこれに同意します。もちろん、十分な単体テストのカバレッジがない場合でも、それでも噛みつきます。たとえば、現在、実行に約6時間かかる統合テストスイートがありますが、互換性を重視しているためにテストが削除されたことはないと思います
-Earlz

2
おそらくこれについて新しい質問を始める必要がありますが、統合テストが合法的に失敗するときはいつでも、失敗する単体テストを作成し、両方とも合格させる方法を見つけ出す必要があることを提案しますか?
ダニエルカプラン

2
@tieTYT:はい、それは絶対に良いアイデアのように聞こえます。単体テストは良いです。既に壊れていることがわかっているものの単体テストはさらに優れています。
グレッグヒューギル

7

単体テストはテストの聖杯ではありません。コードベースのテストに使用する必要のあるツールの1つにすぎません。したがって、他のテストに代わる安全性を考慮した単体テストはありません。統合テストに問題がある場合は、それを他の何かに置き換えるのではなく、適切な統合テストにするように作業する必要があります。これは、玄関を境界フェンスとゲートに置き換えるようなものです。


このプロジェクトがゼロから始まった場合、それは私にとってより理にかなっています。しかし、私の最初の統合テストは「ログインできることを確認する」ことであり、最終的には「ログインできることを確認する」多くの単体テストを作成しました。htmlを変更すると、統合テストは常にクラッシュします。この例は完全に考案されていますが、統合テストを削除するのに適した例ではありませんか?
ダニエルカプラン

3
@tieTYT:UIを介して何かをテストすると、多くの場合非常に不安定なソリューションになります。それでも、UIによるテストは重要です。手動テストでは、テストを自動化して安定性を維持しようとする場合よりも労力が少ない場合があります。そのため、ここでそうだと思う場合は、自動テストのリストからその「統合テスト」を削除し、手動テストのテスト計画に追加することができます。
ドックブラウン

@DanielKaplanは、統合テストをより安定するように更新することは可能でしょうか?それは、「ユーザ名がログインした後に、このdivの内側に表示されます」のようなHTMLが時々変化するので、その後、おそらくテスト何か「usernameはログイン後にページに表示されます」のようではなく、もっと何か具体的な失敗だ場合
ジェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.