通常情况下,我会在我选择的集成服务器中显示一个junit测试作为一个通过或失败的测试(在这种情况下,我使用teamcity)。我需要进行此特定测试的是能够遍历目录结构测试,我们的数据文件都可以在不抛出异常的情况下进行解析。
因为我们有30,000多个文件,每个解析这个测试的1-5秒将在它自己的套件中运行。问题是我需要一种方法让一个代码作为每个文件的一个junit测试运行,这样如果30个文件中的12个文件失败,我可以看到哪个12个失败而不仅仅是那个失败,抛出了一个运行时异常并停止了测试
我意识到这不是一种真正的“单元”测试方式,但这种模拟对于确保我们的内容提供商得到检查并且不检查无效文件非常重要。
有什么建议吗?
答案 0 :(得分:5)
我认为你想要的是参数化测试。如果您使用的是JUnit4(或TestNG),则可以使用它。由于您提到了JUnit,因此您需要查看@RunWith(Parameterized.class)
和@Parameters
注释文档。
答案 1 :(得分:3)
我会编写一个测试来读取所有文件,无论是循环还是其他方式,并收集某种类型的集合中的所有失败文件进行报告。
也许更好的解决方案是使用DataProvider进行TestNG测试,以传递要读取的文件路径列表。 TestNG将为传入的每个文件路径参数创建并运行一个测试。
答案 2 :(得分:2)
Junit3答案:创建一个TestSuite,创建所需的TestCase实例,每个TestCase根据您的动态数据进行初始化。该套件将在单个JVM实例中作为一个整体运行,但各个TestCase彼此独立(setUp,tearDown调用,错误处理正确,报告提供您要求的内容等)。
实际的实现可能有点笨拙,因为TestCase将测试的名称与要运行的METHOD混淆,但这可以解决。
我们通常只将该套件与同一类中的动态测试用例相结合,并使用suite()方法获取TestSuite。例如,Ant的JUnit任务足够聪明,可以注意到这一点。
public class DynamicTest extends TestCase {
String filename ;
public DynamicTest ( String crntFile ) {
super("testMethod");
filename = crntFile ;
}
// This is gross, but necessary if you want to be able to
// distinguish which test failed - otherwise they all share
// the name DynamicTest.testMethod.
public String getName() {
return this.getClass().getName() + " : " + filename ;
}
// Here's the actual test
public void testMethod() {
File f = new File( filename ) ;
assertTrue( f.exists() ) ;
}
// Here's the magic
public static TestSuite suite() {
TestSuite s = new TestSuite() ;
for ( String crntFile : getListOfFiles() ) {
s.addTest( new DynamicTest(crntFile ) ) ;
}
return s ;
}
}
当然,如果您愿意,可以将TestSuite与TestCase分开。但是,如果你的测试是自动检测的,那么TestCase并不能保持良好的状态,所以如果你的测试是自动检测的,你需要注意你的命名约定。