(データベース)統合テストは悪いですか?


120

一部の人々は、統合テストはすべての種類の悪い点と間違っていると主張しています -すべてを単体テストする必要があります。さまざまな理由で、私は常に好きではないオプション。

場合によっては、単体テストでは何も証明されないことがわかります。

例として、次の(PHPでの)単純な(単純な)リポジトリー実装を取り上げましょう。

class ProductRepository
{
    private $db;

    public function __construct(ConnectionInterface $db) {
        $this->db = $db;
    }

    public function findByKeyword($keyword) {
        // this might have a query builder, keyword processing, etc. - this is
        // a totally naive example just to illustrate the DB dependency, mkay?

        return $this->db->fetch("SELECT * FROM products p"
            . " WHERE p.name LIKE :keyword", ['keyword' => $keyword]);
    }
}

このリポジトリが実際にさまざまなキーワードに一致する製品を見つけることができることをテストで証明したいとしましょう。

実際の接続オブジェクトとの統合テスト以外では、これが実際に実際のクエリを生成していること、およびそれらのクエリが実際に私が思っていることを実際に行うことをどのように知ることができますか?

単体テストで接続オブジェクトをモックする必要がある場合、「期待されるクエリを生成する」などのことしか証明できませんが、実際に動作するという意味ではありません...つまり、クエリを生成している可能性があります私は期待していましたが、おそらくそのクエリは、私が思うように動作しません。

言い換えれば、生成されたクエリについてアサーションを行うテストは、findByKeyword()メソッドの実装方法をテストしているため、本質的に価値がないと感じていますが、実際に動作することを証明していません。

この問題はリポジトリやデータベース統合に限定されません-多くの場合に当てはまるようです。モック(test-double)の使用についてアサーションを行うと物事の実装方法が証明されるだけで、実際に動作します。

このような状況にどのように対処しますか?

このような場合、統合テストは本当に「悪い」のですか?

私は1つのことをテストする方が良いという点を理解し、統合テストが無数のコードパスにつながる理由を理解しますが、そのすべてをテストすることはできません-しかし、唯一の目的があるサービス(リポジトリなど)の場合別のコンポーネントと対話するために、統合テストなしで実際に何かをテストするにはどうすればよいですか?


5
agitar.com/downloads/TheWayOfTestivus.pdf、特に6ページの「テストはユニットよりも重要です」をお読みください。
ドックブラウン

2
@ user61852それは説明で「ナイーブ」と言っています、はい?
mindplay.dk

4
あなたの同僚は、彼のモックされたデータベースが本物として振る舞うことをどのように絶対に確信しますか?
するThorbjörnRavnアンデルセン

12
あなたは現実的になろうとしています。同僚はルールを順守しようとしています。常に価値生み出すテストを書く。メンテナンス不能なテストを書くのに時間を無駄にしないでください。また、次のいずれかを行わないテストを書いてはいけません。
jpmc26

3
@ mindplay.dk:その段落のキーセンテンスは、「しかし、ドグマにはまり込まないでください。書く必要があるテストを書いてください。」あなたの同僚はドグマに引っかかっているようです。そして、あなたは誰かを必要としません。あなたはすでにそれを知っているあなたのデータベースにクエリを理解している場合、テストのために、あなたはに対してクエリを実行しなければならないことはかなり明白である- 。テストはあなたの例で書かれる必要があることを何であるかを説明する実際のデータベースを-何のモックはあなたを伝えることはできませんこれ。
ドク・ブラウン

回答:


129

同僚は、単体テストできるすべてのものを単体テストする必要があることは間違いありません。特に複雑な外部サービスの単純なラッパーを作成する場合は、単体テストでこれまでのところ、それ以上のことは必要ありません。

テストについての一般的な考え方は、テストピラミッドとしてです。これは頻繁にアジャイルと結びついた概念であり、多くの人がそれについて書いており、Martin Fowlerアジャイルの成功で Mike Cohnに帰する)、Alistair ScottGoogle Testing Blogなどがあります。

        /\                           --------------
       /  \        UI / End-to-End    \          /
      /----\                           \--------/
     /      \     Integration/System    \      /
    /--------\                           \----/
   /          \          Unit             \  /
  --------------                           \/
  Pyramid (good)                   Ice cream cone (bad)

