当通过 IDE 手动运行测试失败时,我如何确定 Maven 构建成功的原因?

问题描述 投票:0回答:1

我有以下设置:

Apache Maven 3.8.1
Maven home: /Users/deyb/.sdkman/candidates/maven/current
Java version: 1.8.0_342, vendor: Azul Systems, Inc., runtime: /Users/myuser/.sdkman/candidates/java/8.0.342-zulu/zulu-8.jdk/Contents/Home/jre
Default locale: en_PH, platform encoding: US-ASCII
OS name: "mac os x", version: "12.3", arch: "aarch64", family: "mac"

jdk 和 maven 安装程序通过在 mac m1 中运行的 sdkman 安装。

在构建项目时,我得到了一个成功的 Maven 构建,显示所有测试均已通过且没有失败。 尽管显示失败的测试结果,但通过 ide 对预期失败的类之一触发单元测试,我无法弄清楚为什么它的行为不同。我期待它失败;但是 maven 构建仍然会导致构建成功

提供更多背景信息: 例如我有一个测试类:

com.sample.MySampleTest

单元测试片段

import junit.runner.Version;
...
Set<ConstraintViolation<MySample>> violations = validator.validate(dto);
        log.info("violations count >>> {}", violations.size());
        log.info("JUnit version is: " + Version.id());
        assertThat(violations, hasSize(1));

Maven 构建的日志:

08:04:22.880 [main] INFO  c.s.MySampleTest - violations count >>> 1
08:04:22.880 [main] INFO  c.s.MySampleTest - JUnit version is: 4.12
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 sec

来自 IDE 的日志导致测试失败:

08:05:03.431 [main] INFO  c.s.MySampleTest - violations count >>> 0
08:05:03.431 [main] INFO  c.s.MySampleTest - JUnit version is: 4.12

java.lang.AssertionError: 
Expected: a collection with size <1>
     but: collection size was <0>

    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:956)
    at org.junit.Assert.assertThat(Assert.java:923)

我尝试了以下并得到了这些行为:

  • 通过 sdk-man 结果将 intellij(捆绑)和 maven 的 maven 版本匹配到非失败的 maven 构建(预期失败但日志显示所有测试运行 0 失败)
  • 删除了所有 mvn 安装,将其替换为 IDE 中捆绑的版本(将 intellij 插件的路径添加到 zshrc)结果成功构建了 maven
    export PATH="$PATH:/Applications/IntelliJ IDEA CE.app/Contents/plugins/maven/lib/maven3/bin"
    ;也做了
    chmod
    以获得正确的许可,但结果是一样的
  • run all tests
    通过
    com.sample
    包中的 intelliJ 显示 MySampleTest 中的测试失败(这是正确的行为)
  • run all tests
    通过在
    com
    包上执行的 intellj 显示 MySampleTest 中的测试失败(这是正确的行为)
  • run all tests
    通过在模块级别执行的 intellj 在 MySampleTest 中显示失败的测试(这是正确的行为)
  • 使用 brew 重新安装 mvn 安装;获得成功的 maven 构建
  • .m2
    存储库中删除了 junit 目录以重新下载并做了
    mvn clean install
    也导致成功构建
  • 使用 linux 机器作为构建服务器来运行
    mvn clean install
    构建失败的结果指出失败的测试
  • 添加了一个简单的测试
    Assert.assertEquals(true, false);
    并通过 Maven 结果运行它到失败的构建(这是预期的,但只报告了简单的测试,而不是来自
    MySampleTest
    的测试)
  • junit 版本也在模块 pom 中明确声明(使用
    junit.runner.Version.id()
    测试以确保匹配版本)

鉴于这些行为,是否有任何其他方法可以确定是什么导致通过 maven cli 进行包/安装成功,即使测试失败并且没有被跳过?

macos maven intellij-idea junit maven-3
1个回答
0
投票

就程序而言,不,它几乎是反复试验。但是,这里还有一些可以尝试的东西,其中一些可能与您的特定测试相关,也可能不相关:

  1. 检查你实际上运行的是相同的代码——即不是之前在错误的目录或错误的分支中检出的代码,等等(我知道这听起来很愚蠢,但经常出现问题)
  2. 同样检查它可能加载的任何测试数据是否相同
  3. CLASSPATH 设置是否相同?
  4. 同上引用的任何其他环境变量或外部资源。例如如果这不是沼泽标准集合而是来自 ORM 的东西,那么它是否在幕后与同一个数据库对话?
  5. 检查测试是否存在订购问题。也就是说,如果您在 IDE 中以不同的顺序运行它们,您会得到不同的行为吗?
  6. 如果这是一个多模块 Maven 项目?如果是这样,如果在模块级别以不同的顺序运行测试是否有效?
  7. Charsets - 里面有什么字符串敏感的吗?如果是这样,字符集设置是否一致? (到处使用 UTF-8 很有帮助)
  8. 有没有时间敏感的东西。例如如果代码被 IDE 或 maven 延迟,那会是一个因素吗?
© www.soinside.com 2019 - 2024. All rights reserved.