6

既存のプロジェクトの周りにいくつかのテスト足場を設定しています。これには、JUnitとDbUnitを使用したいくつかの統合テストが含まれます。また、継続的インテグレーションのためにJenkinsインストールをセットアップしました。

私の問題は、開発環境とテスト環境の間のDB接続を変更することです。アドホックなテストと調査を迅速に行うために、独自の製品スタックをローカルにインストールしています。開発中は、プライベートデータベースに対してテストを実行します。これは、データベースの方が高速で、バグのある進行中のコードで他の人の一日を台無しにすることがないためです。

コードがチェックインされると、Jenkinsがテストを実行します。今はまだ私のローカルデータベースを指しています。Jenkinsに、テスト環境にある別のデータベースに対してテストを実行してもらいたいと思います。

コードを変更せずにテスト用のデータベース接続を変更するためのベストプラクティス/戦略/テクノロジーなどはありますか?ソリューションでJenkinsが複数のDBに対して同じテストを実行できる場合のボーナスポイント(DbUnitは不可知論者であるため可能であるはずです)。


詳細については編集:

この製品は大きなものであり、相互作用するコンポーネントが数十個あります(通常は別々のvms /プロセスにあります)。稼働中のシステムでは、通常、さまざまなプロセスがデータベースを介して通信します。IEでは、UIプロセスが変更をテーブルに書き込み、バックエンドプロセスがそのテーブルをポーリングして変更を確認します。はい、それはひどいです。統合テストでは、UIを使用してシステムを構成し、その状態をDbUnitでキャプチャします。次に、その「入力」に対してテストを実行できます。

私のコンポーネントとすべての新しいコンポーネントは、Mavenによって管理されています。DB接続は現在、テストセットアップでハードコーディングされています。DbUnitシステムは機能します。テストが参照しているデータベースを、開発環境で自分が実行しているのか、テスト環境でJenkinsが実行しているのかに応じて、切り替えられるようにしたいと思います。

4

3 に答える 3

5

.propertiesテストのデータベース接続パラメーターをまたはファイルに外部化でき、Mavenを使用していると仮定すると.xml、1つのアプローチは、Mavenプロパティ(およびオプションでプロファイル)を使用して各環境を定義し、リソースフィルタリングを使用してこれらのプロパティを構成することです。構成ファイルに追加します。

たとえば、テスト中に、データベース接続パラメータを次のようなdatasource.propertiesで呼び出されるファイルに外部化することに成功したとします。src/test/resources

datasource.driverClassName = ${test.datasource.driverClassName}
datasource.url = ${test.datasource.url}
datasource.username = ${test.datasource.username}
datasource.password = ${test.datasource.password}

そして、あなたはあなたのPOMにこれを持っています:

<build>
  <testResources>
    <testResource>
      <directory>src/test/resources</directory>
      <filtering>true</filtering>
    </testResource>
  </testResources>
</build>

次にtest.datasource.driverClassName、さまざまな方法でetc.プロパティを定義して、Mavenにさまざまなデータベースを使用するように指示できます。

  • <properties>POMのセクションでデフォルトを定義できます。
  • <properties>各開発者(およびJenkins)のセクションでユーザー固有のデータベースを定義できますsettings.xml
  • developmentさまざまな環境( 、、jenkinsなど)のPOMでいくつかのプロファイルを定義しanotherDB、さまざまなプロファイルでビルドを実行できます。

最後のオプションを選択した場合、プロファイルのみが異なる1つのJenkinsプロジェクトから複数のMavenビルドを実行することで、Jenkinsを複数のデータベースに対して実行することができます。そうは言っても、環境ごとに異なるJenkinsプロジェクトを用意する方がよいでしょう。

于 2012-05-23T19:07:35.137 に答える
1

ビルドツールについてもっと知る必要があります。Mavenを使用していますか?データベース接続情報はどこに保存されていますか?春を使っていますか?

私は現在これを行っています。メインデータベース接続用のプロパティとテストデータベース接続用の個別のプロパティセットでMavenを使用しています。

Springを使用しているので、Mavenテストリソース内に、データソースBeanを保持し、テストプロパティを参照するapplicationContextファイルがあります。

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-    method="close">
    <property name="driverClassName" value="${test.jdbc.driverClassName}"/>
    <property name="url" value="${test.jdbc.url}"/>
    <property name="username" value="${test.jdbc.username}"/>
    <property name="password" value="${test.jdbc.password}"/>
    <property name="maxActive" value="100"/>
    <property name="maxWait" value="1000"/>
    <property name="poolPreparedStatements" value="true"/>
    <property name="defaultAutoCommit" value="true"/>
</bean>
于 2012-05-22T16:34:52.803 に答える
1

多くはデプロイメント環境に依存します。コンテナー(tomcat、jbossなど)にデプロイする場合は、JNDI接続を使用するとDB環境から分離されます。スタンドアロンのJavaプログラムを構築している場合は、自分で環境を決定し、使用するデータベース接続プロファイルを選択する必要があります。

これを行う1つの方法は、環境ごとに個別のデータベース構成を用意し、それをデプロイメントに含めることです。そうすれば、どの環境にいるのかを心配してコードを複雑にする必要がなくなります。

もう1つの方法は、環境をプログラムに渡し、使用する構成をコードに認識させることです。

于 2012-05-22T16:38:26.753 に答える