Skip to content

Jenkins - 自动化测试

自动化测试是持续集成(Continuous Integration,CI)的基石。Jenkins 擅长将各种类型的自动化测试集成到构建 Pipeline 中,从而快速反馈代码质量。

目标是在不同阶段客观地验证构建质量。Jenkins 本身不执行测试,但它协调测试工具和框架的执行,然后收集并呈现结果。

这些测试独立隔离的单个组件(类、方法)。它们通常速度快,并且运行频繁。

  • 工具: JUnit (Java)、TestNG (Java)、NUnit (.NET)、pytest (Python)、Jest (JavaScript)、Go testing 包。
  • 集成: 使用构建工具(Maven、Gradle、npm、pip、go test)作为构建阶段(build stage)的一部分来执行单元测试。
  • Jenkins: 在 Pipeline 步骤(Pipeline step)中利用构建工具集成(例如,mvn test、gradle test、npm test)。使用 junit 等步骤(针对 JUnit/TestNG XML 报告)发布结果,以便在 Jenkins 中显示趋势和详细报告。有关详细信息,请参阅“单元测试集成”章节。

这些测试不同组件或系统之间的交互(例如,应用程序代码与数据库、微服务之间的通信)。

  • 工具: 通常使用与单元测试相同的框架,但需要设置外部依赖(数据库、API)。像 Testcontainers 这样的工具可以在 Docker 中管理依赖。
  • 集成: 通常在单元测试通过后运行。可能需要在 Pipeline 中设置一个专门的阶段。
  • Jenkins: 通过构建工具执行测试。junit 步骤可以发布结果。确保 Jenkins agent 环境能够访问必要的服务,或者在构建中使用 Testcontainers 等工具。

这些通过驱动应用程序的用户界面(UI)(Web 浏览器、移动应用)来模拟真实用户交互。

  • 工具: Selenium WebDriver、Cypress、Playwright(用于 Web)、Appium(用于移动应用)。
  • 集成: 通常在应用程序构建并可能部署到测试环境后运行。通常需要一个专门的、更复杂的阶段。
  • Jenkins:
    • 使用构建工具执行测试(例如,在 Maven 中使用 mvn failsafe:integration-test 运行 Selenium 测试,使用 npx cypress run 运行 Cypress 测试)。
    • 环境设置: Jenkins agent 需要访问 Web 浏览器(例如,Chrome、Firefox)及其相应的驱动程序(ChromeDriver、GeckoDriver)。直接管理这些可能会很复杂。
    • 无头模式执行 (Headless Execution): 在 agent 上以无头模式运行浏览器,以避免需要显示器。
    • Docker 解决方案: 在 Docker 容器(例如,Selenium Grid Docker 镜像)中运行浏览器,以便更轻松地管理环境。
    • 云测试服务: 集成 Sauce Labs、BrowserStack 或 LambdaTest 等服务,以便在云中的各种浏览器/操作系统组合上运行测试。这些服务通常提供 Jenkins 插件。
    • 发布结果: 如果您的框架生成兼容的 XML 报告,请使用 junit 步骤。使用 publishHTML 步骤发布 HTML 报告(例如,来自 Cypress 的报告)。

注意:使用 ‘Hudson Selenium Plugin’ 直接运行 HTML 测试集的旧方法已经过时(outdated)。现代实践是在标准测试框架中使用 WebDriver 绑定。

使用 Maven 的 Selenium 测试 Pipeline 阶段示例

Section titled “使用 Maven 的 Selenium 测试 Pipeline 阶段示例”

这假设您使用 JUnit/TestNG 编写了 Selenium WebDriver 测试,并配置通过 Maven Failsafe 插件运行。

stage('E2E Tests') {
// Agent 需要访问浏览器驱动程序或使用带有浏览器的 Docker agent
agent { label 'selenium-agent' } // 或者使用 Docker agent
steps {
echo 'Running Selenium E2E Tests...'
// 假设应用程序已部署或可通过 WEBAPP_URL 访问
sh 'mvn verify -Dwebdriver.base.url=$WEBAPP_URL'
}
post {
always {
// 无论结果如何都发布测试结果
junit '**/target/failsafe-reports/*.xml'
// 可选:如果生成了 HTML 报告则发布
// publishHTML(target: [allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: 'target/reports', reportFiles: 'my-report.html', reportName: 'E2E Test Report'])
}
}
}
  • 在适当的阶段运行测试: 早期运行快速的单元测试,后期运行较慢的 E2E 测试。
  • 快速失败(Fail fast): 如果关键测试失败,立即停止 Pipeline。
  • 隔离测试环境: 使用 Docker 或专用 agent 防止测试相互干扰。
  • 有效报告: 使用插件(junit、publishHTML,以及 Warnings NG 用于静态分析)使结果可见并跟踪趋势。
  • 管理测试数据: 确保测试拥有可靠且一致的数据。
  • 并行化测试: 在可能的情况下并行运行测试,以加快执行速度(通常由测试框架或构建工具处理)。

请查阅您的特定测试框架和构建工具的文档,以了解执行它们并生成与 Jenkins 兼容报告的最佳方法。