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

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

部分来自我的行家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-批处理模式干净
  
  mvn-批处理模式编译
  
  mvn-批处理模式编译器:测试编译surefire:test -Dmaven.test.failure.ignore = true


当在命令行上准确地调用这些命令时,pitest可以正常工作。

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

命令行的日志输出:


  PIT >> FINE:最大可用内存为3609 mb
  
  PIT >> FINE:MINION:安装PIT代理
  
  PIT >> INFO:向小黄人发送13个测试类
  
  PIT >> INFO:发送测试给小黄人
  
  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个测试
  
  坑>>信息:小兵:08:51:20坑>>精细:运行1个单位
  
  PIT >> INFO:MINION:08:51:20 PIT >> FINE:收集测试的覆盖率描述[testClass = de.test.Tests,name = creation()]
  
  PIT >> FINE:覆盖范围生成器Minion退出正常
  
  PIT >> INFO:计算的覆盖范围(以0秒为单位)。
  
  PIT >> FINE:覆盖率计算后使用的内存42 mb
  
  PIT >> FINE:覆盖率计算后的可用内存201 mb
  
  [...变异输出剪切]


Jenkins-Pipeline的日志输出:


  PIT >> FINE:最大可用内存为1813 mb
  
  PIT >> FINE:MINION:安装PIT代理
  
  PIT >> INFO:向小黄人发送13个测试类
  
  PIT >> INFO:发送测试给小黄人
  
  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个测试
  
  坑>>信息:小兵:08:46:29坑>>精细:运行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] ----------------------------------------------- -------------------------
  [INFO]建立失败
  [INFO] ----------------------------------------------- -------------------------
  [INFO]总时间:3.644 s
  [INFO]结束于:2019-06-06T08:46:29 + 02:00
  [INFO] ----------------------------------------------- -------------------------
  [错误]无法在项目multiuploader上执行目标org.pitest:pitest-maven:1.4.8:mutationCoverage(default-cli):执行目标org.pitest:pitest-maven:1.4.8:mutationCoverage的default-cli失败:找不到突变。这可能意味着所提供的类路径或过滤器存在问题。
  [错误]有关更多详细信息,请参见http://pitest.org


因此,我只能假设环境有所不同-但是哪一个呢?还是说它是个臭虫?

最佳答案

最可能的问题是,在尚未编译测试的环境中,詹金斯正在执行pitest。

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

<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

10-01 21:32