Play フレームワーク 2.1.0 でリレーショナル データベースを使用するコードをカバーする単体テストを作成したいと考えています。これには多くの可能性があり、すべてが問題を引き起こします。
インメモリ H2 データベースでのテスト
Play フレームワークのドキュメントでは、H2 メモリ内データベースで単体テストを実行することを提案しています。開発と運用に使用されるメイン データベースが他のソフトウェア (つまり、MySQL) を使用している場合でも:
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
私のアプリケーションは、ストアド プロシージャなどの複雑な RDBMS 機能を使用せず、ほとんどのデータベース アクセス ケースは ebean 呼び出しであるため、MySQL と H2 の両方と互換性があるはずです。
ただし、進化のテーブル作成ステートメントは、 、 などを指定するなど、MySQL 固有の機能を使用しますENGINE = InnoDB
。DEFAULT CHARACTER SET = utf8
のこれらの独自の部分を削除するとCREATE TABLE
、MySQL は、私が制御できず、バージョンに依存するデフォルト設定を使用するのではないかと心配しています。アプリケーションをテストおよび開発するには、メインの MySQL 構成を変更する必要があります。
このアプローチを使用した人はいますか (進化を MySQL と H2 の両方と互換性があります)?
それを処理する方法の他のアイデア:
- MySQL と H2 の別々の進化 (良い考えではありません)
- H2 に追加の MySQL を無視させるいくつかの方法
create table
(MySQL 互換モードは機能しませんdefault character set
。方法がわかりません。
メイン データベースと同じデータベース ドライバーでのテスト
H2 インメモリ データベースの唯一の利点は、高速であることと、実際の環境に近いため、開発/運用データベースよりも同じデータベース ドライバーでのテストの方が優れている可能性があることです。
Play フレームワークでどのように行うことができますか?
試した:
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);
ここでは進化が機能しているように見えますが、各テストの前にデータベースをクリーンアップするにはどうすればよいでしょうか? 各テーブルを切り捨てるカスタム コードを作成することによって? テーブルを削除する場合、進化は次のテストの前に再度実行されますか、それともplay test
コマンドごとに 1 回適用されますか? それともHelpers.fakeApplication()
呼び出しごとに 1 回ですか?
ここでのベストプラクティスは何ですか? dbunitについて聞いたことがありますが、あまり苦労せずに統合することは可能ですか?