偽のリポジトリではなくデータベースでテストを実行するのは悪い習慣ですか?

StackOverflow https://stackoverflow.com/questions/607620

質問

私は利点が何であるかを知っており、より複雑なシステムで作業しているときに偽のデータを使用しています。

単純なものを開発していて、実際のデータベースに環境を簡単にセットアップでき、アクセスされるデータが非常に小さいため、アクセス時間が問題にならず、いくつかのテストを実行している場合はどうなりますか。

偽のデータを作成することは依然として重要ですか?それとも余分なコーディングを忘れて、すぐに本物にスキップできますか?

実際のデータベースとは、運用データベースではなく、テストデータベースを意味しますが、実際のライブDBMSと実際のデータベースと同じスキーマを使用します。

役に立ちましたか?

解決

実際のDBではなく偽のデータを使用する理由は次のとおりです。

  1. スピード。テストが遅い場合は、実行しません。 DBをモックすると、テストを通常よりもはるかに高速に実行できます。
  2. コントロール。テストは、テストデータの唯一のソースである必要があります。偽データを使用する場合、テストでは、使用する偽物を選択します。したがって、誰かがDBをなじみのない状態にしたために、テストが台無しになる可能性はありません。
  3. 注文の独立。テストを任意の順序で実行できるようにします。あるテストの入力は、別のテストの出力に依存するべきではありません。テストでテストデータを制御する場合、テストは互いに独立している場合があります。
  4. 環境の独立。テストはどの環境でも実行可能である必要があります。電車の中、飛行機、自宅、または職場でそれらを実行できる必要があります。外部サービスに依存しないでください。偽のデータを使用する場合、外部DBは必要ありません。

今、あなたが小さな小さなアプリケーションを構築していて、実際のDB(MySQLなど)を使用することで上記の目標を達成できる場合、必ずDBを使用してください。私がやります。ただし、アプリケーションが成長するにつれて、最終的にDBをモックアウトする必要に直面することになります。大丈夫です、必要なときにやりましょう。ヤグニ。必要なときは必ず実行してください。手放すと支払います。

他のヒント

テストの対象によって異なります。データベース内のデータではなく、コード内の実際のロジックをテストすることが多いため、テストを実行するためだけに完全なデータベースをセットアップするのは時間の無駄です。

また、テストとtestdatabaseの保守に費やす作業量も考慮してください。多くの場合、データベースでコードをテストするということは、別々の部分を分離するのではなく、アプリケーション全体をテストすることを意味します。これにより、多くの場合、データベースとテストの同期を保つために多くの作業が必要になります。

最後の問題は、テストを単独で実行する必要があるため、各テストを独自のバージョンのデータベースで実行するか、テストを実行する前とまったく同じ状態のままにする必要があることです。これには、テスト失敗後の状態が含まれます。

データベースでテストしたいのであれば、できると言いました。 dbunit のように、データベースのセットアップと破棄に役立つツールがあります。

このような単体テストを作成しようとしている人々を見てきましたが、ほとんどの場合、実際に価値があるよりもはるかに多くの作業になることがわかりました。ほとんどがプロジェクトの途中でそれを放棄し、ほとんどはプロジェクト中にttdを完全に放棄し、経験は一般に単体テストに移行すると考えました。

したがって、テストをシンプルかつ分離した状態に保ち、コードを十分にカプセル化して、コードを分離してテストできるようにすることをお勧めします。

クエリがリポジトリ内で修正されるか(より良いオプションであるIMO)、またはリポジトリが構成可能なクエリを公開するかどうかに依存すると思います。たとえば、リポジトリメソッドがある場合:

IQueryable<Customer> GetCustomers() {...}

その後、UIがリクエストできます:

var foo = GetCustomers().Where(x=>SomeUnmappedFunction(x));

bool SomeUnmappedFunction(Customer customer) {
   return customer.RegionId == 12345 && customer.Name.StartsWith("foo");
}

これは、オブジェクトベースの偽のレポでは成功しますが、実際の db実装では失敗します。もちろん、リポジトリにすべてのクエリを内部的に処理させることでこれを無効にすることができます(外部構成はありません)。例:

Customer[] GetCustomers(int? regionId, string nameStartsWith, ...) {...}

これは構成できないため、DBとUIを個別に確認できます。構成可能なクエリを使用すると、有用な場合は統合テスト全体を使用する必要があります。

