如何在特定情况下运行特定的JUnit测试集?
我有一个专门在Eclipse中开发的Java代码库。 有一组JUnit4测试可以根据预期运行的时间分为两个互斥的子集:
- 当开发人员右键单击测试类(或包含项目)并选择Run As> JUnit Test时,应运行“标准”测试。 这里没什么不寻常的 – 这正是JUnit在Eclipse中的运作方式。
- “运行时”测试只应在应用程序在特定状态下启动时以编程方式调用时运行。
这两种类型的测试可能在同一Java包中彼此相邻。 (理想情况下,我们可以将它们混合在同一个类中,尽管这不是一个很难的要求。)
我的第一个解决方案是使用新的@TestOnLaunch
注释来注释“运行时”测试类。 应用程序能够找到这些类,并使用JUnitCore.run(Class...)
运行其中包含的测试(使用@Test
注释JUnitCore.run(Class...)
。 但是,这些测试会泄漏到上面的“标准”场景中,因为Eclipse测试运行器将运行使用@Test
注释的任何方法,而不管我的自定义类注释的意图如何。
接下来,我尝试将@TestOnLaunch
注释移动到方法级别。 这可以防止“运行时”测试“泄漏”到“标准”场景,但现在我似乎无法让JUnitCore
运行这些测试方法。 例如,使用针对正确类和方法的Request
run.(Request)
失败并显示“无可运行方法”,可能是因为它无法找到@Test
注释(因为它不在那里)。
我很想知道是否有解决这类问题的“JUnit方式”。 据推测,我可以编写自己的Runner
(运行使用@TestOnLaunch
注释的方法) – 这是正确的方法吗? 如果是这样,我如何以编程方式启动测试,类似于调用JUnitCore.run(Class...)
?
如果您不在同一测试类中混合使用两种类型的测试方法,则下面的内容可能有所帮助:
http://johanneslink.net/projects/cpsuite.jsp
您可以使用filterfunction来设置两个测试套件。
我通过定义几个标记接口在我的项目中设置了三个测试套件:
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解决方案,你可以在测试方法上注释你的类别接口(我在上面的例子中在测试类上注释了它) )。 但是,如果您选择第二个解决方案,则每次添加新测试类时都必须维护测试套件。
首先,您应该重新评估在运行时使用JUnit测试的原因; 对于可能有更好解决方案的问题来说,这似乎是一个奇怪的选择。
但是,您应该查看使用Filter
来确定要运行的测试,可能与自定义注释一起使用。