从Java中的循环创建多个单元测试(Creating multiple unit tests fro

2019-09-26 14:34发布

我在写单元测试我的(小)的程序和测试案例在各地30个不同的文件中指定。
为了测试它,我需要的是一个循环,越过所有的文件,解析它们,并执行所需的内容。

问题是,在这种情况下,所有的我的测试将被视为一个,因为这一切都在与相同功能@Test符号。
是否有可能以某种方式分拆,而不必为每个测试文件创建一个单独的功能?

所有的测试作为一个测试案例的问题是,我不能看到哪个测试用例失败的过程; 如果一个失败,它不能休息(我会得到1次测试,而不是失败的5/30失败)

我目前使用JUnit(4.12),但我没有义务继续使用它,所以如果有一个更好的解决方案,我可以切换框架。

谢谢!

例:

public class MyTests {
    @Test
    public void testFromFiles {
        // loop through all the files
    }
}

output: 1 test run successfully 

更新:选定的答案为我工作非常好,我加入的JUnit 5(而不是4)另一种解决方案,在情况下,它会帮助别人。

Answer 1:

试试这个方法:

@RunWith(Parameterized.class)
public class EdiTest {

    @SuppressWarnings("WeakerAccess")
    @Parameterized.Parameter(value = 0)
    public String model;

    @SuppressWarnings("WeakerAccess")
    @Parameterized.Parameter(value = 1)
    public String filename;

    @Parameterized.Parameters(name = "{index}: testEDI({0}, {1})")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {"753", "edi753_A.edi"},
                {"753", "edi753_B.edi"},
                {"754", "edi754.edi"},
                {"810", "edi810-withTax.edi"},
                {"810", "edi810-withoutTax.edi"},
        });
    }

    @Before
    public void setUpContext() throws Exception {
        TestContextManager testContextManager = new TestContextManager(getClass());
        testContextManager.prepareTestInstance(this);
    }

    @Test
    public void testEDI() throws IOException {
        String edi = IOUtils.toString(ClassLoader.getSystemResource(filename));
        EdiConverter driver = ediConverterProvider.getConverter(model);

        // your test code here
    }

}


Answer 2:

使用JUnit 5和动态测试 :

  • 基本示例 :

     class DynamicTests { @TestFactory List<DynamicTest> createSomeTests() { return Arrays.asList( DynamicTest.dynamicTest("First dynamically created test", () -> assertTrue(true)), DynamicTest.dynamicTest("Second dynamically created test", () -> assertTrue(true)) ); } } 
  • 获取和过滤所有测试文件的例子:

     class MyTestsClass { @TestFactory List<DynamicTest> runAllTestFiles() { List<DynamicTest> list = new ArrayList<DynamicTest>(); try (Stream<Path> paths = Files.walk(Paths.get("tests_dir"))) { List<Path> files = paths .filter(path -> path.getFileName().toString().endsWith(".mytests")) .collect(Collectors.toList()); files.forEach(file -> list.add( DynamicTest.dynamicTest( file.getFileName().toString(), () -> testFileWithSomeAsserts(file)) )); } catch (IOException e) { e.printStackTrace(); } return list; } } 

@TestFactory作品不同于常规测试,并@BeforeEach / @AfterEach不能在这种情况下使用:

动态测试生命周期

动态测试的执行的生命周期是完全不同的比为标准@Test情况。 具体来说,有个别动态测试没有生命周期回调。 这意味着, @BeforeEach@AfterEach方法以及它们的相应的延伸回调被用于执行@TestFactory方法,但不为每个动态测试。 换句话说,如果从测试实例访问lambda表达式中的字段用于动态测试,这些字段将不被由同一个体产生的动态测试的执行之间的回调方法或扩展复位@TestFactory方法。

官方文档中更多的例子 。



文章来源: Creating multiple unit tests from a loop in Java