概念は、高速で回復力のある単体テストがテストプロセスの基盤であるということです。システム/統合テストよりも焦点を絞った単体テストが必要であり、エンドツーエンドテストよりも多くのシステム/統合テストが必要です。頂点に近づくにつれて、テストの実行に時間がかかる傾向があり、脆弱性やフレークネスの影響を受けやすくなり、どのシステムまたはファイルが壊れているかを特定するのにそれほど具体的ではありません。当然、「トップヘビー」であることを避けることが望ましいです。

その点までは、統合テストは悪くありません、それらに強く依存していることは、テストしやすいように個々のコンポーネントを設計していないことを示している可能性があります。覚えておいて、ここでの目標は、他の最小限の壊れやすいシステムを使用しながら、ユニットが仕様どおりに動作していることをテストすることです。 )たとえば、ヘビーエッジケーステストの場合は、実際のデータベースエンジンを使用していくつかの統合テストを記述し、システムの組み立て時にメインケースが機能することを確認します。


サイドノートとして、あなたが書いたモックは、それが機能するかどうかではなく、単に実装方法をテストするだけだと述べました。それはアンチパターンのようなものです。実装の完全なミラーであるテストは、実際には何もテストしていません。代わりに、必要な抽象化またはリアリズムのレベルにかかわらず、すべてのクラスまたはメソッドが独自の仕様に従って動作することをテストします。


13
「実装の完全なミラーであるテストは、実際には何もテストしていません」の+1 あまりにも一般的です。これをDoppelganger Antipatternと呼びます。
dodgethesteamroller

6
コンテキスト駆動型のテスト運動であるソフトウェアQAの逆流派は、テストピラミッドのような有用な一般的な経験則が存在するかどうかの論争に部分的に専念しています。特に、運動の独創的な テキストは、統合テストが他の種類のテストよりもはるかに価値がある多くの例を示しています(システムとしてのコンテキストでシステムをテストするため)....
dodgethesteamroller

7
...その結果、Fowler et al。は、統合テストとユーザー受け入れテストに労力をかける必要が少ないと主張しており、堅牢で保守可能な方法で記述するのが難しすぎるため、実際に事後の言い訳を提供しています彼らはより高いレベルでうまくテストする方法を理解しいません。
-dodgethesteamroller

1
@dodgethesteamrollerそのような「反対派の学校」の詳細な議論は、おそらく彼ら自身の答えに最も適しています。個人的には、Googleテストブログは、コンテキスト内システムテストと共に、高速で厳密にスコープされた自動テストの長所を説明する非常に良い仕事をしていると思います。不明な場合は、テストピラミッドを、エンジニアとして考えるのをやめる口実としてではなく、有用なモデルまたは開始点としてここにリストします。
ジェフボウマン

1
ユニットテストと統合テストの階層および比率に関する強く推奨されるプレゼンテーション:vimeo.com/80533536非常によく説明されています。
-szalski

88

私の同僚の一人は、統合テストはあらゆる種類の悪い点と間違っていると主張しています。すべてを単体テストする必要があり、

それは抗生物質が悪いと言うことに少し似ています-すべてはビタミンで治されるべきです。

単体テストすべてをキャッチすることはできません -コンポーネントが制御された環境でどのように機能するかをテストするだけです。統合テストは、すべてが一緒に機能することを確認します。

優れた包括的なテストプロセスでは、両方のタイプのテストを使用ます。ユニットテストは、ビジネスルールなど、独立してテストできるものを検証し、統合テストはすべてが正常に機能することを確認します。

実際の接続オブジェクトとの統合テスト以外では、これが実際に実際のクエリを生成していること、およびそれらのクエリが実際に私が思っていることを実際に行うことをどのように知ることができますか?

