我可以在运行时添加junit测试用例吗?

时间:2013-02-22 06:33:00

标签: java junit

我有一个需要测试大量xml模板的测试程序。

但我发现我必须为每个xml模板编写一个测试用例。

junit是否有这样一种机制,我可以在一个测试用例中生成另一个测试用例?

2 个答案:

答案 0 :(得分:4)

您可以使用@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,可能在不同的目录中或使用不同的(但可预测的)名称。

答案 1 :(得分:0)

不,在测试用例中没有“测试用例”类型功能 - 除了循环!

循环救援!

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

这样的事可能会有所帮助。我经常使用的另一个技巧是制作辅助断言*方法。因此,如果我检查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对象替换为您正在使用的任何框架(如果有的话)。