在Jenkins中生成CTest结果(xUnit> = 1.58)

时间:2014-02-07 17:06:35

标签: jenkins cmake ctest

似乎这很容易在jenkins中集成CMake + CTest。 cmakebuilder插件非常容易配置(只需设置源树和构建树,完成!)。但是我无法理解如何调用CTest步骤。

根据主xUnit page,自版本1.58起,支持CTest的XML输出,请参阅bug report

这就是我能找到的所有文件。当我在google或stackoverflow上搜索时,我只能找到需要手动步骤的非常旧的文档。

我想知道如何使用xUnit(1.81)设置最近的jenkins(1.532.1)。我应该创建一个“添加构建步骤”吗?我应该创建一个“构建后动作”吗?我需要填写什么才能让CTest运行并生成正确的XML文件,以便jenkins可以集成它们?

2 个答案:

答案 0 :(得分:43)

这是一个小例子,演示如何让xUnit选择CTest生成的XML测试结果文件。该示例由单个C ++源文件main.cpp

组成
#include <cstdlib>
int main() {
    std::exit(-1);
}

以及随附的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(JenkinsExample)
enable_testing()
add_executable(main main.cpp)
add_test(test1 main)
add_test(test2 main)
set_tests_properties(test2 PROPERTIES WILL_FAIL ON)

CMake列表文件生成可执行文件main并从两个CMake测试中运行此可执行文件,出于演示目的,一个将始终失败,另一个将始终成功。

使用Jenkins,设置新作业并添加新的cmakebuilder构建步骤。将CMake源目录指向包含本地计算机上的示例项目的文件夹。 CMake构建目录应设置为build。这将使Jenkins在作业的工作空间目录中创建一个CMake构建文件夹。设置Clean Build标志以使作业始终以干净状态开始是个好主意。

然后,假设您正在运行Unix,请添加Execute shell作业步骤并在Command框中输入以下shell脚本:

cd build
/usr/local/bin/ctest --no-compress-output -T Test || /usr/bin/true

使用选项ctest运行-T Test将使CTest在构建文件夹内的子文件夹Testing中生成XML输出文件,该文件可由{{1然后在后期构建操作中插件。如果某些测试失败,xUnit是必要的,以防止Jenkins过早地中止构建(不运行xUnit插件)。

如果您使用的是Windows,请改为设置类似的|| /usr/bin/true作业步骤:

Execute Windows batch command

最后,必须按以下方式配置cd build "C:\Program Files (x86)\CMake 2.8\bin\ctest.exe" --no-compress-output -T Test || verify > NUL 插件:

添加xUnit构建后操作,然后使用插件的Publish xUnit test result report按钮创建Add测试结果报告。在CTest-Version中输入文件模式CTest-Version (default) Pattern

答案 1 :(得分:4)

对于那些希望在Jenkins声明式管道中解析CTest输出的用户,您现在可以使用xUnit plugin轻松地完成此操作,因为它可以直接解析CTest输出。

Jenkinsfile中添加一个阶段以在构建目录中运行ctest,并添加一个post阶段以使用xUnit处理输出。这是一个基本示例:

pipeline {
  agent any
  stages {
    stage('Configure') {
      steps {
        dir('build') {
          sh 'cmake ../'
        }
      }
    }
    stage('Build') {
      steps {
        dir('build') {
          sh 'cmake --build .'
        }
      }
    }  
    stage('Test') {
      steps {
        dir('build') {
          sh 'ctest -T test --no-compress-output'
        }
      }
    }
  }
  post {
    always {
      // Archive the CTest xml output
      archiveArtifacts (
        artifacts: 'build/Testing/**/*.xml',
        fingerprint: true
      )

      // Process the CTest xml output with the xUnit plugin
      xunit (
        testTimeMargin: '3000',
        thresholdMode: 1,
        thresholds: [
          skipped(failureThreshold: '0'),
          failed(failureThreshold: '0')
        ],
      tools: [CTest(
          pattern: 'build/Testing/**/*.xml',
          deleteOutputFiles: true,
          failIfNotNew: false,
          skipNoTestFiles: true,
          stopProcessingIfError: true
        )]
      )

      // Clear the source and build dirs before next run
      deleteDir()
    }
  }
}

有关如何在声明性管道中配置xUnit插件的示例,Jenkins Snippets Generator是非常有用的资源。