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

时间:2013-09-09 00:52:50

标签: java eclipse junit

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

  1. 当开发人员右键单击测试时,应运行“标准”测试 class(或包含项目)并选择Run As> JUnit测试。没有 这里很不寻常 - 这正是JUnit在Eclipse中的工作原理。
  2. “运行时”测试只应在以编程方式调用时运行 在应用程序中以特定状态启动时。
  3. 这两种类型的测试可能在同一Java中彼此相邻 包。 (理想情况下,我们可以将它们混合在同一个类中 这不是一个严格的要求。)

    我的第一个解决方案是使用new注释“Runtime”测试类 @TestOnLaunch注释。该应用程序能够找到这些类, 并使用正在运行其中包含的测试(使用@Test注释) JUnitCore.run(Class<?>...)。但是,这些测试漏入了 上面的“标准”场景,因为Eclipse测试运行器将运行任何 无论我的自定义类的意图如何,使用@Test注释的方法 注释

    接下来,我尝试将@TestOnLaunch注释移动到方法级别。 这可以防止“运行时”测试“泄漏”到“标准” 方案,但现在我似乎无法让JUnitCore运行这些测试 方法。 run.(Request) Request针对的是正确的班级 例如,假设方法失败了“没有可运行的方法” 因为它找不到@Test注释(因为它不在那里)。

    我很想知道是否有“JUnit方式”来解决这个问题 有点问题。据推测,我可以编写自己的Runner(运行方法) 用@TestOnLaunch注释 - 这是正确的方法吗?如果是这样,怎么做 然后我用一堆类以编程方式开始测试, 类似于致电JUnitCore.run(Class<?>...)

2 个答案:

答案 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来确定要运行的测试,可能与自定义注释一起使用。