SQLクエリのテストケースを書く方法は?
- 従うべき手順または形式はありますか。
- たとえば、複雑な結合を含む挿入クエリがあり、そのためのテストケースを開発する方法があります。
私はあなたの要件がわからないので、それは興味深いようです。
IMHO、テストケースは、機能テストまたはシステムテスト(または一般的なブラックボックステスト)用に作成することをお勧めします。テストケースは、要件仕様またはユーザーストーリーの翻訳です。クエリをテストする場合、テストケースを作成する必要があるかどうかはわかりません(これはホワイトボックステストになります)。このような場合、手動のテストケースを作成するよりも、単体テストを作成する方が適切です。ここで何かが足りないのかもしれません。
しかし、あなたが私が知らない別の意見を持っていることを考えると、以下は私の考えです。
ユーザーストーリーまたは要件仕様で、結合の数とタイプ、使用するテーブルなどについて明示的に説明している場合は、テストケースを個別に記述して、逸脱がないかどうかを確認できます。例えば。1つのテストケースはタイプ結合をチェックして要件に準拠しているかどうかをチェックし、別のテストケースは使用されているテーブルを検証して、開発者が目的のテーブルのみを使用して他に何も使用していないかどうかをチェックできます。
編集:ユニットテストを作成する場合は、 DBUnitをチェックしてください。
たとえば、次のシナリオについて考えてみます。あなたは学校の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を使用して効果的な単体テストを実行することもできます。
お役に立てれば。
さまざまなデータベースにはさまざまなテスト スイートがあります。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 の結果を比較するなど)、クエリ結果を手動でチェックすることでテストできます。