🤖 UI 自动化测试用例标准模板与验收标准

基于 OpenClaw + Claude Code 的端到端研发自动化系统

版本:v1.0 | 编制日期:2026 年 3 月 14 日 | 适用阶段:UI 自动化测试验收

1.1 UI 自动化测试在端到端研发流程中的定位

需求分析
PRD 设计
技术方案设计
前端 + 后端
API 接口开发
协议设计
AI Coding
代码生成
Unit Test
单元测试
集成测试
Integration
UI 自动化测试
验收测试
自动部署
K8S + Docker

1.2 UI 自动化测试目标与范围

核心目标:确保用户界面功能正确性、交互体验一致性、跨平台兼容性,作为产品发布前的最后一道质量防线。

测试覆盖范围

测试类型 描述 优先级 自动化程度
必选 功能测试 验证 UI 功能是否符合需求规格说明书 P0 100% 自动化
必选 回归测试 确保新功能不影响现有功能 P0 100% 自动化
可选 兼容性测试 跨浏览器、跨设备、跨分辨率测试 P1 80% 自动化
可选 性能测试 页面加载时间、响应时间、资源消耗 P1 70% 自动化
推荐 视觉回归测试 检测 UI 布局、样式、颜色的意外变化 P2 90% 自动化
推荐 无障碍测试 验证 WCAG 2.1 AA 标准合规性 P2 60% 自动化

1.3 适用技术栈与工具

Web 应用

  • Selenium WebDriver: 跨浏览器自动化测试
  • Playwright: 现代 Web 应用测试(推荐)
  • Cypress: 前端集成测试
  • Puppeteer: Chrome/Chromium 专用

移动应用

  • Appium: 跨平台移动测试
  • UI Automator 2.4+: Android 原生测试
  • XCUITest: iOS 原生测试
  • Airtest: 游戏 & 跨平台测试

桌面应用

  • PyAutoGUI: 通用 GUI 自动化
  • WinAppDriver: Windows 应用
  • Airtest: 跨平台桌面应用

辅助工具

  • Allure Report: 测试报告生成
  • Jenkins/GitLab CI: CI/CD 集成
  • Docker: 测试环境容器化
  • K8S/KubeSphere: 编排与部署

2.1 UI 自动化测试用例标准模板结构

说明: 以下模板适用于所有 UI 自动化测试用例,每个字段都标注了是否必填及填写规范。
字段名称 必填 数据类型 填写说明与示例
用例 ID 必选 String 格式:UI_[模块]_[子模块]_[序号]
示例:UI_LOGIN_AUTH_001, UI_ORDER_CREATE_015
用例名称 必选 String 格式:[操作]+[对象]+[预期结果]
示例:"用户使用正确凭据登录成功跳转首页"
优先级 必选 Enum P0-阻塞性关键路径 | P1-核心功能 | P2-重要功能 | P3-边缘场景
所属模块 必选 String 示例:用户认证、订单管理、支付流程、商品搜索
前置条件 必选 Array 示例:
["用户已注册", "网络连接正常", "测试数据已准备"]
测试步骤 必选 Array 格式:步骤编号 + 操作描述 + 元素定位器
示例:见下方详细示例
预期结果 必选 Array 要求:可量化、可验证的断言条件
示例:["页面 URL 包含'/home'", "显示欢迎消息"]
测试数据 可选 Object 示例:{"username": "test_user", "password": "Test@123"}
元素定位器 必选 Object 格式:定位策略 + 定位值
示例:见下方定位器规范
超时设置 可选 Integer 单位:毫秒
默认:10000ms (10 秒)
示例:30000
重试次数 可选 Integer 默认:0
推荐:对于不稳定测试设置为 2-3
截图策略 可选 Enum on_failure-仅失败时 | always-始终 | never-从不
关联需求 ID 推荐 String 示例:REQ-2026-0015, USER-STORY-123
自动化脚本路径 必选 String 格式:相对项目根目录的路径
示例:tests/ui/login/test_login_success.py
执行环境 可选 Array 示例:["Chrome-Latest", "Firefox-Latest", "Safari-17"]
备注 可选 String 特殊说明、已知问题、依赖项等

