ATX 使用 Yaml 来做自动化测试 (Beta)

codeskyblue · 2018年09月04日 · 最后由 思寒_seveniruby 回复于 2018年09月07日 · 3985 次阅读

背景

测试版本警告,目前功能这个功能刚写出来没多久,并不保证稳定。

ATX 中的python-uiautomator2目前来说还是以纯 Python 为主, 基本上都是过程式的写法,判断逻辑也都比较简单。
前段时间学习了思寒 @seveniruby 大佬的 appcrawler,发现用 yaml 写测试脚本获取是个很好的方法。

不了解 yaml 的看这里 YAML 教程

实践和使用说明

本地的 uiautomator2 库先升级到最新。

要实现的功能:打开网易云音乐,搜索周杰伦,播放布拉格广场,验证播放按钮存在

原生 Python 写法

import uiautomator2 as u2
d = u2.connect()
d.set_fastinput_ime(True)
d = d.session("com.netease.cloudmusic")
if d(text="跳过").exists(timeout=5):
    d.click(text="跳过")
d(description="搜索").click()
d.send_keys("周杰伦")
d.press("enter")
d(textContains="布拉格广场").click()
assert d(description="播放暂停").exists(timeout=5)

保存成文件test.py 然后 python test.py 运行测试

Yaml 格式写法

---
title: 网易云音乐测试
packageName: com.netease.cloudmusic
steps:
- q: //*[@content-desc="搜索"]
- text: 周杰伦
- q: 布拉格广场
- q: 播放暂停
  action: assertExists
watchers:
- q: 跳过

保存成文件test.yml,然后python -m uiautomator2.cli runyaml test.yml 运行

Yaml 文件的好处

  • 脚本更简单和直观
  • 使用非常少的接口dump_hierarchy, click。稳定性更好。

    先通过dump_hierarchy接口获取界面 xml,然后通过 lxml 库分析所有组件的位置,调用 click 完成操作。

  • 脚本运行的时候顺便输出日志,方便调试

  • 性能数据、执行截图可以顺便一起做了(当前现在还没实现)

Yaml 用例运行时的日志输出

[I 180904 16:38:57 runyaml:119] Test begins: 网易云音乐测试
[I 180904 16:38:57 runyaml:120] launch app: com.netease.cloudmusic
[I 180904 16:39:02 runyaml:128] ==> {'query': '//*[@content-desc="搜索"]'}
[I 180904 16:39:02 runyaml:87] click: (940, 1602)
[I 180904 16:39:02 runyaml:56] trigger watcher: {'timeout': 0, 'query': '跳过'}
[I 180904 16:39:04 runyaml:87] click: (1008, 156)
[I 180904 16:39:04 runyaml:128] ==> {'text': '周杰伦'}
[I 180904 16:39:05 runyaml:45] input text: 周杰伦
[I 180904 16:39:07 runyaml:128] ==> {'q': '布拉格广场'}
[I 180904 16:39:08 runyaml:87] click: (123, 1194)
[I 180904 16:39:09 runyaml:128] ==> {'q': '//*[@content-desc="播放暂停"]'}
[I 180904 16:39:10 runyaml:87] click: (540, 1773)
[I 180904 16:39:11 runyaml:130] Finished

yaml 具体配置

title 随便写
packageName 写了之后会调用session函数启动应用
steps 包含每一个操作步骤
点击操作的完整的写法如下

- action: click
  query: //*[@resource-id="tvb"]
  timeout: 10

因为 action 默认就是 click,timeout 默认 10s,query 可以简写成q, 所以可以简写成

- q: //*[@resource-id="tvb"]

如果 q 以/开头代表代表 xpath, 如果是字符串,则会按照正则匹配没有元素的 text 字段

实现输入的写法

- text: 要输入的内容

运行 Python 代码的写法

- action: python
  code: |-
    print("Hello world")

断言的写法

- action: assertExists
  q: 天气

watchers 这个字段的存在是为了方便点击弹窗,写法跟 steps 类似,区别就是 query 字段在这里是必须的,timeout 默认 0s

在每次操作 step 之前,都会先将 hierarchy 经过 watchers 处理。

后话

目前还只是 Beta 版,可以会有 Bug,可能功能还不完善,欢迎大家提意见,我们来一起把它完善了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 19 条回复 时间 点赞
codeskyblue 专栏文章:2018年 终总结 中提及了此贴 02月18日 10:26
AppetizerIO 回复

新版本偷偷发布到了分支里了,没敢往 master 里合并。图像识别还没充分测试,一直不满意。再加配置精简了新老版本不兼容,一直没信心对外发布。

AppetizerIO 回复

理想的配置应该是类似 gradle 这种基于编程模型的 dsl,不过目前 java 和 python 中还没有找到特别优雅的实现。

666,UI 点击炒鸡快准

如果封装好 还好 不过 因为 大部分都是自己搞 所以 懒得 维护呢

操作步骤 yml 还好 无非做好默认搜索方式然后多次猜测来简化用户表达 不过验证逻辑 yml 就蛋疼了
想到还有用 excel 写步骤的 其实和 yml 差不多
这种 case 描述最好大家能协作模块化 这对无论什么 ui 自动化工具都是类似的 是前端 比如 u2 和 appcrawler 统一一个格式
验证要考虑考虑 嵌入 yml 就意味着咬死一个语言了 可能无法跨工具通用

appcrawler 总算要有新版本了
@seveniruby u2 包了一个 jsonrpc 的东西 那个本来也是 java 写的 应该可以直接调

yml 的内容管理,缩进报错特别蛋疼,定位错误很麻烦。我们之前拿来管理测试数据用。楼主用 yml 记录操作行为,有点关键字驱动的味道

先收藏,等稳定了再使用,楼主是大神!!!

有的有的,get page source 的接口,或者 click,swipe 的接口。https://github.com/openatx/uiautomator2

codeskyblue 回复

因为 appium 和 selenium 的 java client 都没法支撑 uiautomator2 server,导致我的 appcrawler 也没法直接使用 uiautomator2 server。你的 atx 有 java 或者其他的接口可以调用嘛?实在没办法我也只能再封装个 uiautomator2 的 client 了。

codeskyblue 回复

会生效的,机制不一样,只有当需要对具体元素做操作的时候,才会生成 api 定位。而且失败了还会自动用 xpath 再重新定位一次确保万无一失。

yaml 之前都不知道为何物

codeskyblue 回复

哦哦,原来如此~

hello 回复

可以在里面用 Python 代码的

我想知道,逻辑计算之类的判断该怎么处理

代码写习惯了觉得代码才是最灵活的,如果这种框架不是自己开发的,往往遇到问题不知道如何解决很费时间。
当然,如果自己有能力,我觉得可以参考这种思想,自己弄一个出来自己用。

如果 xpath 转成 id 那原来的 triggerAction 还会生效吗

恩,没用到 selenium

你算上道啦。基于 page source 的定位方式比传统的 webdriver api 要灵活很多,我在新版本的 appcrawler 里增加了一个填写 xpath 定位自动在后台转成 id 定位的功能,用 xpath 和 id 定位其实已经速度上是一致的了。其次才是 yaml 格式带来的灵活配置。

最近我在帮客户做兼容性测试,发现了各家测试平台都不怎么支持 appium,目前也在想办法适配 atx 或 uiautomator2 server。目前 appium 后台开发的 uiautomator2 server 貌似不兼容标准的 selenium client,用的是短连接请求。你是没用 selenium 自己完全封装的?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册