あなたは可能性がありユニットは、それをテストし、データベースレベルで。さまざまなパラメーターを使用してクエリを実行し、期待する結果が得られるかどうかを確認します。確かに、変更をコピーして「true」コードに貼り付けることを意味します。しかし、それはないあなたが他の依存関係のクエリの独立をテストすることができます。


データベースに特定のデータが含まれているかどうかをテストしませんか?
Tulainsコルドバ

おそらく-ただし、フィルター、複雑な結合などが機能することをテストすることもできます。クエリの例は、おそらく「単体テスト」の最良の候補ではありませんが、複雑な結合や集約を伴うものはそうなる可能性があります。
Dスタンレー

はい-指摘したように、私が使用した例は簡単です。実際のリポジトリには、クエリビルダーなどを使用して、あらゆる種類の複雑な検索および並べ替えオプションを設定できます。
mindplay.dk15年

2
良い答えですが、ユニットテストが高速であることを確認するために、DBはメモリ内にある必要があると付け加えます。
BЈовић

3
@BЈовић:残念ながら、残念ながら2つの互換性のあるDBが存在せず、すべてがメモリ内で動作するわけではないため、それは常に可能とは限りません。また、(あなたが任意のマシン上でそれを実行するためのライセンスを持っていない可能性があります)、商業のDBのための問題がライセンスしている...
マシューM.

17

単体テストはすべての欠陥を検出するわけではありません。しかし、他の種類のテストに比べて、セットアップと(再)実行が安価です。単体テストは、中程度の値と低から中程度のコストの組み合わせによって正当化されます。

さまざまな種類のテストの欠陥検出率を示す表を次に示します。

ここに画像の説明を入力してください

ソース:完全なコード2のp.470マッコネル


5
そのデータは1986年に収集されました。それは30年前です。1986年の単体テストは、今日のようなものではありませんでした。このデータには懐疑的です。言うまでもなく、単体テストではバグがコミットされる前に検出されるため、バグが報告されるかどうかは疑わしいです。
ラバーダック

3
@RubberDuckこのチャートは2006年の本からのもので、1986年、1996年、2002年のデータに基づいています(注意深く見ると)。ソースのデータ収集プロトコルについては調べていませんが、いつ欠陥を追跡し始めたのか、どのように報告されたのかはわかりません。このチャートは多少古くなっているでしょうか?出来た。昨年12月、私はセミナーに参加しました。インストラクターは、統合テストではユニットテストよりも多くのバグを発見すると述べました(2倍、iirc)。このチャートは、それらがほぼ同じであることを示しています。
ニックアレクセエフ

13

いいえ、悪くありません。 単体テストと統合テストが必要です。これらは開発サイクルのさまざまな段階で使用および実行されます。

単体テスト

ユニットテストは、コードがコンパイルされた後、ビルドサーバーでローカルに実行する必要があります。単体テストが失敗した場合、ビルドが失敗するか、テストが修正されるまでコード更新をコミットしないでください。ユニットテストを分離する理由は、ビルドサーバーですべてのテストをすべての依存関係なしで実行できるようにするためです。次に、複雑な依存関係をすべて必要とせずにビルドを実行し、非常に高速に実行される多くのテストを実行できます。

したがって、データベースの場合、次のようなものが必要です。

IRespository

List<Product> GetProducts<String Size, String Color);

IRepositoryの実際の実装はデータベースにアクセスして製品を取得しますが、単体テストでは、IRepositoryを偽物とモックして、必要に応じてすべてのテストを実行できます。模擬インスタンスから返され、模擬データを使用してビジネスロジックをテストします。

統合テスト

統合テストは通常​​、境界交差テストです。これらのテストは、展開サーバー(実際の環境)、サンドボックス、またはローカル(サンドボックスを指す)でも実行します。ビルドサーバーでは実行されません。ソフトウェアが環境に展開された後、通常、これらは展開後のアクティビティとして実行されます。コマンドラインユーティリティを使用して自動化できます。たとえば、呼び出す統合テストをすべて分類した場合、コマンドラインからnUnitを実行できます。これらは、実際のデータベース呼び出しで実際のリポジトリを実際に呼び出します。これらのタイプのテストは、次のことに役立ちます。

  • 環境の健康安定性の準備
  • 本物のテスト

