通用自动化测试框架 —— 完整设计规范
适用场景:桌面软件自动化(Qt/Win32 通用) 核心设计:控件文本化 + 无录制 + 无绝对路径 + 无坐标 + 测试人员零门槛 序列化格式:YAML(人类友好,可直接保存文件)
1 框架核心思想
- 测试人员只描述界面可见信息 文字、类型、位置、父容器
- 引擎负责筛选、校验、唯一确定控件 不猜、不蒙、不强行点击
- 控件定位 = 多条件匹配 类型 + 文本 + 父容器 + 位置 + 状态
- 流程 = 动作 + 断言 + 嵌套结构 支持循环、条件、人工确认
- 所有内容可文本化、可持久化
1.1 结构设计
三层结构设计
进程 (Process)
└── 组 (Group)
└── 控件 (Control)yaml
groups:
- name: 控制栏
parent_control: # 组内控件的共同父控件
type: Container
text_contains: 播放控制栏
controls:
- alias: 播放按钮
type: Button
text_contains: 播放
- alias: 暂停按钮
type: Button
text_contains: 暂停
- name: 歌词面板
parent_control:
type: Container
text_contains: 歌词区域
controls:
- alias: 当前歌词
type: Label
text_contains: 歌词内容
- name: 无父控件的组 # parent_control 可选
controls:
- alias: 随便什么按钮
type: Button
text_contains: 按钮2 控件文本化规范(核心!)
2.1 控件通用描述结构
yaml
alias: 控件显示名称(给人看)
type: 控件类型
text_contains: 界面显示文字(包含)
parent_contains: 父窗口/容器(包含)
position: 位置(可选)
visible: true(默认只找可见)
enabled: true(默认只找可用)2.2 支持的控件类型(全套标准)
Button按钮Edit输入框ComboBox下拉框List列表Label文本标签Window窗口CheckBox勾选框RadioButton单选框Tree树控件Table表格Menu菜单
2.3 位置选项(相对区域,非坐标)
top顶部bottom底部left左侧right右侧center中间(空)不指定
2.4 示例
yaml
alias: 播放按钮
type: Button
text_contains: 播放
parent_contains: 主窗口
position: bottom3 引擎控件查找规则(固定逻辑)
3.1 查找步骤(固定)
- 遍历全部控件
- 按 类型 过滤
- 按 文本包含 过滤
- 按 父容器包含 过滤
- 按 可见/可用 过滤
- 按 位置区域 过滤
- 检查结果数量
- 0 → 找不到
- ≥2 → 不唯一,报错
- 1 → 确认目标
3.2 可点击判断规则(固定)
控件可点击 = 同时满足
- 控件存在
- 可见
visible == true - 未被禁用
enabled == true
不可点击 = 任意不满足
4 支持的动作全集(操作 + 断言)
4.1 操作类动作
4.1.1 点击
yaml
- action: click
target: 播放按钮4.1.2 输入文本
yaml
- action: input
target: 文件路径输入框
value: 输入的内容4.1.3 下拉框选择项
yaml
- action: select_item
target: 播放速度下拉框
value: 1.25x4.1.4 勾选 CheckBox
yaml
- action: check
target: 记住密码
value: true/false4.1.5 等待(毫秒)
yaml
- action: wait
ms: 10004.2 断言类动作(验证状态)
4.2.1 断言可点击 / 不可点击
yaml
- action: assert_clickable
target: 播放按钮
expect: true/false4.2.2 断言控件存在
yaml
- action: assert_exists
target: 提示窗口
expect: true/false4.2.3 断言可见
yaml
- action: assert_visible
target: 错误提示
expect: true/false4.2.4 断言文本内容
yaml
- action: assert_text
target: 状态标签
expect: 已停止5 复杂流程结构(循环/条件/嵌套)
5.1 循环遍历文件夹(你最核心场景)
yaml
- action: loop_folder
folder: C:/test_files
var: current_file
steps:
- action: click
target: 打开文件按钮
- action: input
target: 文件名输入框
value: ${current_file}
- action: wait
ms: 500
- action: assert_clickable
target: 播放按钮
expect: true
- action: click
target: 关闭按钮5.2 计数循环
yaml
- action: loop_times
times: 5
steps:
- action: click
target: 刷新按钮5.3 条件判断
yaml
- action: if
condition: "${current_file_ext} == .mp4"
steps:
- action: assert_exists
target: 视频预览区域
expect: true5.4 人工确认(测试人员判断)
yaml
- action: prompt
title: 请确认界面显示正常
buttons: [通过, 失败]6 变量规则
- 格式:
${变量名} - 自动支持:
${current_file}当前文件${current_file_ext}当前文件后缀- 自定义变量
示例:
yaml
value: ${current_file}7 控件库管理规范(界面可直接照做)
7.1 控件库字段
- 显示名称(alias)
- 控件类型(type)
- 显示文本(text_contains)
- 父容器(parent_contains)
- 位置(position)
7.2 控件库示例
yaml
- alias: 播放按钮
type: Button
text_contains: 播放
parent_contains: 主窗口
position: bottom
- alias: 播放速度下拉框
type: ComboBox
text_contains: 播放速度
parent_contains: 控制栏8 引擎错误规则(永不乱点)
以下情况直接报错,不执行操作
- 找不到控件
- 找到多个控件
- 要操作但控件不可点击
- 断言不通过
- 匹配度过低
9 最简完整测试用例(可直接运行)
yaml
case: 播放按钮灰度测试
steps:
- action: assert_clickable
target: 播放按钮
expect: false
- action: input
target: 文件路径输入框
value: C:/test.mp4
- action: assert_clickable
target: 播放按钮
expect: true
- action: click
target: 播放按钮
- action: assert_text
target: 状态标签
expect: 正在播放10 框架核心优势总结
✅ 不录制、不生成代码 ✅ 不依赖坐标、索引、绝对路径 ✅ 测试人员不用懂技术 ✅ UI 小幅改动不影响用例 ✅ 控件可维护、可复用 ✅ 支持所有常见控件 ✅ 支持操作 + 断言 ✅ 支持循环、条件、嵌套 ✅ 纯文本序列化(YAML) ✅ 跨平台、跨UI框架(Qt/Win32通用)