我有一个专门在Eclipse中开发的Java代码库。那里 是一组JUnit4测试,可以分为两个互斥 子集基于预期运行的时间:
这两种类型的测试可能在同一Java中彼此相邻 包。 (理想情况下,我们可以将它们混合在同一个类中 这不是一个严格的要求。)
我的第一个解决方案是使用new注释“Runtime”测试类
@TestOnLaunch
注释。该应用程序能够找到这些类,
并使用正在运行其中包含的测试(使用@Test
注释)
JUnitCore.run(Class<?>...)
。但是,这些测试漏入了
上面的“标准”场景,因为Eclipse测试运行器将运行任何
无论我的自定义类的意图如何,使用@Test
注释的方法
注释
接下来,我尝试将@TestOnLaunch
注释移动到方法级别。
这可以防止“运行时”测试“泄漏”到“标准”
方案,但现在我似乎无法让JUnitCore
运行这些测试
方法。 run.(Request)
Request
针对的是正确的班级
例如,假设方法失败了“没有可运行的方法”
因为它找不到@Test
注释(因为它不在那里)。
我很想知道是否有“JUnit方式”来解决这个问题
有点问题。据推测,我可以编写自己的Runner
(运行方法)
用@TestOnLaunch
注释 - 这是正确的方法吗?如果是这样,怎么做
然后我用一堆类以编程方式开始测试,
类似于致电JUnitCore.run(Class<?>...)
?
答案 0 :(得分:3)
如果您不在同一测试类中混合使用这两种类型的测试方法,则下面的内容可能有所帮助:
http://johanneslink.net/projects/cpsuite.jsp
您可以使用过滤器功能设置两个测试套件。
我通过定义几个标记接口在我的项目中设置了三个测试套件:
UnitTests,IntegrationTests,DeploySmokeTests,AcceptanceTests
三个测试套件:
@RunWith(ClasspathSuite.class)
@SuiteTypes({UnitTests.class, IntegrationTests.class})
public class CommitTestSuite {}
@RunWith(ClasspathSuite.class)
@SuiteTypes({DeploySmokeTests.class})
public class DeploySmokeTestSuite {}
@RunWith(ClasspathSuite.class)
@SuiteTypes({AcceptanceTests.class})
public class AcceptanceTestSuite {}
现在,您可以通过运行特定的测试套件来实现目标。另一种解决方案是使用junit类别:
@Category(IntegrationTests.class)
public class SomeTest {
@Test
public void test1() {
...
}
@Test
public void test2() {
....
}
}
@RunWith(Categories.class)
@IncludeCategory(UnitTests.class, IntegrationTests.class)
@SuiteClasses( { //all test classes })
public class CommitTestSuite {}
正如我所说,如果你在一个测试类中混合使用不同类型的测试方法,第一个测试类无法帮助你,但是通过使用seconde解决方案,你可以在测试方法上注释你的类别接口(我在测试类中注释了它)上面的例子)。但是,如果您选择第二个解决方案,则每次添加新测试类时都必须维护测试套件。
答案 1 :(得分:2)
首先,您应该重新评估在运行时使用JUnit测试的原因;对于可能有更好解决方案的问题,这似乎是一个奇怪的选择。
但是,您应该考虑使用Filter
来确定要运行的测试,可能与自定义注释一起使用。