如何在特定情况下运行特定的JUnit测试集?

我有一个专门在Eclipse中开发的Java代码库。 有一组JUnit4测试可以根据预期运行的时间分为两个互斥的子集:

  1. 当开发人员右键单击测试类(或包含项目)并选择Run As> JUnit Test时,应运行“标准”测试。 这里没什么不寻常的 – 这正是JUnit在Eclipse中的运作方式。
  2. “运行时”测试只应在应用程序在特定状态下启动时以编程方式调用时运行。

这两种类型的测试可能在同一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来确定要运行的测试,可能与自定义注释一起使用。