0

Java Extension Mechanismを使用して、JDK 拡張機能としてデプロイするためのモジュールを作成しました。ANTを使用してモジュールを構築しています。

ビルド プロセス中に単体テストを (TestNG を使用して) 実行する方法はありますか?

問題は、このモジュールには 2 種類のテストがあることです。

  • TestNG の通常の使用法を使用してテストできる機能テスト。(まあ、この単体テストには何の問題もありません)。
  • jarファイルを拡張機能として展開した後にのみ実行できるSPIクラスのテスト(したがって、ブートストラップクラスローダー)はそれらを見ることができます。

なにか提案を?ビルド スクリプトを Gradle に変更することもできますが、違いはないと思います。

4

1 に答える 1

0

一般的な回答

あなたが言及している2番目のタイプのテストは統合テストです。アプリケーションが存在する環境を正しく設定する必要があるため、これらを記述するのは常に少し難しくなります。一般に、次の 3 つの手順が必要です。

  1. 環境のセットアップ (データベース インストール スクリプトの実行など)
  2. 統合テストを実行する
  3. ステップ1からすべてをクリーンアップ

必要に応じて、ビルド スクリプトで手順 1 と 3 を実行するか、テスト クラスでコーディングするかを決定する必要があります。たとえば、あるアプローチの方がクリーンで移植性が高いことがわかる場合があります。

あなたの場合の解決策

あなたの場合、ステップ「1 - 環境のセットアップ」では、java.ext.dirs環境変数が正しく設定された新しい Java VM をフォークする必要があり、ステップ「3 - クリーンアップ」では、フォークされた JVM が終了することを確認するだけです。ビルド ファイルは次のようになります。

  1. メインコードをコンパイルする
  2. テストコードをコンパイルする
  3. 単体テストの実行 (タイプ 1)
  4. 新しい VM をフォークして、統合テストを実行します。

Ant でこれを行うことを選択した場合、「統合テストの実行」は次のようになります。

<target name="extensionIntegrationTest">
  <java classname="your.integration.TestClass" fork="true" failonerror="true">
    <classpath refid="..." />
    <arg value="..." />
    <!-- ... more parameters -->
    <jvmarg value="-Djava.ext.dirs=path/to/your/extension.jar"/
  </java>
</target>

Ant Javaタスクのドキュメントも参照してください。Gradle に切り替える場合 (通常は非常に良いアイデアです)、Gradle の深いAnt 統合を利用するか、JavaExectaskを使用できます。

この場合、ビルド ファイルを使用してテストを実行することをお勧めしますが、Java コードにすべてを含め、テスト クラスから新しい JVM をフォークする場合は、ProcessBuilderを使用します。とりわけ、これにはJAVA_HOME環境変数を読み取る必要があります。

于 2013-06-17T19:13:22.213 に答える