【问题标题】:Why does pitest work with maven on the commandline, but not in Jenkins-Pipeline?为什么 Pitest 在命令行上与 maven 一起工作,但在 Jenkins-Pipeline 中却不行?
【发布时间】:2019-06-07 06:50:47
【问题描述】:

我在这里遇到一个奇怪的问题,我找不到原因:

在命令行上使用 ptest 和 maven(和 java 11)时,它可以按预期工作,但是当通过声明性管道在 Jenkins-Server 上运行它时,会导致错误。

来自我的 maven pom:

<build>
  <plugins>
    <plugin>
      <groupId>org.pitest</groupId>
      <artifactId>pitest-maven</artifactId>
      <version>1.4.8</version>
      <dependencies>
        <dependency>
          <groupId>org.pitest</groupId>
          <artifactId>pitest-junit5-plugin</artifactId>
          <version>0.8</version>
        </dependency>
      </dependencies>
      <configuration>
        <verbose>true</verbose>
      </configuration>
    </plugin>
  </plugins>
</build>

来自我的 Jenkinsfile:

stage('MutationTesting')
 {
  steps
   {
    bat 'mvn --batch-mode org.pitest:pitest-maven:mutationCoverage'
   }
 }

在此之前,将从管道中调用以下 maven 命令:

mvn --batch-mode clean

mvn --batch-mode 编译

mvn --batch-mode compiler:testCompile surefire:test -Dmaven.test.failure.ignore=true

在命令行上准确调用这些命令时,pitest 可以完美运行。

比较记录结果时,它们几乎相等。

命令行的日志输出:

PIT >> FINE:最大可用内存为 3609 mb

PIT >> FINE : MINION : 安装 PIT 代理

PIT >> INFO : 向 minion 发送 13 个测试类

PIT >> INFO : 向 minion 发送测试

PIT >> INFO : MINION : 08:51:20 PIT >> FINE : 期待来自父级的 13 个测试类

PIT >> FINE : 接收到的测试类

PIT >> INFO : 检查环境

PIT >> INFO : MINION : 08:51:20 PIT >> INFO : 找到 1 个测试

PIT >> INFO : MINION : 08:51:20 PIT >> INFO : 依赖分析将潜在测试的数量减少了 0

PIT >> INFO : MINION : 08:51:20 PIT >> INFO : 收到 1 个测试

PIT >> INFO : MINION : 08:51:20 PIT >> FINE : 运行 1 个单位

PIT >> INFO : MINION : 08:51:20 PIT >> FINE : 收集测试覆盖率描述 [testClass=de.test.Tests, name=creation()]

PIT >> FINE : Coverage generator Minion 退出 ok

PIT >> INFO : 0 秒内计算的覆盖率。

PIT >> FINE : 覆盖计算后使用的内存 42 mb

PIT >> FINE : 覆盖计算后的可用内存 201 mb

[...突变输出切割]

Jenkins-Pipeline 的日志输出:

PIT >> FINE:最大可用内存为 1813 mb

PIT >> FINE : MINION : 安装 PIT 代理

PIT >> INFO : 向 minion 发送 13 个测试类

PIT >> INFO : 向 minion 发送测试

PIT >> INFO : MINION : 08:46:28 PIT >> FINE : 期待来自父级的 13 个测试类

PIT >> FINE : 接收到的测试类

PIT >> INFO : 检查环境

PIT >> INFO : MINION : 08:46:29 PIT >> INFO : 找到 1 个测试

PIT >> INFO : MINION : 08:46:29 PIT >> INFO : 依赖分析将潜在测试的数量减少了 0

PIT >> INFO:MINION:08:46:29 PIT >> INFO:收到 1 个测试

PIT >> INFO : MINION : 08:46:29 PIT >> FINE : 运行 1 个单位

PIT >> INFO : MINION : 08:46:29 PIT >> FINE : 收集测试覆盖率描述 [testClass=de.test.Tests, name=creation()]

PIT >> FINE:覆盖生成器 Minion 退出正常 PIT >> INFO : 1 秒内计算的覆盖率。 PIT >> FINE:覆盖计算后使用的内存 43 mb PIT >> FINE:覆盖计算后的可用内存 177 mb PIT >> INFO : 创建了 0 个变异测试单元 [信息] --------------------------------------------- ------------------------- [信息] 构建失败 [信息] --------------------------------------------- ------------------------- [INFO] 总时间:3.644 秒 [INFO] 完成时间:2019-06-06T08:46:29+02:00 [信息] --------------------------------------------- ------------------------- [错误] 无法在项目 multiuploader 上执行目标 org.pitest:pitest-maven:1.4.8:mutationCoverage (default-cli):执行目标 org.pitest:pitest-maven:1.4.8:mutationCoverage 的默认 cli 失败:未发现突变。这可能意味着提供的类路径或过滤器存在问题。 [错误] 详情请见http://pitest.org

所以我只能假设环境有所不同 - 但哪一个?或者它是一个最糟糕的错误?

【问题讨论】:

    标签: java maven unit-testing jenkins-pipeline pitest


    【解决方案1】:

    最可能的问题是 jenkins 在尚未编译测试的环境中执行 ptest。

    最可靠的方法是将 ptest 绑定到配置文件中的测试阶段,而不是直接调用目标。

    <profile>
      <id>pitest</id>
        <build>
          <plugins>
            <plugin>
              <groupId>org.pitest</groupId>
              <artifactId>pitest-maven</artifactId>
              <version>1.4.8</version>
              <executions>
                <execution>
                  <id>pitest</id>
                  <phase>test</phase>
                  <goals>
                    <goal>mutationCoverage</goal>
                  </goals>
                </execution>
              </executions>  
            </plugin>
          </plugins>
    

    Pitest 然后可以运行

    mvn -Ppitest test
    

    【讨论】:

    • 能否详细解释一下为什么在未编译测试的环境中执行pitest?正如我所描述的,我的管道已经编译了测试。
    • 我不能因为(如果这是正在发生的事情)这是环境/詹金斯的问题。
    • 我确信测试已经在 jenkins 环境中编译 - 更多信息请查看我的问题 stackoverflow.com/questions/55183989/… 这证明了这一点,因为我运行像 SpotBugs/FindBugs 这样的工具也需要编译代码。
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 2019-11-27
    • 2018-06-21
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多