17

我有一组非常慢的测试,需要一周的时间才能运行。(他们实际上是在大约一周内不间断地运行一些代码)。

自然,没有开发人员(甚至是默认的构建作业)想要运行这些测试。只有特定的、单独的构建作业才有时间运行它们。所以这些测试需要默认禁用

JUnit 的类别似乎非常适合这一点:我用@Category(SlowTests.class). 问题是它们仍在运行,因为:

  • 我不想维护 TestSuite 类,因为我们每天都添加测试。我有 0 个 TestSuite 类:Maven、IntelliJ 和 Eclipse 只运行我模块中的所有测试类。包括所有那些缓慢的测试。
  • 即使我们有 TestSuite 类,大多数开源贡献者仍然会尝试从 IntelliJ 或 Eclipse 运行所有测试类,认为它挂起并放弃运行测试。默认情况下需要排除那些缓慢的测试。最好不要在 IntelliJ 或 Eclipse 中进行任何额外配置。

默认情况下,如何在不使用显式 TestSuite 的情况下排除一类慢速 JUnit 测试?

4

3 回答 3

10

默认情况下,这在 Maven、IntelliJ 和 Eclipse 中有效

import static org.junit.Assume.assumeTrue;

@Test
public void mySlowTest() {
    assumeTrue("true".equals(System.getProperty("runSlowTests")));
    ...
}

无论如何要运行它们,只需添加 VM 参数-DrunSlowTests=true

从语义上讲,这是完全错误的。但它有效:)

于 2013-04-08T14:04:55.320 回答
7

据我所知,默认情况下无法阻止 Eclipse 运行某些测试。

从 Maven 运行某些类别很容易使用

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <excludedGroups>${tests.exclude}</excludedGroups>
    </configuration>
</plugin>

然后tests.exclude在某些 Maven 配置文件中定义。

正如我在一篇博文中所写的那样,使用当前版本的 JUnit 维护 JUnit 中的测试套件确实需要做太多的工作。我还解释了一个名为 cpsuite 的库如何自动为您执行套件管理,如下所示:

@RunWith(ClasspathSuite.class) // Loads all unit tests it finds on the classpath
@ExcludeBaseTypeFilter(SlowTest.class) // Excludes tests that inherit SlowTest
public class FastTests {}

但是,在这两种方法中,默认情况下 Eclipse 仍将只运行所有带有@Test注释的 Java 文件。

于 2013-04-08T13:22:25.280 回答
1

为什么不从运行缓慢的测试中进行集成测试。使用 maven-failsafe-plugin 可以通过不同的命名约定来处理这种情况。例如 *IT.java 这是Themen long runnin 测试。此外,我建议将激活放入分析器中,以便每个人都可以控制是否运行这些测试,这应该是默认设置

于 2013-04-08T10:14:33.927 回答