【问题标题】:Do not run a category of slow JUnit tests by default in Maven and every IDE (Eclipse, IntelliJ, ...) without an explicit TestSuite默认情况下,不要在没有明确的 TestSuite 的情况下在 Maven 和每个 IDE(Eclipse、IntelliJ、...)中运行一类慢速 JUnit 测试
【发布时间】:2013-03-30 06:33:40
【问题描述】:

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

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

JUnit 的 categories 似乎非常适合:我用 @Category(SlowTests.class) 注释了那些缓慢的测试。问题是它们仍在运行,因为:

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

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

【问题讨论】:

  • IntelliJ IDEA 特定的解决方案是将这些测试移动到一个单独的模块中,以便您的主模块不依赖于它,然后将所有测试的类路径设置的测试运行配置共享给您的正常模块测试,除非您为此慢速测试模块类路径创建特定的运行配置,否则慢速测试将永远不会运行。

标签: eclipse junit intellij-idea jenkins maven-3


【解决方案1】:

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

【讨论】:

  • 适用于 maven,但问题是 Eclipse 和 IntelliJ 仍会尝试运行这些测试,因为它们位于 src/test/java 中。
  • 通常你只在 Eclipse/IntelliJ 中运行一些测试而不是全部。所以我真的不认为有问题。
  • 我们的贡献者习惯于在发送拉取请求之前在 Eclipse/IntelliJ 中运行所有测试。教育他们包含/排除哪些测试非常耗时。在实践中,即使只是 README 也很难让他们阅读:默认情况下它应该可以正常工作。但是,如果他们不能轻松地在本地运行非慢速测试,他们更有可能发送错误的拉取请求并浪费他们的时间和我的时间。
【解决方案2】:

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

使用 Maven 从 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>

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

正如我在a blogpost 中所写的那样,在 JUnit 的当前版本中维护测试套件确实是太多的工作。我还解释了a library called 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 文件。

【讨论】:

  • 有趣,可惜它默认不适用于 Eclipse 和 IntelliJ。
【解决方案3】:

在 Maven、IntelliJ 和 Eclipse 中默认工作

import static org.junit.Assume.assumeTrue;

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

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

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

【讨论】:

  • 您可以将@Ignore 放在您的@Test 附近,效果相同,但没有长堆栈跟踪...
  • @dant3 查看为什么不满足我们的要求的问题。我们仍然希望在 jenkins 服务器上构建压力作业时运行这些压力测试。 Ignore 总是会忽略它们。
  • 这意味着我需要在每个测试方法中使用这个假设真语句......我的理解正确吗?
  • 是的,在每个“慢速测试方法”中。我称它们为“乌龟测试”并使用 -DrunTurtleTests=true 激活它们。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2023-01-09
  • 2011-08-11
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多