walktour 的核心是一个基于 UI Automator 的录制回放框架,它的参数配置主要分为两大类:
- 命令行参数:在执行
adb shell am instrument命令时传入,用于控制测试任务的启动、停止、日志输出等。 - 配置文件参数:在测试脚本(通常是
.json文件)中定义,用于描述具体的测试步骤、元素定位、操作逻辑等。
下面我将分别对这两类参数进行详细说明。
命令行参数
这些参数是在你的电脑上通过 adb 命令行直接调用的,它们是 walktour 测试任务的“总开关”和“全局配置”。
基本命令结构
adb shell am instrument -r -w -e <key1> <value1> -e <key2> <value2> com.walktour.test/androidx.test.runner.AndroidJUnitRunner
adb shell am instrument: 执行 Android Instrumentation 测试的命令。-r: 打印原始输出,包含日志信息。-w: 等待测试完成。这个参数非常重要,它确保你的脚本会等待整个测试流程执行完毕后再返回。-e <key> <value>: 传递键值对参数给测试程序,这是传递walktour特有参数的方式。com.walktour.test/androidx.test.runner.AndroidJUnitRunner: 这是walktour的测试运行器路径。请注意,com.walktour.test这个包名可能会根据你使用的walktour版本或自定义包名而有所不同,需要根据实际情况修改。
常用命令行参数
| 参数 | 描述 | 示例 |
|---|---|---|
testPath |
(核心参数) 指定要执行的测试脚本(.json 文件)的路径,这个路径是设备上的路径。 |
-e testPath /sdcard/walktour/testcases/login.json |
logLevel |
设置日志输出的级别,可选值: DEBUG, INFO, WARN, ERROR,级别越高,输出的日志越少。 |
-e logLevel DEBUG |
retry |
设置当测试步骤失败时的重试次数。 | -e retry 3 |
timeout |
设置每个测试步骤的超时时间(单位:毫秒)。 | -e timeout 15000 |
reportPath |
指定测试报告生成的路径。 | -e reportPath /sdcard/walktour/reports/ |
startType |
设置启动方式。0 表示冷启动(杀死应用后重新启动),1 表示热启动(不杀死应用)。 |
-e startType 0 |
clearData |
测试开始前是否清除应用数据。true 或 false。 |
-e clearData true |
packageName |
指定被测试应用的包名,如果脚本中没有指定,则使用此处的包名。 | -e packageName com.example.myapp |
综合示例
假设我们要执行 /sdcard/walktour/testcases/ 目录下的 order_flow.json 脚本,设置日志级别为 DEBUG,步骤超时时间为 20 秒,并允许失败后重试 2 次。
adb shell am instrument -r -w -e testPath /sdcard/walktour/testcases/order_flow.json -e logLevel DEBUG -e timeout 20000 -e retry 2 com.walktour.test/androidx.test.runner.AndroidJUnitRunner
配置文件参数 (JSON 格式)
这些参数定义在 .json 测试脚本文件中,是 walktour 的“灵魂”,描述了“做什么”和“怎么做”。
一个典型的 walktour JSON 文件结构如下:
{
"before": [ ... ], // 可选:测试开始前执行的步骤
"after": [ ... ], // 可选:测试结束后执行的步骤
"steps": [ // 核心部分:测试步骤列表
{ ... },
{ ... }
]
}
核心步骤对象 (steps 数组中的元素)
每个步骤都是一个对象,包含以下关键字段:
| 参数 | 类型 | 描述 | 示例 |
|---|---|---|---|
type |
String | (必填) 步骤的类型,如 click, input, swipe, sleep 等。 |
"type": "click" |
target |
Object | (必填) 目标元素的定位信息。 | "target": {"id": "btn_login"} |
desc |
String | 步骤的描述,用于日志和报告,方便阅读。 | "desc": "点击登录按钮" |
params |
Object | 步骤的额外参数,根据 type 不同而不同。 |
"params": {"text": "test123"} |
元素定位 (target 对象)
walktour 支持多种 UI Automator 定位方式,非常灵活:
| 定位方式 | 参数 | 描述 |
|---|---|---|
| ID | id |
通过元素的 resource-id 定位,最常用、最稳定。 |
| 文本 | text |
通过元素的文本内容定位。 |
| 描述 | desc |
通过元素的 content-desc 属性定位。 |
| 类名 | className |
通过元素的完整类名定位。 |
| 组合定位 | id, text, className 等 |
可以组合多个条件进行精确匹配。 |
| 坐标 | x, y |
直接点击屏幕上的绝对坐标。不推荐,因为不具可移植性。 |
| 索引 | index |
在多个相同元素中,通过其在列表中的位置(从0开始)定位。 |
常用步骤类型 (type) 及其参数
click - 点击
target: 定位要点击的元素。- 示例:
{ "type": "click", "target": {"id": "com.example.app:id/btn_login"}, "desc": "点击登录按钮" }
input - 输入文本
target: 定位要输入文本的输入框。params.text: 要输入的字符串。- 示例:
{ "type": "input", "target": {"id": "com.example.app:id/et_username"}, "desc": "输入用户名", "params": { "text": "testuser" } }
swipe - 滑动
params.direction: 滑动方向,可选值:up,down,left,right。params.percent: 滑动距离(百分比,0.1 ~ 1.0)。5表示从屏幕中间滑动到边缘。- 示例:
{ "type": "swipe", "desc": "向上滑动屏幕", "params": { "direction": "up", "percent": 0.8 } }
sleep / wait - 等待
params.time: 等待的时间,单位是毫秒。- 示例:
{ "type": "sleep", "desc": "等待3秒", "params": { "time": 3000 } }
assert - 断言(检查点)
断言用于验证某个条件是否满足,如果不满足,测试会失败。
target: 定位要检查的元素。params.checkType: 检查类型,常用值:exist: 检查元素是否存在。not_exist: 检查元素是否不存在。text_equal: 检查元素的文本是否等于指定值。text_contain: 检查元素的文本是否包含指定值。
params.text: 当checkType为text_equal或text_contain时,提供期望的文本。- 示例:
// 检查登录成功后,某个欢迎文本是否存在 { "type": "assert", "target": {"id": "com.example.app:id/tv_welcome"}, "desc": "断言欢迎文本存在", "params": { "checkType": "exist" } } // 检查Toast提示 { "type": "assert", "target": {"className": "android.widget.Toast"}, "desc": "断言Toast提示为'登录成功'", "params": { "checkType": "text_equal", "text": "登录成功" } }
startApp - 启动应用
params.packageName: 要启动的应用的包名。- 示例:
{ "type": "startApp", "desc": "启动被测应用", "params": { "packageName": "com.example.myapp" } }
stopApp - 停止应用
params.packageName: 要停止的应用的包名。- 示例:
{ "type": "stopApp", "desc": "停止被测应用", "params": { "packageName": "com.example.myapp" } }
总结与最佳实践
-
分层管理:
- 命令行参数 用于控制整个测试任务的执行环境(如脚本路径、超时、重试策略)。
- JSON配置参数 用于定义测试的具体业务逻辑(操作步骤、断言检查)。
-
定位优先级:
- 优先使用
id(resource-id),因为它最稳定,受版本影响最小。 -
text或desc。 - 避免使用绝对坐标,除非万不得已(如原生广告)。
- 优先使用
-
健壮性:
- 在关键操作后加入
assert步骤,确保操作结果符合预期。 - 合理使用
sleep,但不要滥用。sleep是硬等待,会增加测试时间,优先使用assert来等待元素出现,这更智能。 - 在
before步骤中启动应用,在after步骤中关闭应用,保证测试的独立性。
- 在关键操作后加入
-
日志与报告:
- 命令行中使用
-e logLevel DEBUG获取详细日志,方便调试。 - 使用
-e reportPath指定报告路径,方便后续分析。
- 命令行中使用
通过灵活组合这两类参数,你就可以构建出强大、稳定、可维护的安卓自动化测试脚本。
