統合テストは設計をどのように批判しますか?


38

統合テストに関するJB Rainsbergerのブログ投稿を読んでいますが、どのように統合テストが私たちの設計により厳しいのでしょうか?

より統合されたテストを作成します。これはより大きく、マイクロテストのように設計を厳しく批判しません。


3
質問は紛らわしいです。「どのようにして統合テストはより厳しい」...「統合テストは、より大きく、設計を厳しいと批判しない」-今は何ですか?
-AnoE

5
関連するメタの質問:この$ {blog}
アモン

「統合テスト」!=「統合テスト」。知っている。私もそれが好きではありませんが、それはそれらの言葉が意味するものです。「統合テスト」=「統合ポイントをチェックする(物を統合しない)テスト」、「統合テスト」=「物を統合し、統合された全体を単一のものとしてチェックする(より大きな)テスト」このように、これらの用語は互いに反対になります。
JBレインズ

回答:


46

マイクロテストは、優れた設計につながる可能性があります。適切な小さなテストを作成することにより、少量のコードを意図的にテストし、そのギャップをモックオブジェクトで埋めることになります。これは、低いカップリング(相互に依存しないもの)と高い凝集性(一緒に属するものが一緒に留まる)につながります。そうすれば、戻って変更を加えたときに、探しているものの原因を簡単に見つけることができ、変更を加える際に物事を壊す可能性が低くなります。これですべてのデザインが解決されるわけではありませんが、役立ちます。

これに関連して、JB Rainsbergerは、ユニットテストの作成が難しい場合、デザインに問題が発生している可能性が高く、テストが暗黙的にデザインを批判していることに気付いています。彼は、これは良いことだと仮定します。小さなテストがなければ、アーキテクチャを維持するのに役立つため、統合されたテストでは捕捉できない優れたデザインパターンから簡単に外れてしまうからです。

更新:Rainsbergerが以下で述べているように、彼はマイクロテストを単体テストと同義語にするつもりはありませんでした。彼はまた、詳細な回答を提供してくれたので、彼が正確に伝えていたことについてより深い洞察を得ることができます。


2
私は原則としてあなたの答えに同意しますが、あなたがそれを明確にする方法には同意しません。この特定の質問をしている人は、「m笑」、「結合」、「結束」という用語が何を意味するのかわからない可能性が高く、回答でそれらの用語を定義していません。
ロバートハーベイ

3
それは良いことですが、あなたはユニットテストが実際にそうだと思うよりも多くのクレジットを与えています。単体テストは、主にコードのテスト容易性を通知します。コードを自動的にテスト可能にすることで、結束性と結合性が向上するかどうかは明確ではありませんが、確かにプラスの影響があります。また、「単一の責任原則」と混同された「高い結束力」を得たと思います。凝集とは、「一緒に属するもの」を意味します(Wikipediaの記事を参照)。
ロバートハーヴェイ

10
最後に、「マイクロテスト」は優先語ではありません。ブロガーが自分の専門用語を作成するとき、私はそれが大好きです。
ロバートハーヴェイ


5
「マイクロテスト」と「ユニットテスト」を同一視しないでください(詳細については私の回答をご覧ください)。そうでなければ、私が説明しようとしたことを理解したように感じます。
JBレインズ

28

非常に短いバージョン:システムの小さな部分を実行するため、テストが小さくなり、プログラマーが書くことができる内容が自然に制約されるため、シャープな(気付きやすく、無視しにくい)フィードバックの機会が生まれます。これは必ずしもデザインの改善につながるとは限りませんが、代わりに、デザインリスクに早く気付く機会を作り出します。

まず、明確にするために、「マイクロテスト」と言うときは「小さなテスト」を意味し、それ以上のことは意味しません。「ユニットテスト」を意味しないので、この用語を使用します。「ユニット」を構成するものについての議論に巻き込まれたくありません。私は気にしません(少なくともここ/今はそうではありません)。2人は「ユニット」よりも「スモール」の方が簡単に同意するでしょう。そのため、このアイデアの新しい標準用語として「マイクロテスト」を採用することにしました。

「アクション」部分でシステムのより大きな部分を実行するテストを意味するより大きなテストは、より小さなテストほど明確にも完全にも設計を批判しない傾向があります。テストの特定のグループに合格できるすべてのコードベースのセットを想像してください。つまり、コードを再編成でき、それでもそれらのテストに合格することを意味します。大規模なテストでは、このセットは大きくなります。小規模なテストの場合、このセットは小さくなります。別の言い方をすれば、テストが小さいほどデザインの制約が大きくなるため、デザインが少ないほど合格になります。このようにして、マイクロテストは設計をさらに批判することができます。

「もっと厳しく」と言うのは、聞きたくないが聞きたいことを直接伝え、他の人が不快に感じるかもしれない方法で緊急性を伝えるためにあなたに怒鳴る友人のイメージを思い起こさせるためです。やっています。一方、統合されたテストは静かであり、主に問題に対処する時間もエネルギーもなくなったときにのみ問題を示唆します。統合されたテストでは、敷物の下で設計上の問題を簡単に一掃することができます。

より大きなテスト(統合テストなど)では、プログラマーはだらしないことで問題を抱える傾向があります:何らかの方法でテストに合格する複雑なコードを書く自由がありますが、そのコードの理解は次のタスクに進むとすぐに消えてしまいます、および他の人はもつれたデザインを過度に読むのが困難です。ここに統合テストに依存するリスクがあります。小規模なテスト(マイクロテストなど)の場合、プログラマは主に過剰な仕様によって問題に直面する傾向があります。通常、以前のテストからのコピー/貼り付けなど、無関係な詳細を追加することでテストに過剰な制約を課します。隅に。良いニュース:書いてから数時間から数日でテストから余分な詳細を削除するほうが、書いてから数か月から数年、絡み合った量産コードを分解するよりもはるかに簡単で安全です。間違いが起こると、過剰指定はより明白な損傷をより迅速に行い、アラートプログラマーは物事を修正する必要があることを以前に認識します。私はこれを長所と考えています。問題を早期に発見し、それらの問題が機能を追加する能力を絞る前に修正します。


単体テストが実際のコードよりもモックに依存しているという問題について、あなたは何をしますか?
ザンリンクス

@ZanLynxこれについては長々と書きました。ここから開始:blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger

9

彼は、優れたソフトウェア設計は、統合テストよりも単体テストでよりよく知らされることを意味します。

その理由は次のとおりです。単体テストを作成すると、単体テスト可能なコードを作成する必要があります。単体テスト可能なコードは、単体テストを持たないコードよりも優れた設計になる傾向があります。

統合テストでは、ソフトウェアを相互に接続する内部インターフェイスではなく、ソフトウェアの外部層をテストしているだけなので、コードに同じ方法で通知することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.