これらのテストは、セットアップや解体が必要になる場合があるため、実行が難しい場合があります。製品の追加を検討してください。製品を追加し、クエリを実行して追加されたかどうかを確認し、完了したら削除することをお勧めします。100個または1000個の「統合」製品を追加したくないので、追加のセットアップが必要です。

統合テストは、環境を検証し、本物が機能することを確認するために非常に価値があることがわかります。

両方が必要です。

  • ビルドごとに単体テストを実行します。
  • すべての展開に対して統合テストを実行します。

コミットしてプッシュするのではなく、ビルドごとに統合テストを実行することをお勧めします。どれくらい時間がかかるかによって異なりますが、多くの理由で高速に保つこともお勧めします。
artbristol

@ArtBristol-通常、ビルドサーバーには完全な環境依存関係が構成されていないため、そこで統合テストを実行することはできません。ただし、そこで統合テストを実行できる場合は、実行してください。ビルド後に展開サンドボックスを設定し、統合テストで展開を検証します。しかし、それぞれの状況は異なります。
ジョンレイナー

11

データベース統合テストは悪くありません。さらに、それらは必要です。

おそらくアプリケーションをレイヤーに分割しているので、それは良いことです。隣接するレイヤーをモックすることで、各レイヤーを分離してテストできますが、これも良いことです。ただし、作成する抽象化レイヤーの数に関係なく、ある時点で汚い作業を行うレイヤーが必要になります。実際にはデータベースと通信します。テストしない限り、まったくテストしません。あなたは層テストする場合のnの層からかうことにより、N-1を、あなたは層との仮定を評価され、nが働くことを条件に、のn-1は、作品を。これが機能するためには、レイヤー0が機能していることを何らかの形で証明する必要があります。

理論的には、生成されたSQLを解析および解釈することでデータベースを単体テストできますが、その場でテストデータベースを作成して対話する方がはるかに簡単で信頼性が高くなります。

結論

最終的に生成されたSQLに構文エラーが含まれる場合、Abstract RepositoryEthereal Object-Relational-MapperGeneric Active RecordTheoretic Persistenceレイヤーのユニットテストから得られる自信は何ですか?


私はあなたに似た返信を追加することを考えていましたが、あなたはそれをより良く言っています!私の経験では、データを取得して保存するレイヤーでいくつかのテストを行ったことで、多くの悲しみが軽減されました。
ダニエルホリンレイク

ただし、データベース統合テストは悪いです。ci / cd行でデータベースを使用できますか?それは私にはかなり複雑に思えます。データベースを模倣し、それを使用する抽象化レイヤーを構築する方がはるかに簡単です。それははるかにエレガントなソリューションであるだけでなく、可能な限り高速です。単体テストは高速である必要があります。データベースをテストすると、ユニットテストの速度が許容できないレベルまで大幅に低下します。ユニットテストは、数千台ある場合でも、10分以上かかることはありません。
デビッド

@David ci / cd行にデータベースがありますか?確かに、それはだかなり 標準 機能。ところで、私は単体テストの代わりに統合テストを提唱していません-単体テストと組み合わせて統合テスト提唱しています。高速な単体テストは不可欠ですが、データベースは複雑すぎて、相互作用を模擬した単体テストに依存できません。
el.pescado

@ el.pescado私は反対しなければなりません。データベース通信が抽象化レイヤーの背後にある場合、モックするのは本当に簡単です。どのオブジェクトを返すかを決めることができます。また、何かが標準であるという事実は、それを良いことにはしません。
デビッド

