私たちのプロジェクトには、いくつかの JUnit テストがあります。ディレクトリからすべてのファイルを取得し、テストを実行します。 testEveryFileInDirectory
にTestCase
メソッドを実装すると、これは失敗または成功する可能性のある1つのテストとして表示されます。しかし、個々のファイルの結果に興味があります。各ファイルが個別のテストとして表示されるようにTestCase
/TestSuite
を記述する方法EclipseのグラフィカルなTestRunnerで? (各ファイルに明示的なテストメソッドをコーディングすることはオプションではありません。)
質問 ParameterizedTestとEclipse Testrunnerの名前 も比較してください。
JUnit 4のParameterized Testsを見てください。
実際、私はこれを数日前に行いました。説明しようとします...
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;
}
}
これも確認してください 例
JUnit
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;
}
}
JUnit 4
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());
}
}
Junit 5パラメーター化テスト
JUnit 5 パラメータ化されたテストは、 データソースとしてのメソッド :
@ParameterizedTest
@MethodSource("fileProvider")
void testFile(File f) {
// Your test comes here
}
static Stream<File> fileProvider() {
return Arrays.asList(new File(".").list()).stream();
}
JUnit 5 DynamicTests
JUnit 5 は、静的メソッドDynamicTest
によって@TestFactory
で生成されるdynamicTest
の概念によってもこれをサポートします。
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;
import Java.util.stream.Stream;
@TestFactory
public Stream<DynamicTest> testFiles() {
return Arrays.asList(new File(".").list())
.stream()
.map((file) -> dynamicTest(
"Test for file: " + file,
() -> { /* Your test comes here */ }));
}
IDE(ここではIntelliJ))で実行されるテストは、次のように表示されます。
JUnit 3では、TestSuite
を継承し、tests()
メソッドをオーバーライドしてファイルをリストし、それぞれに対してファイル名を取得するTestCase
のサブクラスのインスタンスを返すことで可能になります。コンストラクターパラメーターとして、コンストラクターで指定されたファイルをテストするテストメソッドがあります。
JUnit 4ではさらに簡単になります。
JUnitParams library を使用することを検討できます。そのため、さらに(クリーンな)オプションがいくつかあります。
@org.junit.runner.RunWith(junitparams.JUnitParamsRunner.class)
public class ParameterizedTest {
@org.junit.Test
@junitparams.Parameters(method = "data")
public void test1(File file) throws Exception { }
@org.junit.Test
@junitparams.Parameters(method = "data")
public void test2(File file) throws Exception { }
public static File[] data() {
return new File[] { new File("path1"), new File("path2") };
}
}
@org.junit.runner.RunWith(junitparams.JUnitParamsRunner.class)
public class ParameterizedTest {
@org.junit.Test
@junitparams.Parameters(value = { "path1", "path2" })
public void test1(String path) throws Exception {
File file = new File(path);
}
@org.junit.Test
@junitparams.Parameters(value = { "path1", "path2" })
public void test2(String path) throws Exception {
File file = new File(path);
}
}
もっと見ることができます 使用例はこちら 。
さらに、 JUnitParamsについて、パラメーター化されたテストを記述する方が簡単で読みやすい理由 :
JUnitParamsプロジェクトは、JUnitに新しいランナーを追加し、JUnit> = 4.6のはるかに簡単で読みやすいパラメーター化されたテストを提供します。
標準のJUnit Parametrisedランナーとの主な違い:
- より明示的-パラメーターはクラスフィールドではなく、テストメソッドのパラメーターにあります
- 少ないコード-パラメーターを設定するためにコンストラクターを必要としません
- 1つのクラスでパラメーター化されたメソッドとパラメーター化されていないメソッドを混在させることができます
- paramsは、CSV文字列として、またはパラメータープロバイダークラスから渡すことができます。
- パラメータープロバイダークラスには、メソッドを提供するパラメーターを必要な数だけ含めることができるため、さまざまなケースをグループ化できます。
- パラメーターを提供するテストメソッドを持つことができます(外部クラスや静的変数はもうありません)
- 実際のパラメーター値は、IDE(JUnitのParametrisedでは、パラメーターの連続した数のみです)で確認できます)
TestNGがオプションの場合、 DataProvidersのパラメーター を使用できます。
個々のファイルのテストの結果は、テキストベースのレポートまたはEclipseのTestNGプラグインUIに表示されます。実行されたテストの合計数は、各ファイルを個別にカウントします。
この動作はJUnit Theories と異なり、すべての結果が1つの「理論」エントリの下にまとめられ、1つのテストとしてのみカウントされます。 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
===============================================
同様の問題があり、medがテストを動的に生成できる単純なJUnit 4ランナーを作成することになりました。