2.2 测试步骤详细格式规范

# 测试步骤 JSON 结构示例
{
  "step_id": "STEP_001",
  "action": "click",
  "description": "点击登录按钮",
  "locator": {
    "strategy": "xpath",
    "value": "//button[@id='login-btn']"
  },
  "wait_before": 1000,
  "wait_after": 2000,
  "expected_state": {
    "element_visible": true,
    "page_url_contains": "/dashboard"
  }
}

支持的操作类型

操作类型 描述 参数示例
click 点击元素 locator
input_text 输入文本 locator, text
select_option 选择下拉选项 locator, option_value
upload_file 上传文件 locator, file_path
scroll_to 滚动到元素 locator
hover 鼠标悬停 locator
double_click 双击元素 locator
right_click 右键点击 locator
switch_frame 切换 iframe frame_locator
switch_window 切换窗口 window_handle
navigate_to 导航到 URL url
refresh 刷新页面 -
go_back 浏览器后退 -
go_forward 浏览器前进 -
execute_script 执行 JavaScript script, args

2.3 元素定位器规范

最佳实践:优先使用 data-testid 属性,其次是 id,避免使用绝对 XPath。
定位策略 优先级 稳定性 示例 适用场景
data-testid P0 ⭐⭐⭐⭐⭐ data-testid="login-btn" 所有自动化测试元素
id P1 ⭐⭐⭐⭐⭐ id="username" 具有唯一 ID 的元素
name P2 ⭐⭐⭐⭐ name="email" 表单输入字段
css_selector P2 ⭐⭐⭐⭐ .btn.primary 具有特定类名的元素
xpath_relative P3 ⭐⭐⭐ //div[@class='card']//button 相对位置查找
xpath_absolute 避免 /html/body/div[2]/... 不推荐使用
link_text P2 ⭐⭐⭐ link_text="忘记密码" 链接元素
partial_link_text P3 ⭐⭐ partial_link_text="忘记" 部分文本匹配
tag_name P3 ⭐⭐ tag_name="input" 按标签名查找
class_name P3 ⭐⭐ class_name="submit-btn" 单一类名

3.1 UI 自动化测试验收通过标准

发布准出条件:只有满足以下所有条件,产品才能进入生产环境部署。
  • 测试覆盖率要求
    • P0 级用例覆盖率:100%
    • P1 级用例覆盖率:≥95%
    • P2 级用例覆盖率:≥85%
    • 核心业务流程覆盖率:100%
  • 测试通过率要求
    • P0 级用例通过率:100%
    • P1 级用例通过率:≥98%
    • P2/P3 级用例通过率:≥95%
    • 整体通过率:≥97%
  • 缺陷密度要求
    • 致命缺陷 (Critical):0 个
    • 严重缺陷 (Major):≤2 个且有规避方案
    • 一般缺陷 (Minor):≤10 个
    • 建议性问题 (Trivial):不限
  • 性能指标要求
    • 页面首次加载时间 (FCP):≤1.5 秒
    • 最大内容绘制 (LCP):≤2.5 秒
    • 首次输入延迟 (FID):≤100 毫秒
    • 累积布局偏移 (CLS):≤0.1
    • 自动化测试执行时间:≤30 分钟 (全量)
  • 兼容性要求
    • 目标浏览器覆盖率:≥95%
    • 移动端适配:iOS 15+, Android 10+
    • 分辨率覆盖:主流分辨率 100% 适配
  • 稳定性要求
    • 测试用例 flaky 率:≤2%
    • 连续 3 次构建通过率:100%
    • 自动化测试误报率:≤1%
  • 文档完整性要求
    • 测试用例文档完整率:100%
    • 测试报告生成:每次执行自动生成
    • 缺陷记录完整率:100%
    • 测试数据管理规范:符合要求

