96

私たちのプロジェクトには、ディレクトリからすべてのファイルを取得してテストを実行するなど、いくつかのJUnitテストがあります。testEveryFileInDirectoryこれにメソッドを実装すると、TestCase失敗または成功する可能性のあるテストが1つだけ表示されます。しかし、私は個々のファイルの結果に興味があります。たとえば、EclipseのグラフィカルなTestRunnerで、各ファイルが個別のテストとして表示されるようにTestCase/を作成するにはどうすればよいですか?TestSuite(ファイルごとに明示的なテストメソッドをコーディングすることはできません。)

質問ParameterizedTestをEclipseTestrunnerの名前とも比較してください。

4

7 に答える 7

104

JUnit4のパラメーター化されたテストを見てください。

実際、私は数日前にこれを行いました。説明しようと思います...

最初に、1つの入力ファイルでテストする場合と同様に、通常どおりテストクラスを作成します。クラスを次のように飾ります。

@RunWith(Parameterized.class)

テスト呼び出しごとに変更される入力を受け取るコンストラクターを1つ作成します(この場合はファイル自体である可能性があります)

Collection次に、配列のを返す静的メソッドを作成します。コレクション内の各配列には、ファイルなどのクラスコンストラクターの入力引数が含まれます。このメソッドを次のように装飾します。

@Parameters

これがサンプルクラスです。

@RunWith(Parameterized.class)
public class ParameterizedTest {

    private File file;

    public ParameterizedTest(File file) {
        this.file = file;
    }

    @Test
    public void test1() throws Exception {  }

    @Test
    public void test2() throws Exception {  }

    @Parameters
    public static Collection<Object[]> data() {
        // load the files as you want
        Object[] fileArg1 = new Object[] { new File("path1") };
        Object[] fileArg2 = new Object[] { new File("path2") };

        Collection<Object[]> data = new ArrayList<Object[]>();
        data.add(fileArg1);
        data.add(fileArg2);
        return data;
    }
}

この例も確認してください

于 2008-12-11T10:32:28.833 に答える
27

JUnit3

public class XTest extends TestCase {

    public File file;

    public XTest(File file) {
        super(file.toString());
        this.file = file;
    }

    public void testX() {
        fail("Failed: " + file);
    }

}

public class XTestSuite extends TestSuite {

    public static Test suite() {
        TestSuite suite = new TestSuite("XTestSuite");
        File[] files = new File(".").listFiles();
        for (File file : files) {
            suite.addTest(new XTest(file));
        }
        return suite;
    }

}

JUnit4

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class TestY {

    @Parameters
    public static Collection<Object[]> getFiles() {
        Collection<Object[]> params = new ArrayList<Object[]>();
        for (File f : new File(".").listFiles()) {
            Object[] arr = new Object[] { f };
            params.add(arr);
        }
        return params;
    }

    private File file;

    public TestY(File file) {
        this.file = file;
    }

    @Test
    public void testY() {
        fail(file.toString());
    }

}
于 2008-12-11T11:04:15.337 に答える
3

JUnit 3TestSuiteでは、メソッドを継承してオーバーライドしtests()、ファイルを一覧表示し、リターンごとにTestCase、ファイル名をコンストラクターパラメーターとして受け取り、コンストラクターで指定されたファイルをテストするテストメソッドを持つサブクラスのインスタンスを返すことで可能になるはずです。

JUnit 4では、さらに簡単になる可能性があります。

于 2008-12-11T10:16:57.353 に答える
1

TestNG がオプションの場合、Parameters を DataProviders で使用できます。

個々のファイルのテストの結果は、テキストベースのレポートまたは Eclipse の TestNG プラグイン UI に表示されます。実行されたテストの合計数は、各ファイルを個別にカウントします。

この動作は、すべての結果が 1 つの "theory" エントリにまとめられ、1 つのテストとしてカウントされるJUnit Theoriesとは異なります。JUnit で個別の結果レポートが必要な場合は、Parameterized Testsを試すことができます。

テストと入力

public class FileTest {

    @DataProvider(name="files")
    public File[][] getFiles(){
        return new File[][] {
            { new File("file1") },
            { new File("file2") }
        };
        // or scan a directory
    }

    @Test(dataProvider="files")
    public void testFile(File file){
        //run tests on file
    }
}

出力例

PASSED: testFile(file1)
PASSED: testFile(file2)

===============================================
    Default test
    Tests run: 2, Failures: 0, Skips: 0
===============================================
于 2014-07-17T02:44:10.937 に答える
0

同様の問題があり、med が動的にテストを生成できるようにする単純な JUnit 4 ランナーを作成することになりました。

https://github.com/kimble/junit-test-factory

于 2016-04-08T19:04:29.767 に答える