1

SQLクエリのテストケースを書く方法は?

  • 従うべき手順または形式はありますか。
  • たとえば、複雑な結合を含む挿入クエリがあり、そのためのテストケースを開発する方法があります。
4

2 に答える 2

1

私はあなたの要件がわからないので、それは興味深いようです。

IMHO、テストケースは、機能テストまたはシステムテスト(または一般的なブラックボックステスト)用に作成することをお勧めします。テストケースは、要件仕様またはユーザーストーリーの翻訳です。クエリをテストする場合、テストケースを作成する必要があるかどうかはわかりません(これはホワイトボックステストになります)。このような場合、手動のテストケースを作成するよりも、単体テストを作成する方が適切です。ここで何かが足りないのかもしれません。

しかし、あなたが私が知らない別の意見を持っていることを考えると、以下は私の考えです。

ユーザーストーリーまたは要件仕様で、結合の数とタイプ、使用するテーブルなどについて明示的に説明している場合は、テストケースを個別に記述して、逸脱がないかどうかを確認できます。例えば。1つのテストケースはタイプ結合をチェックして要件に準拠しているかどうかをチェックし、別のテストケースは使用されているテーブルを検証して、開発者が目的のテーブルのみを使用して他に何も使用していないかどうかをチェックできます。

編集:ユニットテストを作成する場合は、 DBUnitをチェックしてください。

  1. 単体テストケースからDBへの接続を簡単に作成する
  2. XMLでサンプルデータを作成し、それらをテーブルにロードするには
  3. いくつかのデータベーストランザクションを実行した後にデータを確認するか、単一のステップでデータをアサートします

たとえば、次のシナリオについて考えてみます。あなたは学校のDBを持っています。これで、学生のリストを取得する複雑なクエリを作成しました。このクエリが正常に機能しているかどうかを確認する必要があります。次に、DBUnitまたはUnitilsを使用して単体テストケースを作成できます。これにより、テーブルが動的に作成され、サンプルデータが読み込まれ、クエリが実行され、結果セットが期待するデータと比較されます。すべてを1つの自動化された単体テストで。

これはUnitilsの例です。

パブリッククラスUserDAOTestはUnitilsJUnit4を拡張します{

@Test
@DataSet("UserDAOTest.testFindByMinimalAge.xml")
public void testFindByMinimalAge() {
    List<User> result = userDao.findByMinimalAge(18);        
    assertPropertyLenientEquals("firstName", Arrays.asList("jack"), result);
}

}

このテストが実行される前に、このテストからのサンプルデータ"UserDAOTest.testFindByMinimalAge.xml"が構成したテーブルにロードされ、後でテストとその中のクエリが実行されます。同様に、このxmlのデータ@ExpectedDataSetの代わりに注釈を使用@DataSetすると、テストの実行後に結果セットの比較に使用されます。

JPA-Hibernateを使用している場合は、インメモリDBを使用して効果的な単体テストを実行することもできます。

お役に立てれば。

于 2012-01-07T11:12:33.680 に答える
0

さまざまなデータベースにはさまざまなテスト スイートがあります。MySQL / Percona Server / MariaDB はすべて、mysql-test-run のバリアントを使用します。

http://dev.mysql.com/doc/mysqltest/2.0/en/mysql-test-run-pl.html

Drizzle もこれの変形を使用します: http://docs.drizzle.org/testing/test-run.html

これらは単純な差分ベースのテストです。表示されると予想されるクエリを記述し、ランナーにそれらを実行させてから、結果を検証します。予想される出力を .result ファイルに保存し、その後の実行で同じ動作/結果が確実に得られるようにします。

ランダム クエリ ジェネレーターのように、使用したい他のツールがあります。

http://forge.mysql.com/wiki/RandomQueryGenerator

このツールには、MySQL ベースのシステムだけでなく、Postgres および Javadb システムに対しても実行できるという利点があります。

また、2 つのサーバーに対して同じクエリを実行することもできます。これにより、複雑なクエリをテスト対象のサーバーと信頼できる実装の両方に対して実行することで (同じクエリの Drizzle とストック MySQL の結果を比較するなど)、クエリ結果を手動でチェックすることでテストできます。

于 2012-03-28T15:50:59.590 に答える