我正在为我的(小型)程序编写单元测试,测试用例在大约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)添加了另一个解决方案,以防它会帮助某人。
使用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
方法生成的各个动态测试之间,回调方法或扩展不会重置这些字段。
更多例子在官方留档。
试着这样做:
@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循环中实例化我需要的所有对象,或者至少把我想要创建的所