如何在 JUnit 4 中动态创建测试套件?
我想使用 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 中,文档 表示使用注释:@SuiteClasses( {TestClass1.class, TestClass2.class...})
来构建我的测试套件。有许多答案展示了如何做这个。不幸的是,我看到的示例似乎不允许传递动态生成的 TestClasses 列表。
这个所以答案 建议我必须对 BlockJUnit4ClassRunner
进行子类化,但我不想这样做。
动态指定的测试套件似乎必须存在于 JUnit 4 的某个地方。有谁知道在哪里吗?
I would like to create a junit test suite using JUnit 4 where the names of the test classes to be included are not known until the test suite is run.
In JUnit 3 I could do this:
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;
}
}
and let the gatherTestClasses()
method deal with figuring out what test classes to run.
In JUnit 4, the documentation says to use an annotation: @SuiteClasses({TestClass1.class, TestClass2.class...})
to build up my test suite. There are numerous SO answers showing how to do this. Unfortunately the examples I see do not seem to allow for passing a dynamically generated list of TestClasses.
This SO answer suggested I would have to subclass BlockJUnit4ClassRunner
which I do not want to do.
Dynamically specified test suites seem like something that must be in JUnit 4 somewhere. Does anyone know where?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
要创建动态测试套件,您需要使用
@RunWith
注释。有两种常见的使用方法:@RunWith(Suite.class)
这允许您指定哪些类组成了相关的测试套件。这相当于 JUnit 3 样式:
等效的 JUnit 4 类将为:
@RunWith(AllTests.class)
这允许您动态指定测试,这些测试组成测试套件。如果您的测试直到运行时才知道,则无法在注释中指定它们。您可以改用此结构。因此,如果 JUnit 3 代码是:
等效的 JUnit 4 代码将是:
To create a dynamic test suite, you need to use the
@RunWith
annotation. There are two common ways to use it:@RunWith(Suite.class)
This allows you to specify, which classes compose the test suite in question. This is equivalent to the JUnit 3 style:
The equivalent JUnit 4 class will be:
@RunWith(AllTests.class)
This allows you to dynamically specify the tests, which compose the test suite. If your tests are not known until runtime, you cannot specify them in the annotations. You can use this construction instead. So, if the JUnit 3 code is:
The equivalent JUnit 4 code will be:
我已经使用 JUnit 4.8 尝试过,它有效:
I've tried this using JUnit 4.8 and it works:
我发现类路径套件在与测试类的命名约定一起使用时非常有用。
https://github.com/takari/takari-cpsuite
这是一个示例:
I found Classpath suite quite useful when used with a naming convention on my test classes.
https://github.com/takari/takari-cpsuite
Here is an example:
我不确定 GatherTestClasses() 的作用,但假设它在操作系统为 Linux 时返回一些测试,在操作系统为 Windows 时返回不同的测试。您可以使用 假设 在 JUnit 4.4 中复制这一点:
< code>getOS() 和
OperatingSystem
是您的自定义代码。I'm not sure what gatherTestClasses() does, but let's say it returns some tests when the OS is Linux and different tests when the OS is Windows. You can replicate that in JUnit 4.4 with assumptions:
The implementation of
getOS()
andOperatingSystem
being your custom code.这是一个如何实现它的完整示例。它结合了两个测试用例类和一个套件。
示例仪器测试:
ExampleInstrumentedTest2:
ExampleInstrumentedSuite:
请注意,您应该使用
@RunWith(JUnit4.class)
而不是默认的@RunWith(AndroidJUnit4.class)< /code> 在 testCase 类中
Here is a Complete example how to implement that. it combines of two testCase classes and one suite.
ExampleInstrumentedTest:
ExampleInstrumentedTest2:
ExampleInstrumentedSuite:
Note that you should use
@RunWith(JUnit4.class)
instead of default@RunWith(AndroidJUnit4.class)
in testCase Class扩展 @kissLife 的答案,您可以粘贴并运行以下内容,它可以动态创建多个测试:
您将运行这些测试:
并收到此错误:
Expanding on @kissLife's answer, here's a something you can paste and run that creates multiple tests on the fly:
You'll run these tests:
and get this error: