我想使用JUnit 4创建一个junit测试套件,其中要包含的测试类的名称在运行测试套件之前是未知的。
在JUnit 3中,我可以这样做:
public final class MasterTester extends TestCase
{
/**
* Used by junit to specify what TestCases to run.
*
* @return a suite containing what TestCases to run
*/
public static TestSuite suite() {
TestSuite suite = new TestSuite();
for(Class<?> klass : gatherTestClasses()) {
suite.addTestSuite(klass);
}
return suite;
}
}
并让gatherTestClasses()
方法处理要运行的测试类。
在JUnit 4中,documentation要求使用注解:@SuiteClasses({TestClass1.class, TestClass2.class...})
来构建我的测试套件。有许多SO答案显示了如何做到这一点。不幸的是,我看到的示例似乎不允许传递动态生成的TestClasses列表。
这个SO answer建议我必须子类化BlockJUnit4ClassRunner
,而我不想这样做。
动态指定的测试套件看起来一定在JUnit 4的某个地方。有人知道在哪里吗?
7条答案
按热度按时间nkhmeac61#
要创建一个动态测试套件,你需要使用
@RunWith
注解。有两种常用的方法来使用它:一个月一个月
这允许您指定哪些类组成所讨论的测试套件。这相当于JUnit 3样式:
等效的JUnit 4类为:
@RunWith(AllTests.class)
这允许您动态指定组成测试套件的测试。如果您的测试在运行时之前是未知的,则不能在注解中指定它们。您可以使用此结构来代替。因此,如果JUnit 3代码为:
对等的JUnit 4程式码为:
ycl3bljg2#
我已经在使用JUnit 4.8时尝试过了,它很有效:
h6my8fg23#
我发现在测试类上使用命名约定时,Classpath suite非常有用。
https://github.com/takari/takari-cpsuite
以下是一个示例:
lqfhib0f4#
我不知道gatherTestClasses()的作用是什么,但是假设它在Linux操作系统上返回一些测试,在Windows操作系统上返回不同的测试。
getOS()
和OperatingSystem
的实现是您的自定义代码。luaexgnf5#
下面是一个完整的例子,它结合了两个testCase类和一个suite。
1.示例仪器测试:
1.示例仪器测试2:
1.示例插入指令的套件:
请注意,您应该使用
@RunWith(JUnit4.class)
,而不是testCase类中的默认@RunWith(AndroidJUnit4.class)
vh0rcniy6#
juzqafwq7#
扩展@kissLife的答案,这里有一个你可以粘贴和运行的东西,它可以在运行中创建多个测试:
您将运行以下测试:
并得到以下错误: