我有一个需要测试大量xml
模板的测试程序。
xml
但是我发现我必须为每个模板编写一个测试用例。
junit 是否有这样一种机制,我可以在一个测试用例中生成另一个测试用例?
您可以使用@Parameterized。这会给你你想要的。这是一个简单的案例,对单个目录中的所有文件运行测试:
@RunWith(Parameterized.class)
public class ParameterizedTest {
@Parameters(name = "{index}: file {0}")
public static Iterable<Object[]> data() {
File[] files = new File("/temp").listFiles();
List<Object[]> objects = new ArrayList<Object[]>(files.length);
for (File file : files) {
objects.add(new Object[] { file.getAbsolutePath() });
}
return objects;
}
private final String filename;
public ParameterizedTest(String filename) {
this.filename = filename;
}
@Test
public void test() {
System.out.println("test filename=" + filename);
}
}
文件中的每个测试对返回的列表中的每个条目运行一次data()
。您显然可以对文件做您想做的事情,但如果您正在动态构建测试列表,那么您还需要有某种方法来构建通过/失败标准。因此,如果您要将大量 xml 转换为其他 xml,那么您也需要生成的 xml,可能位于不同的目录中或具有不同(但可预测的)名称。
不,没有“测试用例内的测试用例”类型的功能——除了循环!
循环救援!
@Test
public void xmlShouldBeValid() {
String[] templates = new String[]{ TEMPLATE1, TEMPLATE2, TEMPLATE3 };
for (String template : templates) {
testTemplate(template);
}
}
private void testTemplate(String template) {
assertEquals("whatever", template);
}
这样的事情可能会有所帮助。我经常使用的另一个技巧是创建辅助 assert* 方法。所以如果我检查 XML 有 3 个属性 a、b 和 c,我可能会写
private void assertTemplate(String template, String a, String b, int c) {
String aFromTemplate = parseAfromTemplate(template); // normally this is done inline
String bFromTemplate = parseBfromTemplate(template); // but a function to read easier
String cFromTemplate = parseCfromTemplate(template);
assertEquals(a, aFromTemplate);
assertEquals(b, bFromTemplate);
assertEquals(c, cFromTemplate);
}
现在您可以在一个测试函数中多次调用 assertTemplate:
@Test
public void xmlShouldBeValid() {
assertTemplate("<hardcoded xml object>", "a", "b", "c");
assertTemplate("<hardcoded xml object>", "r", "s", "t");
assertTemplate("<hardcoded xml object>", "x", "y", "z");
}
当然,不要使用 String 作为模板类型,而是将 XML 对象替换为您正在使用的任何框架(如果有)。