2

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

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

这两种类型的测试可能在同一个 Java 包中彼此相邻。(理想情况下,我们可以将它们混合在同一个类中,尽管这不是硬性要求。)

我的第一个解决方案是使用新注释来注释“运行时”测试类 @TestOnLaunch。应用程序能够找到这些类,并@Test使用 JUnitCore.run(Class<?>...). 但是,这些测试会泄漏到上面的“标准”场景中,因为 Eclipse 测试运行器将运行任何带有 注释的方法@Test,而不管我的自定义类注释的意图如何。

接下来我尝试将@TestOnLaunch注释移动到方法级别。这可以防止“运行时”测试“泄漏”到“标准”场景中,但现在我似乎无法JUnitCore运行这些测试方法。run.(Request)例如,Request针对正确的类和方法,失败并显示“没有可运行的方法”,可能是因为它找不到@Test注释(因为它不存在)。

我很想知道是否有解决此类问题的“JUnit 方式”。大概我可以编写自己的Runner(运行用 注释的方法@TestOnLaunch)——这是正确的方法吗?如果是这样,那么我该如何使用一堆类以编程方式开始测试,类似于调用JUnitCore.run(Class<?>...)

4

2 回答 2

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 {}

正如我所说,如果你在一个测试类中混合不同的类型测试方法,第一个不能帮助你,但是通过使用第二个解决方案,你可以在测试方法上注释你的类别接口(我在上面的例子中的测试类上注释了它)。但是如果您选择第二种解决方案,则每次添加新测试类时都必须维护您的测试套件。

于 2013-09-09T01:23:26.213 回答
2

首先,您应该重新评估为什么在运行时使用 JUnit 测试;对于可能有更好解决方案的问题,这似乎是一个奇怪的选择。

但是,您应该考虑使用 aFilter来确定要运行哪些测试,可能与自定义注释一起使用。

于 2013-09-09T00:56:18.670 回答