3.2 质量门禁检查清单

阶段一:测试准备检查

  • 测试环境已就绪且配置正确
  • 测试数据已准备并验证
  • 被测应用版本已部署到测试环境
  • 自动化测试脚本已通过代码审查
  • 测试依赖服务 (数据库、API) 可用
  • CI/CD流水线配置完成

阶段二:测试执行检查

  • 所有 P0/P1用例已执行
  • 测试日志完整记录
  • 失败用例已截图/录屏
  • 测试结果已生成报告
  • 性能基线数据已采集

阶段三:缺陷管理检查

  • 所有发现的缺陷已记录到缺陷管理系统
  • 缺陷优先级和严重程度已评估
  • 致命/严重缺陷已修复并验证
  • 缺陷修复率满足发布标准
  • 回归测试已通过

阶段四:发布决策检查

  • 测试报告已生成并审核
  • 所有验收标准已满足
  • 相关干系人已审批
  • 回滚方案已准备
  • 监控告警已配置

3.3 测试成熟度评估模型

成熟度等级 自动化率 覆盖率 稳定性 集成度 特征描述
L1 初始级 <20% <30% <70% 手动触发 手工测试为主,少量自动化
L2 可重复级 20-40% 30-50% 70-85% 定时执行 核心流程自动化,定期执行
L3 已定义级 40-60% 50-70% 85-95% CI 触发 标准化流程,CI 集成
L4 已管理级 60-80% 70-90% 95-98% 流水线集成 量化管理,持续反馈
L5 优化级 >80% >90% >98% 全自动 AI 驱动,自愈能力,持续优化
目标:本系统目标是在 6 个月内达到 L4 级别,12 个月内达到 L5 级别。

4.1 自动化测试框架架构

测试管理层 (Test Management Layer)
测试用例组织、数据驱动、报告生成
业务封装层 (Business Layer)
Page Object、组件封装、业务流
驱动适配层 (Driver Adapter Layer)
Selenium/Playwright/Appium 适配
基础设施层 (Infrastructure Layer)
Docker、K8S、Grid、云真机

4.2 项目目录结构规范

project_root/
├── tests/
│   ├── ui/                          # UI 自动化测试
│   │   ├── pages/                   # Page Object 页面对象
│   │   │   ├── base_page.py
│   │   │   ├── login_page.py
│   │   │   └── dashboard_page.py
│   │   ├── components/              # 可复用组件
│   │   │   ├── header.py
│   │   │   └── navigation.py
│   │   ├── test_cases/              # 测试用例
│   │   │   ├── login/
│   │   │   ├── order/
│   │   │   └── payment/
│   │   ├── test_data/               # 测试数据
│   │   │   ├── users.json
│   │   │   └── products.csv
│   │   └── conftest.py              # Pytest 配置
│   ├── api/                         # API 测试
│   └── unit/                        # 单元测试
├── frameworks/
│   ├── core/                        # 核心框架
│   ├── utils/                       # 工具函数
│   └── reporters/                   # 报告生成器
├── config/
│   ├── environments/                # 环境配置
│   ├── browsers.json                # 浏览器配置
│   └── test_settings.yaml           # 测试设置
├── scripts/
│   ├── setup_env.sh                 # 环境初始化
│   ├── run_tests.sh                 # 执行脚本
│   └── generate_report.sh           # 报告生成
├── reports/                         # 测试报告输出
├── logs/                            # 日志文件
├── screenshots/                     # 截图存档
├── recordings/                      # 录屏存档
├── requirements.txt                 # Python 依赖
├── package.json                     # Node.js 依赖
├── docker-compose.yml               # Docker 配置
└── Jenkinsfile                      # CI/CD 配置

4.3 编码规范与最佳实践

命名规范

