Skip to content

Jenkins - 单元测试

集成单元测试是 CI(Continuous Integration)的基础。Jenkins 可以轻松地将单元测试作为 Pipeline 的一部分运行并可视化结果。

Jenkins 依赖构建工具(如 Maven、Gradle、Ant、npm、pip)来执行测试,并依赖测试框架(如 JUnit、TestNG、NUnit、pytest、Jest)来运行测试并生成报告文件,通常采用 XML 格式。

常见场景:使用 Maven/Gradle 的 Java 单元测试

Section titled “常见场景:使用 Maven/Gradle 的 Java 单元测试”

大多数 Java 项目使用 Maven 或 Gradle 进行构建和依赖管理。这些工具内置支持在构建生命周期中运行 JUnit 或 TestNG 测试。

  • Maven: Surefire 插件在 test 阶段(mvn test 或 mvn package)运行单元测试。它在 target/surefire-reports 中生成 XML 报告。
  • Gradle: 内置的 test 任务运行测试(通常默认为 JUnit)。它在 build/test-results/test 中生成 XML 报告,并在 build/reports/tests/test 中生成 HTML 报告。

此过程涉及您的 Jenkinsfile 中的两个主要步骤:

  1. 执行测试: 使用构建步骤(sh 或 bat)调用构建工具的测试命令。

  2. 发布结果: 使用 junit 步骤(由 JUnit 插件提供,默认已安装)解析生成的 XML 报告并在 Jenkins UI 中显示它们。

示例:使用 Maven 的 Declarative Pipeline

Section titled “示例:使用 Maven 的 Declarative Pipeline”
pipeline {
agent any // 或者使用配置了 Java/Maven 的特定 agent
stages {
stage('Build & Unit Test') {
steps {
echo 'Compiling and running unit tests...'
// 使用 'mvn clean test' 或 'mvn clean verify'
// 如果配置了集成测试,'verify' 也会运行集成测试
sh 'mvn clean test'
}
}
// 其他阶段,如 Integration Test、Deploy...
}
post {
always {
echo 'Publishing test results...'
// 告诉 Jenkins 在哪里找到 JUnit XML 报告
junit 'target/surefire-reports/**/*.xml'
}
// 您可以在此处添加成功/失败时的特定操作
success {
echo 'Unit tests passed!'
}
failure {
echo 'Unit tests failed!'
// 可能发送通知
}
}
}

示例:使用 Gradle 的 Declarative Pipeline

Section titled “示例:使用 Gradle 的 Declarative Pipeline”
pipeline {
agent any // 或者使用配置了 Java/Gradle 的特定 agent
stages {
stage('Build & Unit Test') {
steps {
echo 'Compiling and running unit tests...'
// 确保 gradlew 有执行权限
sh 'chmod +x ./gradlew'
sh './gradlew build' // 'build' 任务通常包含 'test'
// 或者明确指定:sh './gradlew test'
}
}
}
post {
always {
echo 'Publishing test results...'
// JUnit 插件也会读取 Gradle 的 XML 输出
junit '**/build/test-results/test/*.xml'
// 可选:发布 HTML 报告以便轻松查看
publishHTML(target: [
allowMissing: true,
alwaysLinkToLastBuild: true,
keepAll: false, // 节省空间,只保留最新的
reportDir: 'build/reports/tests/test',
reportFiles: 'index.html',
reportName: 'Gradle Test Report'
])
}
}
}

构建运行后,junit 步骤处理报告后:

  • 构建状态将反映测试失败(Unstable 或 Failed)。
  • 构建页面上会出现一个“测试结果”链接。
  • 点击“测试结果”会显示摘要:总测试数、失败数、跳过数。
  • 您可以深入查看特定的包、类和失败的测试方法,通常可以直接在 Jenkins 中看到堆栈跟踪(stack traces)。
  • 一个“测试结果趋势”图显示了近期构建的通过/失败历史记录。

Blue Ocean UI 通常提供一种更现代化、更具视觉吸引力的方式来在 Pipeline 视图中直接查看集成后的测试结果。

其他生态系统的模式类似:

  • JavaScript (Jest/Mocha): 使用 npm test 或 yarn test 运行测试。将您的测试运行器配置为输出 JUnit XML 报告(例如,使用 jest-junit)。在 Jenkins 中使用 junit 步骤。
  • .NET (NUnit/MSTest): 使用 dotnet test 运行测试。将其配置为生成 trx 或 JUnit XML 报告。使用 junit 步骤或如果可用,使用专用的插件。
  • Python (pytest/unittest): 使用 pytest 或 python -m unittest 运行测试。配置 pytest 生成 JUnit XML(pytest --junitxml=report.xml)。使用 junit 步骤。

始终检查您的测试框架是否能生成 JUnit XML 格式的报告,因为这是 Jenkins 最能普遍理解的格式。