【问题标题】:Junit 5 performing tests in maven build even when not annotated即使没有注释,Junit 5 在 Maven 构建中执行测试
【发布时间】:2019-10-02 07:41:13
【问题描述】:

在准备 在 maven 上发布release:prepare)时,我评论了一些我不想执行的测试,但它们无论如何都会执行,甚至完全执行从方法中删除 @Test 注释。

注意:请考虑在 maven 发布期间忽略跳过测试选项

构建是在 Eclipse 下使用 以下环境进行的:
- Apache Maven 3.5.4 外部运行时(不是嵌入在 Eclipse 中的)
- Java JDK 1.8.0_151
- maven-compiler-plugin 3.0
- maven-release-plugin 2.5.3
- junit-jupiter-api 5.5.2
- junit-jupiter-engine 5.5.2

通常为了跳过测试我只注释注释:

    //@Test
    public void testIwantToSkip() {
        assertTrue(true);
    }

目前我发现跳过测试的唯一方法是注释整个方法,但我希望它只在注释注释时被跳过,就像在 Junit 4 上发生的那样。

更新
我也尝试使用@Disable 注释,不幸的是没有结果。示例:

@Test
@Disabled
public void testAuditMapper() {
    ....
}

可能的解决方案
经过几次测试并感谢 Kayaman 的提示,我发现在 Maven 构建下,注释被完全忽略,只有以“test”开头的方法将被执行,其他的将被完全忽略,不管注释。例如:

@Test
public void someThing() {
    // will NOT be executed....
}

@Disabled
public void testSomeThing() {
    // will be executed....
}

最终解决方案
在我的 pom 的构建部分中,没有指定 surefire 插件,因此生成的 pom 使用的是该插件的 2.12.4 版本。通过在构建部分添加:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
</plugin>

一切都按预期进行。感谢@asa 的提示。

【问题讨论】:

  • 你在注释掉测试后是否重新编译了项目?
  • 当然,我也尝试执行干净+安装目标,没有跳过测试选项,并且无论如何都会执行注释测试。我认为 Junit5 对公共方法进行自省,并将其视为测试,而不考虑注释。
  • 如果您将方法重命名为iWantToSkip(),它还会运行吗?过去,测试方法由方法开头的test 标识,因此这可能是向后兼容性问题。也许可以在配置中禁用它。
  • 它们是 built 还是 run
  • @Raedwald 我想我现在得到了你的问题:如果我直接作为 Junit 运行测试,它可以正常工作,评论测试注释和使用禁用注释。它仅在 Maven 构建下“失败”

标签: java maven junit5


【解决方案1】:

尝试使用@Ignore 注解。

@Test
@Ignore("optional comment explaning the reason")
public void testIwantToSkip() {
    assertTrue(true);
}

【讨论】:

  • 感谢您的提示。实际上 (at)Ignore 注释在 Junit5 中不可用,而另一个应该以相同的方式工作:(at)Disabled。刚刚测试了但是没有结果,反正测试还是执行了。
【解决方案2】:

如果您在 release:perform 目标期间遇到问题,您将无法更改您的 java 类。 通常,执行目标在发布:准备阶段采用您的 SCM 中提交的类。 在这个阶段,您唯一的选择是在执行阶段禁用所有测试,或者从准备目标回滚提交,并使用 Junit5 的条件测试功能来调节它们的执行。

更新的解决方案:

maven 项目使用的是默认版本的 surefire 插件(用于单元测试),而不是解决 JUnit 5 一些问题的较新版本。

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-report-plugin</artifactId>
        <version>3.0.0-M3</version>
</plugin>

注意:使用以下插件非常方便地确保项目使用最新版本的依赖项,但最重要的是最新构建的:

https://www.mojohaus.org/versions-maven-plugin/

【讨论】:

  • 感谢 asa,我在发布期间进行了测试:准备使用 DryRun 选项,每次都在 SVN 上提交。
  • 这很奇怪,因为我自己对标记为禁用的测试没有问题。我从您的描述中看到的唯一区别是我使用的 Maven 版本(3.6.2),但这不应该是相关的。唯一相关的部分是surefire插件(我想我记得旧版本的插件和junit5的一些问题)我在我的项目中使用的是3.0.0-M3版本
  • 我会说 已解决 @asa。我从来没有在我的maven poms下指定surefire插件,所以surefire插件的结果版本是2.12.4(我认为是嵌入式的)。现在我尝试将 3.0.0-M3 版本添加到 pom 中,它的工作方式完全符合我的预期:所有注释都被正确解释,如果我从一个方法中留下测试注释,甚至命名为“testSomeThing”,它不会被执行。我邀请您编辑您的消息作为解决方案,以便我投票。
  • 完成。我还添加了一个指向我在项目中使用的非常有价值的插件的链接,以确保每件事都保持最新。无论如何,我很高兴你被分类了。玩得开心!
【解决方案3】:

关于你的笔记:

对于发布插件,您需要间接指定内部构建的所有选项,方法是将它们包装到

-Darguments="..."

【讨论】:

  • 感谢它的工作,并帮助了我很多。这不是最佳实践,因为跳过了所有测试;我希望 Disabled 注释能够正常工作,但您的提示是一种更快的解决方法(比完全注释某些测试更快)。
猜你喜欢
  • 2019-04-25
  • 2016-02-22
  • 2019-11-03
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多