类型 命名规则 示例
测试类 Test[FeatureName] TestLogin, TestOrderCreation
测试方法 test_[action]_[condition]_[result] test_login_with_valid_credentials_success
Page Object 类 [PageName]Page LoginPage, DashboardPage
定位器变量 [ELEMENT]_[LOCATOR_TYPE] LOGIN_BUTTON_XPATH
测试数据 小写 + 下划线 valid_user, invalid_password

代码质量要求

  • 遵循 DRY 原则 (Don't Repeat Yourself)
  • 每个测试用例独立,不依赖其他用例状态
  • 使用显式等待,避免硬编码 sleep
  • 测试用例具备幂等性,可重复执行
  • 异常处理完善,提供清晰的错误信息
  • 代码注释清晰,复杂逻辑有说明
  • 通过代码审查 (Code Review) 流程
  • 静态代码分析无严重警告

4.4 测试数据管理策略

重要:测试数据必须与代码分离,禁止在代码中硬编码敏感信息。

数据来源分类

数据类型 存储方式 更新频率 示例
静态数据 JSON/YAML文件 配置参数、枚举值
动态数据 数据库/API生成 订单号、时间戳
敏感数据 加密存储/环境变量 密码、API Key
大数据集 CSV/数据库 商品列表、用户数据

数据清理策略

  • 测试前清理:删除残留测试数据
  • 测试后清理:使用 teardown 清理创建的数据
  • 定期清理:每日/每周定时清理过期数据
  • 事务回滚:使用数据库事务,失败时回滚

5.1 CI/CD 流水线集成方案

代码提交
Git Push
代码审查
Code Review
构建编译
Maven/npm
单元测试
Unit Test
集成测试
Integration
UI 自动化测试
E2E Test
镜像构建
Docker Build
K8S部署
KubeSphere

5.2 Jenkins Pipeline 配置示例

// Jenkinsfile 示例
pipeline {
    agent any
    
    environment {
        BROWSER = 'chrome'
        ENVIRONMENT = 'staging'
        REPORT_DIR = 'reports/ui-tests'
    }
    
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/org/repo.git'
            }
        }
        
        stage('Setup Environment') {
            steps {
                sh 'docker-compose up -d selenium-grid'
                sh 'pip install -r requirements.txt'
            }
        }
        
        stage('Run UI Tests') {
            parallel {
                stage('Chrome Tests') {
                    steps {
                        sh 'pytest tests/ui/ --browser=chrome --alluredir=${REPORT_DIR}'
                    }
                }
                stage('Firefox Tests') {
                    steps {
                        sh 'pytest tests/ui/ --browser=firefox --alluredir=${REPORT_DIR}'
                    }
                }
            }
        }
        
        stage('Generate Report') {
            steps {
                sh 'allure generate ${REPORT_DIR} -o allure-report --clean'
                allure results: '${REPORT_DIR}'
            }
        }
        
        stage('Quality Gate') {
            steps {
                script {
                    def passedRate = sh(script: 'python scripts/calc_pass_rate.py', returnStdout: true).trim()
                    if (passedRate.toBigDecimal() < 97.0) {
                        error("测试通过率 ${passedRate}% 低于阈值 97%")
                    }
                }
            }
        }
        
        stage('Deploy to K8S') {
            when {
                branch 'main'
                expression { currentBuild.result == null || currentBuild.result == 'SUCCESS' }
            }
            steps {
                sh 'kubectl apply -f k8s/deployment.yaml'
                sh 'kubectl rollout status deployment/app'
            }
        }
    }
    
    post {
        always {
            archiveArtifacts artifacts: '${REPORT_DIR}/**/*'
            publishHTML(target: [
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAllHistory: true,
                reportDir: 'allure-report',
                reportFiles: 'index.html',
                reportName: 'UI Automation Test Report'
            ])
        }
        failure {
            sh 'scripts/notify_failure.sh'
        }
    }
}

5.3 Docker + K8S 部署配置