@Davidデータベースにどのようにアプローチするかによります。それはシステムの実装の詳細または重要な部分ですか?(私は後者に傾いています)。データベースをデータのダムストレージとして扱う場合は、はい、統合テストなしで行うことができます。ただし、データベースにロジックがある場合-制約、トリガー、外部キー、トランザクション、またはデータレイヤーがプレーンORMメソッドの代わりにカスタムSQLを使用する場合、単体テストだけでは十分ではないと感じます。
el.pescado

6

両方が必要です。

あなたの例では、特定の条件でデータベースをテストしている場合、findByKeywordメソッドが実行されたときにデータを取得すると、これは素晴らしい統合テストです。

そのfindByKeywordメソッドを使用している他のコードでは、テストにフィードされるものを制御したいので、テストにヌルまたは正しい単語を返すことができます。受信(およびデータベースに接続し、その中のデータが正しいことを確認するオーバーヘッドがなくなります)


6

参照するブログ記事の著者は、主に統合テストから生じる可能性のある複雑性に関心を持っています(ただし、非常に思慮深くカテゴリ別の方法で記述されています)。ただし、統合テストは必ずしも悪いわけではなく、実際には純粋な単体テストよりも便利なものもあります。それは実際にアプリケーションのコンテキストとテストしようとしているものに依存します。

データベースサーバーがダウンした場合、今日の多くのアプリケーションはまったく動作しません。少なくとも、テストしようとしている機能のコンテキストで考えてください。

一方では、テストしようとしているものがデータベースに依存していないか、まったく依存しないようにできる場合は、テストを使用しないようにテストを記述します。データベース(必要に応じてモックデータを提供します)。たとえば、Webページを提供するときに認証ロジックをテストしようとしている場合(たとえば)、DBから完全に切り離すことはおそらく良いことです(認証にDBに依存していない場合、または合理的に簡単にモックできます)。

一方、データベースに直接依存する機能であり、データベースが利用できない場合、実際の環境ではまったく機能しない場合は、DBクライアントコードでDBが実行することをモックします(つまり、それを使用するレイヤーDB)は必ずしも意味をなさない。

たとえば、アプリケーションがデータベース(および場合によっては特定のデータベースシステム)に依存することがわかっている場合、そのためにデータベースの動作をモックすることは、多くの場合時間の無駄になります。データベースエンジン(特にRDBMS)は複雑なシステムです。SQLの数行は実際には多くの作業を実行できますが、これはシミュレートするのが困難です(実際、SQLクエリが数行の長さである場合、Java / PHP / C#/ Pythonの行がさらに必要になる可能性があります内部で同じ結果を生成するコード):既にDBに実装したロジックを複製することは意味がなく、そのテストコードをチェックすること自体が問題になります。

これを必ずしも単体テスト統合テストの問題として扱うのではなく、テスト対象の範囲を見ていきます。単体テストと統合テストの全体的な問題は残ります。テストデータとテストケースのかなり現実的なセットが必要ですが、テストを迅速に実行するには十分小さいものも必要です。

データベースをリセットし、テストデータを再入力する時間を考慮する必要があります。通常、このモックコードを書くのにかかる時間(最終的にはメンテナンスする必要があります)に対してこれを評価します。

考慮すべきもう1つのポイントは、アプリケーションがデータベースに依存している度合いです。

  • アプリケーションが単純に構成設定の単純な手段で任意のRDBMSの間で交換できる抽象化レイヤーを持っているCRUDモデルに従う場合、可能性としては、かなり簡単にモックシステムで作業できる可能性がありますユニットとインメモリRDBMSを使用した統合テストとの間の線)。
  • アプリケーションが、SQL Server、MySQL、PostgreSQLなどに固有のより複雑なロジックを使用する場合、その特定のシステムを使用するテストを行う方が一般的に意味があります。

「今日の多くのアプリケーションは、データベースサーバーがダウンした場合、まったく動作しません」-これは本当に重要なポイントです!
-el.pescado

別の言語を使用してSQLをモックするなど、複雑なモックの制限に関する適切な説明。テストコードが十分に複雑になり、それ自体をテストする必要があるように思える場合、それはQAの匂いです。
dodgethesteamroller

1

