質問

プログラムの統合テストがすでに行われており、それらがすべて合格していれば、それはうまくいくと確信できます。では、単体テストを作成/追加する理由は何でしょうか?いずれにしても統合テストを作成する必要があるので、統合テストでカバーされない部分の単体テストのみを作成したいと思います。

私が知っている統合テストに対する単体テストの利点は次のとおりです。

  • 小さいので実行が速い(ただし、何かをテストするために新しいユニットを追加すると、統合テストによってすでにテストされているため、テストスーツ全体が大きくなり、実行時間が長くなります)
  • 1 つのことだけをテストするため、バグの特定が容易になります (ただし、統合テストが失敗した場合は、単体テストの作成を開始して個々の部分を検証できます)
  • 統合テストでは発見できない可能性のあるバグを発見します。例えばバグのマスキング/オフセット。(ただし、統合テストがすべてパスした場合、隠れたバグが存在してもプログラムは動作することを意味します。したがって、これらのバグを見つけて修正することは、将来の統合テストに支障をきたしたり、パフォーマンスの問題を引き起こしたりしない限り、それほど優先度は高くありません)

そして、私たちは常に書くコードを減らしたいと考えていますが、単体テストを書くには、より多くのコード (主にモック オブジェクトのセットアップ) が必要です。私の一部の単体テストと統合テストの違いは、単体テストではモック オブジェクトを使用し、統合テストでは実際のオブジェクトを使用することです。これには重複が多く、コードの動作を変更するためのオーバーヘッドが追加されるため、テストであっても重複したコードは好きではありません (リファクタリング ツールは常にすべての作業を実行できるわけではありません)。

役に立ちましたか?

解決

ユニットテストのための良い議論と反対の議論をしました。だからあなたは自分自身を尋ねなければなりません、 "否定的なものの費用を上回る肯定的な引数に値を見ますか?" 私は確かにしています:

  • 小型〜速は単体テストの素晴らしい側面ですが、いいえでは最も重要です。
  • ロケーション - バグ[s] - 非常に価値があります。プロのソフトウェア開発の多くの研究は、バグの費用が急上昇し、ソフトウェア配信パイプラインを停止しているので急上昇することを示しました。
  • 発見マスクバグは貴重です。特定のコンポーネントがすべての行動を検証していることがわかっている場合は、以前に使用されていない方法で、自信を持って使用できます。唯一の検証が統合テストを介している場合は、その current が正しく動作することを知っています。
  • モッキングは現実世界の訴訟で費用がかかり、嘲笑を維持することは二重になっています。実際、「興味深い」オブジェクトまたはインターフェイスをモック化するときは、モックオブジェクトが本物のオブジェクトを正しくモデル化することを確認するテストを必要とする可能性があります。

私の本では、長所は短所を上回ります。

他のヒント

既存の統合テストケースを未解決として再構築するのに大きな価値がありません。

統合テストは、実際のテスト対象の機能が厳密に結合されているため、隔離されているユニット(=非区切り)が散乱/高価/不可能になる可能性があるため、統合テストはしばしばはるかに簡単です。

> Then what are the reasons to write/add unit tests?
.

私の意見では、実際のコードの前に単位テストを書くと最も効果的です。このようにして、テストを満たすコードは、簡単なテスト可能な最小限の外部参照で明確に分離されます。

ユニットテストなしでコードがすでに存在する場合は、通常テストが簡単なテストのために書かれていないため、通常は単体テストを書き込むための追加の作業がたくさんあります。

あなたが自動的にコードをテスト可能なものであることが簡単です。

統合テストは、期待どおりに複数のコンポーネントが協力していることを確認するだけです。個々のコンポーネントのロジックが正確であるかどうかは単体テストによって検証されるべきです。
ほとんどのメソッドにはいくつかの実行パスがあります。if-then-hereの入力変数を予期せぬ、または単に間違った値などで考えてください。通常、開発者は幸せな道についてのみ考える傾向があります。しかし、他のパスに関する限り、あなたは2つのオプションを持っています。その他のパスの動作と必要に応じて行動を起こす。

質問で指摘した理由のいくつかは非常に重要であり、それ自体で単体テストを支持する根拠となる可能性が非常に高いですが、YMMV。たとえば、統合テスト スイートをどのくらいの頻度で実行しますか?統合テストに関する私の経験では、遅かれ早かれテストは非常に遅くなり、変更を加えるたびに実行できなくなり、挿入してからバグを検出するまでの時間が長くなります。

また、あなたが犯すかもしれない大きな間違いは、次のことを信じてしまうことです。

Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.

重要ではありません。ユーザーがバグを見つけてくれることを期待していますか?私の考えでは、統合テストから得られたカバレッジを信頼するのは危険です。簡単に高い割合のカバレッジを得ることができますが、実際にはほとんどテストしていません。

統合テストに対する正規の参照は、JBrains の投稿だと思います。

http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1

まだ読んでいない方のために。

最後に、私の意見では、設計の単体テストから得られるフィードバックは非常に貴重です。直感で設計を判断し、統合テストに依存することも間違いである可能性があります。

コードを変更またはリファクションする必要がある場合は、ユニットテストが不可欠です。単位テストは、コードが書き込まれる時点でバグを示すだけでなく、より多くのコードが書き込まれたときに新しいバグが表示されたときに表示されます。

はい、統合と単体テストを最初に書くことがはるかに良いですが、後で書かれていてもそれらを持つことには多くの価値があります。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top