# docker-compose.yml - 测试环境
version: '3.8'
services:
  selenium-hub:
    image: selenium/hub:4.15
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
  
  chrome:
    image: selenium/node-chrome:4.15
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
  
  firefox:
    image: selenium/node-firefox:4.15
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
  
  test-runner:
    build: .
    depends_on:
      - selenium-hub
    environment:
      - SELENIUM_HOST=selenium-hub
      - BROWSER=chrome
    volumes:
      - ./reports:/app/reports
      - ./screenshots:/app/screenshots
# k8s-deployment.yaml - KubeSphere 部署
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ui-test-runner
  namespace: testing
spec:
  replicas: 5
  selector:
    matchLabels:
      app: ui-test-runner
  template:
    metadata:
      labels:
        app: ui-test-runner
    spec:
      containers:
      - name: test-runner
        image: registry.example.com/ui-tests:latest
        env:
        - name: SELENIUM_HOST
          value: "selenium-hub.testing.svc.cluster.local"
        - name: PARALLEL_WORKERS
          value: "5"
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "1Gi"
            cpu: "1000m"
---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-ui-tests
  namespace: testing
spec:
  schedule: "0 2 * * *"  # 每天凌晨 2 点执行
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: test-runner
            image: registry.example.com/ui-tests:latest
          restartPolicy: OnFailure

5.4 测试报告与监控

报告生成要求

  • 实时报告:Allure Report / ExtentReports
  • 趋势分析:历史执行趋势图表
  • 失败分析:失败原因分类统计
  • 截图附件:失败步骤自动截图
  • 视频录制:关键流程录屏
  • 性能指标:执行时长、资源消耗

监控告警配置

监控指标 阈值 告警级别 通知方式
测试通过率 <97% 严重 邮件 + 钉钉 + 短信
执行时长 >45 分钟 警告 钉钉
Flaky 测试数 >5 个 警告 邮件
环境可用性 <99% 严重 电话 + 短信

6.1 完整测试用例示例 - 用户登录

# test_login_success.py
import pytest
from pages.login_page import LoginPage
from pages.dashboard_page import DashboardPage
from utils.test_data import load_test_user

# 测试用例元数据
pytestmark = [
    pytest.mark.ui,
    pytest.mark.login,
    pytest.mark.p0,
    pytest.mark.test_id("UI_LOGIN_AUTH_001")
]

class TestLoginSuccess:
    """
    测试用例:用户使用正确凭据登录成功
    
    关联需求:REQ-2026-0015
    优先级:P0
    前置条件:
        1. 用户已注册
        2. 网络连接正常
        3. 测试环境可用
    """
    
    @pytest.fixture(autouse=True)
    def setup(self, driver):
        """测试前置准备"""
        self.driver = driver
        self.login_page = LoginPage(driver)
        self.dashboard_page = DashboardPage(driver)
        self.user = load_test_user("valid_user")
        
    def test_login_with_valid_credentials_success(self):
        """验证用户使用有效凭据登录成功跳转到仪表盘"""
        
        # Step 1: 打开登录页面
        self.login_page.navigate()
        
        # Step 2: 输入用户名
        self.login_page.enter_username(self.user["username"])
        
        # Step 3: 输入密码
        self.login_page.enter_password(self.user["password"])
        
        # Step 4: 点击登录按钮
        self.login_page.click_login_button()
        
        # Step 5: 验证跳转到仪表盘页面
        assert self.dashboard_page.is_displayed(), "未成功跳转到仪表盘"
        
        # Step 6: 验证显示欢迎消息
        welcome_message = self.dashboard_page.get_welcome_message()
        assert self.user["username"] in welcome_message, \
            f"欢迎消息不包含用户名:{welcome_message}"
        
        # Step 7: 验证 URL 正确
        assert "/dashboard" in self.driver.current_url, \
            f"URL 不正确:{self.driver.current_url}"
    
    @pytest.hookimpl(hookwrapper=True)
    def pytest_runtest_makereport(self, item, call):
        """失败时自动截图"""
        outcome = yield
        report = outcome.get_result()
        if report.when == 'call' and report.failed:
            screenshot = self.driver.get_screenshot_as_png()
            report.attach(screenshot, mime_type="image/png")

