2

ヘルプのために、ここに私の環境があります:

  • Visual Studio 2010およびC#
  • SQLManagementStudioを備えたSQLServer2008 R2
  • NUnit

私はデータベースと相互作用する多くの統合テストを作成しているところです。各テストには、非常に特定の状態のデータベースが必要です。ORMまたはSQLManagementStudioで直接データを挿入したくありません。

私が欲しいのは、VMwareスナップショットのような構造を持ついくつかのSQLスクリプトです。

例えば:

->[列挙型にマップされたテーブルなどのシステムテーブルを含むメインスクリプト].sql

--->[一部のテーブルの2行].sql

------>[他のテーブルの他のいくつかの行].sql

--->[別のテスト用の2行].sql

------>[他のケースを処理するための他のいくつかの行].sql

このタイプの構造では、特定のバージョンのスナップショットにロールバックしてデータベースを特定の状態に設定し、構造内にスナップショットの別のブランチを作成することができます。

各テストの前に、データベース内のすべてのテーブルをクリーンアップしてから、特定のSQLスクリプトを実行します。

データベースとの統合テストを行うのに良い方法ですか?

このタイプのSQLスクリプト構造を実行するためのツールはありますか?

ベストプラクティスのリストはありますか?

私が何をしたいのかがよくわからない場合、このタイプのテストを実行するための最良のアーキテクチャ、方法論は何ですか?

どうもありがとうございます。

4

2 に答える 2

3

あなたはORMを使いたくないと言っていますが、私はそれを無視することにしました。ごめん :)

移入する方法

ユーザーが行うのと同じ操作を使用してデータベースにデータを挿入することを好みます。つまり、データベースで製品を注文する必要がある場合は、管理インターフェイスを使用して製品を作成し、ユーザーにパブリックインターフェイスを使用してアカウントを作成させ、そのユーザーに注文を依頼します。

これは、実際のUIのボタンをクリックすることによって行う必要はありませんが、UIの基礎となる抽象化を使用することが望ましいです。

利点:

  • データベースは、実際に実行されたときと同じ状態になりますが、実際に実行されると思われる状態ではありません。
  • スキーマなどに変更を加える必要がある場合は、本番コードを変更するだけで済みます。
  • より多くの機能がテストでカバーされています
  • データベースには、この特定のユースケースに必要なデータのみが入力されます
  • テストは読みやすいです(挿入スクリプトを読むのは簡単ではありません)

欠点:

  • 遅いです
  • 大量のデータが必要な場合はうまく機能しません(これはまれです)

テストに必要なデータは一度だけです。そのために、テスト内の(逐語的な)文字列で必要なデータを指定できる独自の宣言型ドメイン固有言語を作成しました。次に、データを解析してデータベースに挿入するツールを作成しました。

データベースをクリーンアップする

データベースをクリーンアップするには、いくつかの方法があります。データベースを再作成します。すべてのデータを削除します。トランザクションでテストを実行し、ロールバックを作成します...ただし、私のお気に入りはデータベースをクリーンアップすることではありません。テストごとに、新しいユーザーと新しい製品を作成します(上記の例を使用)。データベースをクリーンアップする必要はありませんが、それでもテストは相互に干渉しません。また、検査が必要な場合は、テスト後にデータを入手します。

それはあなたの質問に対する実際の答えではありませんが、それがいくらか役立つことを願っています。

于 2012-04-20T20:52:35.660 に答える
1

この種のデータベーステストには、 FitNesseとdbFitを組み合わせて使用​​します。また、 SQL2008R2も使用しています。VMWareスナップショットの構造がどのように見えるかはわかりませんが、FinNesseを使用すると、階層的なテストセットを構築できます(構造と構文のようなwikiを使用)。

私自身の観点からの主な利点は次のとおりです。

  • dbFitはトランザクションで暗黙的に実行され、各テストの終了時に自動的にロールバックされます。
  • 階層構造により、複数のテストに適用できるセットアップおよびティアダウンスクリプトを追加できます。
  • すべてのテストを順番に実行する一連の個別のテストを作成できます。
  • 継続的インテグレーションサーバーであるTeamCityとの(ある程度の)統合。
于 2012-04-19T19:30:44.933 に答える