3

多くの外部 (プロパティ) ファイルからデータ駆動型テストを適用し、知識のあるユーザーが 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 内にあります。

私たちのテスト状況は珍しいものではないので、明らかに何かが欠けています! どんな提案でも大歓迎です。

4

1 に答える 1

0

少なくとも部分的な答え: Surefire はすべてのテスト ケースのフォークをサポートしています。確実な構成セクションで次のことを試してください。

<reuseForks>false<reuseForks>
<forkCount>1<forkCount>

詳細については、http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.htmlを参照してください。

「データ駆動型テスト」の一般的な問題については、カスタム Junit ランナーが最適です。これはあなたが思うほど難しいことではありません。Junit ソースコード https://github.com/junit-team/junit/tree/master/src/main/java/org/junit/のランナー パッケージを見てください。外部データを使用して、パラメーター化されたランナーを再実装/拡張します

于 2014-10-20T08:56:03.877 に答える