6.2 Page Object 模式示例

# pages/login_page.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from .base_page import BasePage

class LoginPage(BasePage):
    """登录页面对象 - 封装所有登录相关操作"""
    
    # 元素定位器 (使用 data-testid 优先)
    USERNAME_INPUT = (By.CSS_SELECTOR, "[data-testid='username-input']")
    PASSWORD_INPUT = (By.CSS_SELECTOR, "[data-testid='password-input']")
    LOGIN_BUTTON = (By.CSS_SELECTOR, "[data-testid='login-button']")
    ERROR_MESSAGE = (By.CSS_SELECTOR, "[data-testid='error-message']")
    FORGOT_PASSWORD_LINK = (By.LINK_TEXT, "忘记密码?")
    
    PAGE_URL = "/login"
    PAGE_TITLE = "用户登录"
    
    def __init__(self, driver, timeout=10):
        super().__init__(driver, timeout=timeout)
        self.url = self.base_url + self.PAGE_URL
    
    def navigate(self):
        """导航到登录页面"""
        self.driver.get(self.url)
        self.wait_for_page_load()
        return self
    
    def enter_username(self, username):
        """输入用户名"""
        self.find_element(*self.USERNAME_INPUT).send_keys(username)
        return self
    
    def enter_password(self, password):
        """输入密码"""
        self.find_element(*self.PASSWORD_INPUT).send_keys(password)
        return self
    
    def click_login_button(self):
        """点击登录按钮"""
        self.find_element(*self.LOGIN_BUTTON).click()
        return self
    
    def get_error_message(self):
        """获取错误提示信息"""
        return self.find_element(*self.ERROR_MESSAGE).text
    
    def is_error_displayed(self):
        """检查错误信息是否显示"""
        return self.is_element_visible(*self.ERROR_MESSAGE)
    
    def click_forgot_password(self):
        """点击忘记密码链接"""
        self.find_element(*self.FORGOT_PASSWORD_LINK).click()
        return self
    
    def login(self, username, password):
        """封装完整登录流程"""
        self.enter_username(username)
        self.enter_password(password)
        self.click_login_button()
        return self

6.3 测试用例 Excel 模板示例

用例 ID 用例名称 模块 优先级 前置条件 测试步骤 预期结果 测试数据 自动化脚本 执行状态
UI_LOGIN_AUTH_001 用户使用正确凭据登录成功 用户认证 P0 用户已注册 1.打开登录页
2.输入用户名
3.输入密码
4.点击登录
跳转首页,显示欢迎 user:test001
pwd:Test@123
test_login_success.py 通过
UI_LOGIN_AUTH_002 用户使用错误密码登录失败 用户认证 P0 用户已注册 1.打开登录页
2.输入用户名
3.输入错误密码
4.点击登录
显示错误提示 user:test001
pwd:Wrong@123
test_login_fail.py 通过
UI_ORDER_CREATE_001 用户创建订单成功 订单管理 P0 用户已登录
商品有库存
1.选择商品
2.点击购买
3.确认订单
4.支付
订单创建成功,显示订单号 product:P001
qty:1
test_create_order.py 通过

6.4 验收测试检查表示例

检查项 验收标准 实际结果 状态 备注
P0 用例覆盖率 100% 100% (50/50) -
P0 用例通过率 100% 100% (50/50) -
整体通过率 ≥97% 98.5% (197/200) 3 个 P3 用例失败
致命缺陷数 0 0 -
严重缺陷数 ≤2 1 已提供规避方案
页面加载时间 (LCP) ≤2.5 秒 1.8 秒 平均值
测试 Flaky 率 ≤2% 1.2% 近 10 次构建
连续构建通过 3 次 5 次 -
测试报告完整性 100% 100% Allure 报告
代码审查通过率 100% 100% 所有脚本已 review
验收结论: ✅ 所有验收标准均已满足,准予发布到生产环境。