Skip to content

通用自动化测试框架 —— 完整设计规范

适用场景:桌面软件自动化(Qt/Win32 通用) 核心设计:控件文本化 + 无录制 + 无绝对路径 + 无坐标 + 测试人员零门槛 序列化格式:YAML(人类友好,可直接保存文件)


1 框架核心思想

  1. 测试人员只描述界面可见信息 文字、类型、位置、父容器
  2. 引擎负责筛选、校验、唯一确定控件 不猜、不蒙、不强行点击
  3. 控件定位 = 多条件匹配 类型 + 文本 + 父容器 + 位置 + 状态
  4. 流程 = 动作 + 断言 + 嵌套结构 支持循环、条件、人工确认
  5. 所有内容可文本化、可持久化

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: bottom

3 引擎控件查找规则(固定逻辑)

3.1 查找步骤(固定)

  1. 遍历全部控件
  2. 类型 过滤
  3. 文本包含 过滤
  4. 父容器包含 过滤
  5. 可见/可用 过滤
  6. 位置区域 过滤
  7. 检查结果数量
    • 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.25x

4.1.4 勾选 CheckBox

yaml
- action: check
  target: 记住密码
  value: true/false

4.1.5 等待(毫秒)

yaml
- action: wait
  ms: 1000

4.2 断言类动作(验证状态)

4.2.1 断言可点击 / 不可点击

yaml
- action: assert_clickable
  target: 播放按钮
  expect: true/false

4.2.2 断言控件存在

yaml
- action: assert_exists
  target: 提示窗口
  expect: true/false

4.2.3 断言可见

yaml
- action: assert_visible
  target: 错误提示
  expect: true/false

4.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: true

5.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通用)