このような単体テストを不完全であると考えるのは正しいことです。不完全性は、モックされているデータベースインターフェイスにあります。そのような素朴なモックの期待や主張は不完全です。

完全にするには、テスト対象のSQLステートメントが発行され、期待される動作が得られることを保証するSQLルールエンジンを記述または統合するのに十分な時間とリソースを確保する必要があります。

ただし、しばしば忘れられていくぶん高価なモックの代替/コンパニオンは「仮想化」です。

単一の機能をテストするために、一時的なメモリ内だが「実際の」DBインスタンスを起動できますか?はい ?そこには、保存および取得された実際のデータをチェックするより良いテストがあります。

さて、あなたはユニットテストを統合テストに変えたと言うかもしれません。ユニットテストと統合テストを分類するために線を引く場所については、さまざまなビューがあります。私見、「ユニット」は任意の定義であり、あなたのニーズに合うはずです。


1
これは、数時間前に投稿されたこの以前の回答で作成され、説明されたポイントを繰り返すようです
-gnat

0

Unit TestsそしてIntegration Tests互いに直交しています。これらは、作成中のアプリケーションに関する異なるビューを提供します。通常、両方が必要です。ただし、どの種類のテストが必要なのかという点は異なります。

最も頻繁にしたいUnit Tests。単体テストは、テスト対象のコードのごく一部に焦点を当てています-正確に呼ばれるものunitは読者に任されています。しかし、目的は簡単です。コードいつどこで壊れたかをすばやくフィードバックすることです。ただし、実際のDBへの呼び出しはnonoであることは明らかです。

一方、データベースがなくても厳しい条件下でのみ単体テストできるものがあります。おそらく、コードに競合状態があり、DBへの呼び出しは、unique constraint実際にシステムを使用する場合にのみスローされる可能性のある違反をスローします。しかし、これらの種類のテストは高価であり、できるだけ頻繁に実行することはできません(そして実行したくない)unit tests


0

.Netの世界では、テストプロジェクトを作成し、UIを除くラウンドトリップのコーディング/デバッグ/テストの方法としてテストを作成する習慣があります。これは私にとって効率的な開発方法です。ビルドごとにすべてのテストを実行することに興味はありませんでした(開発のワークフローが遅くなるため)が、大規模なチームにとってこれが有用であることは理解しています。それでも、コードをコミットする前にすべてのテストを実行してパスするというルールを作成できます(データベースが実際にヒットしているためにテストの実行に時間がかかる場合)。

データアクセスレイヤー(DAO)をモックアウトし、実際にデータベースにアクセスしないと、好きな方法や慣れた方法でコーディングできなくなるだけでなく、実際のコードベースの大部分が失われます。データアクセスレイヤーとデータベースを実際にテストしているわけではなく、物まねをするのに多くの時間を費やしている場合、実際にコードをテストするこのアプローチの有用性を理解できません。私は1つのテストで大きなものではなく小さなものをテストしています。私のアプローチは統合テストのラインに沿っているかもしれませんが、実際に統合テストを一度だけ書くと、モックを使用した単体テストは冗長な時間の無駄になるようです。また、開発とデバッグの良い方法でもあります。

実際、しばらくの間、TDDとBehavior Driven Design(BDD)を認識し、その使用方法について考えてきましたが、ユニットテストをさかのぼって追加することは困難です。おそらく私は間違っていますが、データベースを含めてエンドツーエンドでより多くのコードをカバーするテストを書くことは、より多くのコードをカバーし、テストを書くより効率的な方法であるはるかに完全で優先度の高いテストのようです。

実際、ドメイン固有言語(DSL)でエンドツーエンドをテストするビヘイビアドリブンデザイン(BDD)のようなものが進むべきだと思います。.Netの世界にはSpecFlowがありますが、Cucumberでオープンソースとして開始されました。

https://cucumber.io/

私が書いたテストの真の有用性に、データアクセスレイヤーをモックアウトし、データベースにアクセスしないことに本当に感心していません。返されたオブジェクトはデータベースにヒットせず、データが入力されませんでした。それは私が不自然な方法でモックアップしなければならなかった完全に空のオブジェクトでした。時間の無駄だと思う。