むしろ、テストによってDBが自動的に設定されるかどうか、またデータベースが他の開発者から隔離されているかどうかに依存します。

現時点では問題にならない場合があります(開発者が1人だけなど)。ただし(データベースの手動セットアップの場合)、データベースのセットアップはテストを実行するための特別な障害であり、これは非常に悪いことです。

成長しないことを絶対に知っている単純な1回限りのアプリケーションを書いているだけなら、「ベストプラクティス」がたくさんあると思います。窓から出て行ってください。

DI / IOCを使用したり、単体テストを行ったり、データベースへのアクセスをモックアウトしたりする必要はありません。簡単な&quot;お問い合わせ&quot;形。ただし、「シンプル」と「シンプル」アプリと&quot; complex&quot;難しいです。

言い換えれば、これに対する明確な答えはないので、最善の判断をしてください。

「ユニット」として表示されない限り、シナリオでこれを行うことは問題ありません。テスト。それらは統合テストになります。また、煙テストを自動化するだけでよいため、UIを手動で何度もテストするかどうかも検討する必要があります。そのため、統合テストをまったく行わず、機能/ UIテストレベルで作業することを検討することもできます(既に統合をカバーしているため)。

他の人が指摘したように、複雑な/複雑でない上に線を引くのは難しいです、そして、今では手遅れになると通常あなたはそうなるでしょう:(。 tオーバーヘッドが大きくなります。それ以外の場合は、それから学習できます:)

Real DBが邪魔にならない限り、そしてあなたがその方法でより速く行くことができる限り、私は実用的であり、それのために行きます。

単体テストでは、「テスト」 「ユニット」よりも重要です。

これを自動化する場合、最も重要なことは、プログラムで初期条件を生成できることです。そのように聞こえますが、実世界のデータをテストするのがさらに良いです。

ただし、いくつかの欠点があります:

実際のデータベースは、コードの特定の条件をカバーしていない場合があります。偽のデータがある場合、その動作が発生します。

あなたが指摘しているように、シンプルなアプリケーションがあります。シンプルにならない場合は、単体テストとシステムテストに分類できるテストが必要になります。単体テストは、単純な機能をターゲットにする必要があります。これは、偽のデータを使用する方がはるかに簡単です。

偽のリポジトリの利点の1つは、同じクエリに対して同じ結果を期待できるため、回帰/単体テストが一貫していることです。これにより、特定の単体テストを簡単に構築できます。

コード(読み取りクエリのみではない場合)がデータを変更する場合、いくつかの欠点があります。 -コードにエラーがある場合(これがおそらくテストしている理由です)、本番データベースが破損する可能性があります。あなたがそれを壊さなかったとしても。 -本番データベースが時間の経過とともに、特にコードの実行中に変更された場合、追加したテスト資料が失われ、後でデータベースから削除するのに苦労する可能性があります。 -データベースにアクセスする他のシステムからの実稼働クエリは、テストデータを実際のデータとして扱う可能性があり、これにより将来の重要なビジネスプロセスの結果が破損する可能性があります。たとえば、データに特定のフラグまたはプレフィックスを付けた場合でも、データベースにアクセスする人がこのスキーマに従うことを保証できますか?

また、一部のデータベースはプライバシー法で規制されているため、契約とメインDBの所有者に応じて、実際のデータへのアクセスが法的に許可される場合と許可されない場合があります。

運用データベースで実行する必要がある場合は、ピーク時に簡単に作成できるコピーで実行することをお勧めします。

これは非常にシンプルなアプリケーションであり、成長は見られません。実際のDBでテストを実行しても問題はありません。ただし、このアプリケーションが成長すると思われる場合は、テストでそのことを考慮することが重要です。

可能な限りすべてをシンプルにし、後でより柔軟なテストが必要な場合は、それを実行します。ただし、3年後には古い(ハックの多い)(大規模なアプリケーションの)テストに依存する巨大なアプリケーションを作成したくないため、事前に計画してください。

データベースに対してテストを実行することのマイナス面は、テストの実行前にデータベースの状態を設定する速度と複雑さの欠如です。

これを制御できれば、データベースに対して直接テストを実行しても問題はありません。偽のデータに対して実行するよりも最終製品をより良くシミュレートするため、実際には良いアプローチです。重要なのは、実用的なアプローチを取り、ルールではなくガイドラインとしてベストプラクティスを確認することです。

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