当前位置: 首页 > 知识库问答 >
问题:

从Java中的循环创建多个单元测试

尉迟国发
2023-03-14

我正在为我的(小型)程序编写单元测试,测试用例在大约30个不同的文件中指定
为了测试它,我只需要一个循环,它遍历所有文件,解析它们,并执行所需的操作。

问题是,在这种情况下,我的所有测试都将被视为一个测试,因为它与@Test符号位于同一个函数中
是否可以以某种方式拆分它,而不必为每个测试文件使用单独的函数?

将所有测试作为一个测试用例的问题是,我看不到哪个测试用例失败了这个过程;如果一个失败了,其余的也失败了(我会得到一个测试失败,而不是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)添加了另一个解决方案,以防它会帮助某人。

共有2个答案

韩善
2023-03-14

使用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的工作原理与常规测试不同,在这种情况下,不能使用每个测试之前的/@之后的

动态测试生命周期

动态测试的执行生命周期与标准@test案例的执行生命周期截然不同。具体来说,没有针对单个动态测试的生命周期回调。这意味着对@TestFactory方法执行@beforeach@AfterEach方法及其相应的扩展回调,但不对每个动态测试执行。换句话说,如果您访问lambda表达式中用于动态测试的测试实例中的字段,那么在执行同一@TestFactory方法生成的各个动态测试之间,回调方法或扩展不会重置这些字段。

更多例子在官方留档。

储志业
2023-03-14

试着这样做:

@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
    }

}
 类似资料:
  • 为了让单元测试跑一个批处理的任务,这个框架必须加载这个任务的ApplicationContext,两个注解的触发方式: @RunWith(SpringJUnit4ClassRunner.class):表明这个类需要使用Spring的测试工具 @ContextConfiguration(locations = {…}):表明哪些xml文件包含ApplicationContext @RunWith

  • 我如何比较用户输入的这些数组呢?

  • 问题内容: 假设我有2个表,可以“合并”并以单个嵌套数组表示。 考虑到以下因素,我在徘徊什么是最好的方法: 效率 最佳实践 数据库/服务器端使用权衡 你在现实生活中应该做什么 可以以这种方式“合并”的3个,4个或更多表的大小写相同 问题是关于任何服务器端/关系数据库。 我正在考虑的2种简单方法(如果还有其他方法,请提出建议!请注意, 我在索要一个简单的SERVER-SIDE和RELATIONAL-

  • 问题内容: 为什么在Java中引入此循环?它是Java创建的吗?它的目的是什么(提高内存/ cpu的使用效率)? 问题答案: 为什么在Java中引入此循环? 只是为了简化遍历通用集合和数组。代替 你可以做 这使得代码更具可读性和更好的可维护性。 它是Java创作吗? 不,它早于Java就以其他语言存在。Java实施起来相对较晚。 目的是什么? 请参阅第一个答案。 要了解更多信息,请查阅有关该主题的

  • 这更多的是一个噱头,因为我希望实现我的单元测试的完全覆盖。 这是关于方法的。此方法查找文件夹中的文件并创建相应的增量命名。 现在我被告知应该有可能(无论出于什么原因)999,998个文件可能在这个文件夹中。 因此,如果检测到有一个文件被调用,例如,那么它应该返回一个空字符串。 相应的代码段如下所示: 我通过单元测试覆盖了所有内容,只有if的情况对我来说是不可能的。 就我个人而言,我认为这也是毫无意

  • 我对编程有点陌生,我被卡住了。假设我在一个项目中有五个不同的类:foo1、foo2、foo3、foo4和foo5,它们都做不同但相似的事情。现在假设我需要为每个对象创建一个新对象,比如:foo1 bar1=new foo1();foo2 bar2=新的foo2();foo3 bar3=新的foo3();等等当然这是可行的,但如果我能在一个for循环中实例化我需要的所有对象,或者至少把我想要创建的所