多くの外部 (プロパティ) ファイルからデータ駆動型テストを適用し、知識のあるユーザーが Java コードベースに触れずにテストを追加できるようにする Java コマンドライン アプリを開発しています。もちろん、アプリを実行するたびにクリーンな状態 (つまり、静的クラスの副作用がない、クリーンなファイル環境など) から開始することを保証したいと考えています。以下にいくつかのオプションを示します。
(a) アプリの main() メソッドを呼び出して、単一の JUnit クラスの単一のメソッドですべてのテストを実行します。
@Test
public void appTest () {
<get all properties files>
<for each property file>
String[] args = <construct command line from property file>
MyApp.main (args);
<test result>
...
}
全体が単一の JVM で実行されているため、機能しません。
(b) アプリをフォークする単一のメソッドですべてのテストを実行します。
@Test
public void appTest () {
<get all properties files>
<for each property file>
String[] args = <construct command line from property file>
<fork app with args>
<test result>
...
}
個別の JVM を提供しますが、JUnit (および Surefire) は個々のテストを認識しないため、レポートはほとんど役に立ちません。
(c) JUnit クラスごとに 1 つのテスト:
public class MyAppTest1 {
private static final String PROP_FILE = "src/test/resources/myapp/myapp1.properties
@Test
public void appTest () {
String[] args = <construct command line from PROP_FILE>
MyApp.main (args);
<test result>
}
}
これは機能しますが、面倒で繰り返しが多く、テストごとにクラスを追加する必要があります。
(d) JUnit パラメータ化テスト (@RunWith(Parameterized.class)) は、同じ JVM で実行されるため役に立ちません。
(e) Surefire 並列化は JVM 内にあります。
私たちのテスト状況は珍しいものではないので、明らかに何かが欠けています! どんな提案でも大歓迎です。