UI自动化脚本在本地可以运行,但真正的价值在于持续集成:每次代码提交后自动执行,及时发现问题。本文将详细介绍如何将UI自动化测试集成到Jenkins和GitHub Actions中,包括无头模式配置、并行执行、报告发布、邮件通知等关键环节。
一、CI中运行UI自动化的核心挑战

二、Jenkins集成
2.1 Jenkins环境准备
安装Jenkins(推荐使用Docker或直接安装)
安装插件:
Maven Integration
Allure Jenkins Plugin
Email Extension Plugin
全局工具配置:JDK、Maven
Jenkins节点需安装浏览器:如果Jenkins运行在Linux无界面服务器,需安装虚拟帧缓冲(如Xvfb)或直接使用无头模式。现代Chrome/Firefox在无头模式下无需Xvfb。
2.2 Jenkins Pipeline流水线(推荐)
创建Jenkinsfile放在项目根目录:
groovy
pipeline {
agent any
tools {
maven 'Maven-3.8'
jdk 'JDK-11'
}
environment {
// 设置浏览器无头模式(通过环境变量传给测试)
HEADLESS = 'true'
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your-repo/ui-tests.git'
}
}
stage('Setup') {
steps {
// 安装浏览器驱动(如果使用WebDriverManager则无需)
sh 'apt-get update && apt-get install -y chromium-browser'
}
}
stage('Run Tests') {
steps {
// 执行Maven测试
sh 'mvn clean test -Dheadless=${HEADLESS}'
}
post {
always {
// 收集Allure结果
allure includeProperties: false, jdk: '', results: [[path: 'target/allure-results']]
}
}
}
stage('Publish Report') {
steps {
// 发布Allure报告(需要在系统配置中配置Allure命令行)
allure([
includeProperties: false,
jdk: '',
properties: [],
reportBuildPolicy: 'ALWAYS',
results: [[path: 'target/allure-results']]
])
}
}
}
post {
failure {
emailext (
subject: "UI自动化测试失败 - ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "请查看构建日志: ${env.BUILD_URL}",
to: 'qa-team@example.com'
)
}
success {
emailext (
subject: "UI自动化测试通过 - ${env.JOB_NAME} - ${env.BUILD_NUMBER}",
body: "所有测试通过,报告地址: ${env.BUILD_URL}allure/",
to: 'qa-team@example.com'
)
}
}
}
2.3 配置无头模式
在config.properties或通过环境变量覆盖:
properties
headless=true
或在代码中动态读取环境变量:
java
String headless = System.getenv("HEADLESS");
if ("true".equalsIgnoreCase(headless)) {
options.addArguments("--headless");
}
2.4 Jenkins自由风格项目(适用于快速验证)
源码管理:Git仓库
Build触发器:Poll SCM 或 Webhook
Build步骤:mvn clean test
Post-build Actions:
添加"Allure Report"指向target/allure-results
添加"Editable Email Notification"发送测试结果
三、GitHub Actions集成
GitHub Actions是更现代的CI方案,无需自建服务器,适合开源或私有仓库。
3.1 创建工作流文件
.github/workflows/ui-tests.yml:
yaml
name: UI Automation Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 2 * * *' # 每天凌晨2点定时执行
jobs:
test:
runs-on: ubuntu-latest # 也可用 windows-latest 或 macos-latest
strategy:
fail-fast: false
matrix:
browser: [chrome, firefox] # 并行测试多种浏览器
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Set up Maven
uses: stCarolas/setup-maven@v4
with:
maven-version: '3.8.6'
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
- name: Install Chrome
run: |
sudo apt-get update
sudo apt-get install -y google-chrome-stable
- name: Install Firefox
run: sudo apt-get install -y firefox
- name: Run UI Tests
run: mvn clean test -Dbrowser=${{ matrix.browser }} -Dheadless=true
env:
# 如果使用WebDriverManager,它会自动下载匹配的驱动
WEBDRIVER_MANAGER_ARCH: linux64
- name: Upload Allure Results
uses: actions/upload-artifact@v3
if: always()
with:
name: allure-results-${{ matrix.browser }}
path: target/allure-results
- name: Generate Allure Report
if: always()
uses: simple-elf/allure-report-action@v1
with:
allure_results: target/allure-results
gh_pages: gh-pages
allure_report: allure-report
- name: Deploy Report to GitHub Pages
if: always() && github.ref == 'refs/heads/main'
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: allure-report
destination_dir: allure
3.2 GitHub Actions中处理截图和报告
由于CI环境无法直接查看截图,可以将截图或整个报告作为Artifact上传,供下载查看。上述步骤中已使用upload-artifact上传Allure结果。
3.3 利用GitHub Pages发布报告
生成静态HTML报告后,推送到gh-pages分支,然后在仓库Settings中启用GitHub Pages。团队成员可通过https://.github.io//allure/查看报告。
四、并行执行与性能优化

分片执行示例(GitHub Actions矩阵分片):
yaml
jobs:
test:
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- run: mvn test -Dgroups="shard${{ matrix.shard }}"
五、处理Flaky测试的常见策略
重试机制:TestNG可使用retryAnalyzer,指定失败后重试次数。
java
@Test(retryAnalyzer = RetryAnalyzer.class)
public void flakyTest() { ... }
仅在CI中允许重试:
java
if (System.getenv("CI") != null) {
// 启用重试
}
隔离不稳定的用例:使用@Test(groups = {"smoke"})将稳定用例归类,CI中先执行smoke组,全量回归可单独运行。
六、CI流水线中的最佳实践
快速失败:先执行冒烟测试(10分钟内),通过后再执行全量回归。
测试报告可视化:务必集成Allure或ExtentReports,失败时能看到截图和步骤。
告警策略:仅当失败次数超过阈值或特定用例失败时才发送邮件,避免频繁骚扰。
环境隔离:使用独立的测试数据库/服务,避免污染生产数据。
定时执行:除了提交触发,还应在深夜执行全量回归,避免影响开发效率。
七、完整示例:提交触发+定时任务
Jenkins Pipeline 示例(含多分支):
groovy
pipeline {
triggers {
pollSCM('H/5 * * * *') // 每5分钟检查代码变化
cron('0 2 * * *') // 每天2点定时
}
options {
retry(2) // 整个流水线失败重试2次
}
// ... 其他配置
}
八、总结
