1

我曾经将 JUnit 测试写成方法,例如:

public class TextualEntailerTest {
  @Test test1() {...}
  @Test test2() {...}
  @Test test3() {...}
}

由于大部分测试用例的结构都差不多,所以我决定做“数据驱动”,把测试的内容放在 XML 文件中。因此,我创建了一个方法“testFromFile(file)”并将我的测试更改为:

public class TextualEntailerTest {
  @Test test1() { testFromFile("test1.xml"); }
  @Test test2() { testFromFile("test2.xml"); }
  @Test test3() { testFromFile("test3.xml"); }
}

随着我添加越来越多的测试,我厌倦了为我添加的每个新测试文件添加一行。当然,我可以将所有文件放在一个测试中:

public class TextualEntailerTest {
  @Test testAll() { 
     foreach (String file: filesInFolder) 
       testFromFile(file); 
  }
}

但是,我更喜欢每个文件都是一个单独的测试,因为这样 JUnit 可以很好地统计通过和失败的文件数量。

所以,我的问题是:如何告诉 JUnit 为给定文件夹中的所有文件运行单独的测试,其中每个测试的形式为“testFromFile(file)”?

4

3 回答 3

2

您可以使用Theories文件所在的位置,@DataPoints这样您就不需要循环测试,并允许在每个文件之后进行设置和清理。但仍会如此报告。

理论还存在一个问题,即它们会像上面的测试一样快速失败(第一次失败后退出)。我发现这不是一个好习惯,因为它可以隐藏您有多个错误的情况。我建议使用单独的测试或使用带有ErrorCollector. 我真的希望Theories内置ErrorCollector

于 2012-09-19T12:23:47.030 回答
2

不确定,但可能这些可以帮助你。 参考 1 参考 2。希望这可以帮助。

于 2012-09-19T12:34:30.400 回答
1
@RunWith(value = Parameterized.class)
public class JunitTest {

     private String filename;

     public JunitTest(String filename) {
        this.filename= filename;
     }

     @Parameters
     public static Collection<Object[]> data() {
       Object[][] data = new Object[][] { { "file1.xml" }, { "file2.xml" } };
       return Arrays.asList(data);
     }

     @Test
     public void Test() {
       System.out.println("Test name:" + filename);
     }


}
于 2012-09-19T12:59:01.587 回答