2010-04-15 135 views
3

通常我会有一个junit测试,显示在我选择的集成服务器中作为一个测试通过或失败(在这种情况下,我使用teamcity)。我需要进行这个特定测试的是能够循环通过目录结构,测试我们的数据文件可以被全部解析而不会抛出异常。Junit测试,创建其他测试

因为我们有30,000多个文件,每个文件1-5秒解析此测试将在其自己的套件中运行。问题是我需要一种方法让一段代码作为每个文件的一个junit测试运行,以便如果30,000个文件中的12个文件失败,我可以看到哪个12失败,而不仅仅是失败,抛出了runtimeexception并停止了测试。

我意识到这不是一种真正的“单元”测试方式,但是这种模拟对于确保我们的内容提供商保持检查并且不检查无效文件非常重要。

有什么建议吗?

+0

我需要使用BaseTestRunner吗? – benstpierre 2010-04-15 17:06:51

回答

5

我认为你想要的是参数化测试。如果您使用JUnit4(或TestNG),则可用。既然你提到JUnit,你会想看看@RunWith(Parameterized.class) @Parameters注释的文档。

+0

感谢这工作。 – benstpierre 2010-04-16 04:36:05

3

我会写一个测试,以循环或其他方式读取所有文件,并将所有失败的文件收集到某种类型的集合中进行报告。

也许更好的解决方案是使用DataProvider传递文件路径列表以进行读取的TestNG测试。 TestNG将为每个传入的文件路径参数创建并运行一个测试。

+0

这是我的备份选项,我宁愿将测试显示为x测试,其中x是在我们的模拟文件夹中发现的文件数。 – benstpierre 2010-04-15 17:24:12

2

Junit3答案:创建一个TestSuite,创建您需要的TestCases的实例,并根据您的动态数据初始化每个TestCase。该套件将作为一个整体在单个JVM实例中运行,但各个TestCases彼此独立(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并没有很好地支持,所以如果你的测试被自动检测到,你需要对你的命名约定有一些关注。