Stack Overflowによると、実際のオブジェクトが単体テストに組み込むことが実際的でない場合にモッキングが使用されます。

https://stackoverflow.com/questions/2665812/what-is-mocking

「モックは主に単体テストで使用されます。テスト中のオブジェクトは他の(複雑な)オブジェクトに依存する場合があります。テストするオブジェクトの動作を分離するには、実際のオブジェクトの動作をシミュレートするモックで他のオブジェクトを置き換えます。これは、実際のオブジェクトを単体テストに組み込むことが現実的でない場合に役立ちます。」

私の議論は、開発者として何かをチェックインする前に、エンドツーエンド(Web UIからビジネスレイヤー、データアクセスレイヤー、データベースへのラウンドトリップ)をコーディングする場合、このラウンドトリップフローをテストすることです。UIを切り取り、テストからこのフローをデバッグおよびテストする場合、UI以外のすべてをテストし、UIが期待するものを正確に返します。あとは、UIに必要なものを送信するだけです。

自然な開発ワークフローの一部である、より完全なテストがあります。私にとって、それは、実際のユーザー仕様のエンドツーエンドのテストを可能な限りカバーする、最も優先度の高いテストでなければなりません。他のより詳細なテストを作成しない場合は、少なくとも、目的の機能が動作することを証明するもう1つの完全なテストがあります。

Stack Exchangeの共同設立者は、100%のユニットテストをカバーすることの利点について確信していません。私もそうではありません。私は、いつでもデータベースモックの束を維持しながら、データベースを攻撃する、より完全な「統合テスト」を受けます。

https://www.joelonsoftware.com/2009/01/31/from-podcast-38/


あなたがユニットと統合テストの違いを理解していないように明らかである
BЈовић

プロジェクトに依存すると思います。テスターが不足し、ドキュメントをコードと同期させないために、開発者がテストと回帰テストの全体的な責任を負うリソースの少ない小規模なプロジェクトでは、テストの作成に時間を費やそうとすると、私の支出に見合う最高の価値を与えてくれます。私はできるだけ多くの鳥を一石で殺したいです。私のロジックとバグのほとんどが、レポートを生成しているデータベースストアドプロシージャまたはフロントエンドJavaScriptに由来する場合、中間層で完全なユニットテストをカバーすることはあまり役に立ちません。
user3198764

-1

外部依存関係は制御できないため、モック化する必要があります(統合テスト段階では合格するが、本番では失敗する場合があります)。ドライブは失敗する可能性があり、データベース接続はさまざまな理由で失敗する可能性があり、ネットワークの問題などがある可能性があります。

真の単体テストでは、サンドボックスの制限内でテストしているので、はっきりしているはずです。開発者がQA / PRODで失敗したSQLクエリを記述した場合、それまでに一度もテストしなかったことを意味します。


1のために、「あなたがそれらを制御することはできません(彼らは、統合テスト・フェーズ渡すが、本番で失敗する場合があります)」
Tulainsコルドバ

あなたはできる satisfactionary程度にそれらを制御します。
el.pescado

私はあなたのポイントを得るが、これは今日よりも真実だったと思う?自動化とツール(Dockerなど)を使用すると、統合テストスイートのために、すべてのバイナリ/サーバーの依存関係のセットアップを正確かつ確実に複製および繰り返すことができます。もちろん、はい、物理ハードウェア(およびサードパーティのサービスなど)は失敗する可能性があります。
mindplay.dk

5
私は絶対に同意しません。外部の依存関係が失敗する可能性があるため、(追加の)統合テストを作成する必要があります。外部依存関係には独自の癖がある場合がありますが、すべてをモックすると見逃す可能性が高くなります。
ポールケルチャー

1
@PaulKはまだどの回答を承認済みとしてマークするかを熟考していますが、私は同じ結論に傾いています。
mindplay.dk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.