33

多くの「単体」テストが実行中に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テストでは、hsqldbCRUDなどのデータベース操作を実行していました。-次に、サービスレイヤーで、Mockitoアプリケーション全体(つまり、サービス+ dao + DB)ではなく、サービステストに焦点を合わせるために、DAOオブジェクトをモックしていました。

現在のアプリケーションでは、最悪のシナリオがあります。DAOレイヤーのテストでは、Oracle接続を実行する必要があります。サービスレイヤーは、DAOをシミュレートするために(まだ)モックオブジェクトを使用しません。したがって、サービステストにはOracle接続も必要です。

モックとインメモリデータベースは2つの別個のポイントであることを認識しており、できるだけ早くそれらに対処します。ただし、最初のステップは、インメモリデータベースによってOracle接続を削除することです。次に、知識を使用Mockitoてテストを強化します。

また、単体テストを統合テストから分離したいことに注意してください。後者は、「実際の」テストを実行するためにOracleデータベースにアクセスする必要がありますが、私の主な関心事(そしてこれがこの質問の目的です)は、今日、ほとんどすべての単体テストが単独で実行されていないことです。

4

4 に答える 4

19

テストにはメモリ内/Javaデータベースを使用します。これにより、テストでデータベースを「抽象化」しようとする場合よりも、テストが現実の世界に近づくことが保証されます。おそらく、そのようなテストは、作成と保守も簡単です。一方、UIテストは通常​​自動化が難しいため、テストで「抽象化」したいのはUIです。

投稿したOracle構文はH2データベースでうまく機能するため(テストしたばかりです)、H2はHSQLDBよりもOracle構文をサポートしているようです。免責事項:私はH2の作者の一人です。うまくいかない場合は、H2メーリングリストに投稿してください。

とにかく、バージョン管理システムにデータベースのDDLステートメントが必要です。これらのスクリプトをテストにも使用できます。おそらく、複数のスキーマバージョンもサポートする必要があります。その場合は、バージョン更新スクリプト(テーブルの変更...)を作成できます。Javaデータベースを使用すると、それらもテストできます。

ちなみに、H2やHSQLDBを使用する場合、必ずしもインメモリモードを使用する必要はありません。データを永続化する場合でも、両方のデータベースは高速です。また、インストールが簡単で(jarファイルのみ)、Oracleよりもはるかに少ないメモリで済みます。

于 2010-09-24T07:51:46.557 に答える
6

最新のHSQLDB2.0.1は、構文互換性フラグsql.syntax_ora = trueを介して、DUAL、ROWNUM、NEXTVAL、およびCURRVALのORACLE構文をサポートします。同様に、文字列とNULL文字列の連結、およびUNIQUE制約でのNULLの制限は、他のフラグで処理されます。TO_CHAR、TO_DATE、NVLなどのほとんどのORACLE関数はすでに組み込まれています。

現時点では、NUMBERなどの単純なORACLEタイプを使用するには、タイプ定義を使用できます。

タイプ番号を数値として作成

次のスナップショットでは、フラグが設定されている場合、NUMBER(N)およびORACLEタイプの互換性の他の側面が許可されます。

http://hsqldb.org/support/からダウンロード

[更新:] 10月4日に発行されたスナップショットは、ほとんどのOracle固有のタイプをANSISQLタイプに変換します。HSQLDB 2.0は、Oracleと同じ方法で、ANSISQLINTERVALタイプと日付/タイムスタンプ演算もサポートします。

于 2010-09-24T10:29:29.180 に答える
2

あなたのユニットテストは何ですか?DDLとストアドプロシージャの適切な動作をテストする場合は、テストをOracleに「より近い」ものにする必要があります。Javaコードを使用しないか、Springやその他の優れたWebインターフェイスを使用せずにデータベースに焦点を当てます。

JavaとSpringで実装されたアプリケーションロジックをテストする場合は、モックオブジェクト/データベース接続を使用して、データベースから独立したテストを行うことができます。

動作全体をテストしたい場合(モジュラー開発とテストの原則に反するもの)、データベースを仮想化して、厄介な不可逆的な変更を行うリスクなしにそのインスタンスでテストできます。

于 2010-09-24T07:12:07.620 に答える
1

テストが後でクリーンアップされる限り(セットアップ方法をすでに知っているようです)、実際のデータベースインスタンスに対してテストを実行しても問題はありません。実際、これは私が通常好むアプローチです。可能な限り本番環境に近いものをテストするからです。

非互換性は小さいように見えますが、実際にはその後すぐに噛み返ってしまいます。良いケースでは、あなたはいくつかの厄介なSQL翻訳/大規模な嘲笑で逃げることができます。悪いケースでは、システムの一部をテストすることは不可能です。これは、ビジネスクリティカルなシステムにとって許容できないリスクだと思います。

于 2011-12-12T16:31:52.347 に答える