多くの「単体」テストが実行中にOracleデータベースへの実際の接続を使用するアプリケーションがあります。
ご想像のとおり、これらのテストは、いくつかのSpringコンテキストを初期化し、Oracleインスタンスと通信する必要があるため、実行に時間がかかりすぎます。それに加えて、テスト実行後のデータベースの変更を回避するために、トランザクションなどの複雑なメカニズムを管理する必要があります(Springのような便利なクラスを使用している場合でもAbstractAnnotationAwareTransactionalTests
)。
したがって、私の考えは、このOracleテストインスタンスをインメモリデータベースに段階的に置き換えることです。私は使うhsqldb
か、多分もっと良いでしょうh2
。
私の質問は、それを行うための最良のアプローチは何かを知ることです。私の主な関心事は、インメモリデータベース構造の構築と参照データの挿入に関連しています。
もちろん、SQL Developer
またはなどのツールを使用してOracleからデータベース構造を抽出し、TOAD
これらのスクリプトを変更してhsqldb
またはのh2
言語に適合させることもできます。しかし、それがより良いアプローチだとは思いません。
実際、私はすでにを使用して別のプロジェクトhsqldb
でそれを行いましたが、テーブルを作成するためにすべてのスクリプトを手動で作成しました。幸い、作成するテーブルはほとんどありませんでした。このステップでの私の主な問題は、テーブルの作成に使用されるOracleスクリプトを言語に「変換」することでしたhsqldb
。
たとえば、次のsqlコマンドを使用してOracleで作成されたテーブル:
CREATE TABLE FOOBAR (
SOME_ID NUMBER,
SOME_DATE DATE, -- Add primary key constraint
SOME_STATUS NUMBER,
SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);
次の目的で「翻訳」する必要がありますhsqldb
。
CREATE TABLE FOOBAR (
SOME_ID NUMERIC,
SOME_DATE TIMESTAMP PRIMARY KEY,
SOME_STATUS NUMERIC,
SOME_FLAG INTEGER DEFAULT 0 NOT NULL);
私の現在のプロジェクトでは、手動でそれを行うにはテーブルが多すぎます...
だから私の質問:
- それを達成するためにあなたが私に与えることができるアドバイスは何ですか?
- Oracle接続からスクリプトを生成するためのツールを提供しています
h2
か?hsqldb
技術的な案内
Java 1.6、Spring 2.5、Oracle 10.g、Maven 2
編集
私のユニットテストに関するいくつかの情報:
私が使用したアプリケーションでhsqldb
は、次のテストを行いました。-DBとは関係のないいくつかの「基本的な」単体テスト。-DAOテストでは、hsqldb
CRUDなどのデータベース操作を実行していました。-次に、サービスレイヤーで、Mockito
アプリケーション全体(つまり、サービス+ dao + DB)ではなく、サービステストに焦点を合わせるために、DAOオブジェクトをモックしていました。
現在のアプリケーションでは、最悪のシナリオがあります。DAOレイヤーのテストでは、Oracle接続を実行する必要があります。サービスレイヤーは、DAOをシミュレートするために(まだ)モックオブジェクトを使用しません。したがって、サービステストにはOracle接続も必要です。
モックとインメモリデータベースは2つの別個のポイントであることを認識しており、できるだけ早くそれらに対処します。ただし、最初のステップは、インメモリデータベースによってOracle接続を削除することです。次に、知識を使用しMockito
てテストを強化します。
また、単体テストを統合テストから分離したいことに注意してください。後者は、「実際の」テストを実行するためにOracleデータベースにアクセスする必要がありますが、私の主な関心事(そしてこれがこの質問の目的です)は、今日、ほとんどすべての単体テストが単独で実行されていないことです。