最近因项目需要重新拾起了 UI 自动化,正好试用了下 Airtest,感觉开发脚本的效率确实高了许多,调试起来也很方便,但是不支持脚本批量执行这就非常不得劲了,所以那句老话就来了:“自己动手,丰衣足食”。

需求

  1. 脚本批量执行
  2. 每个脚本执行日志分开存放
  3. 每个脚本单独生成一个 html 报告并在父文件夹生成一个聚合报告

Airtest 执行脚本流程分析

Airtest 执行脚本的核心代码位于airtest\cli\runner.py中,大体流程如下:

  1. 解析命令行参数
  2. 实例化 AirtestCase 并添加到 suite 中
  3. 控制权交给 unittest 执行测试
  4. 由 unittest 调用 AirtestCase 的 runTest 方法
  5. 读入 Python 脚本内容,通过 exec 函数动态执行该脚本

根据上面的流程分析一下,run_script方法肯定要修改以便加入多个用例;在每次用例执行前我们都需要修改工作目录,因此setUp也需要修改。既然修改点明确了,那么我们来梳理一下思路:

  1. run_script方法中先遍历目录获取出所有用例,然后统一添加都 suite 中
  2. setUp方法中调用auto_setup方法设置日志路径,实现结果分开存放
  3. 因为setUp方法中需要知道每个脚本的日志路径,所以要为 AirtestCase 添加一个属性保存日志路径并在run_script方法中为其设置对应的值

至此执行部分分析完成

Airtest 生成报告流程分析

Airtest 生成报告的核心代码位于airtest\report\report.py中,大体流程如下:

  1. 解析命令行参数
  2. 加载并解析 log.txt
  3. 使用 jinja2 渲染模板

因为我们的日志是分开存放的,要给每个日志都生成一个 html 报告只需在main方法里加个循环,遍历所有日志即可;生成聚合报告这里有点麻烦,因为需要获取 LogToHtml 内部的test_result属性,但是 Python 的动态特性允许我们使用 types 动态的为实例绑定方法,所以我们可以定义一个方法返回test_result属性,然后绑定给实例就可以了;最后自定义一个模板,把收集到的结果通过 jinja2 渲染进去,大功告成!

效果图

自行修改

核心的逻辑在 runner.py 中,可根据自己的实际情况进行修改,目前 runner.py 中的逻辑如下:

  1. 获取 runner.py 同目录下所有以 “用例集” 结尾的文件夹
  2. 遍历第一步获取的每个文件夹,找出其中的 py 文件(以.py结尾的文件,会忽略以 “__” 开头的缓存文件)添加到测试集
  3. 执行用例时会默认执行脚本中的runCase方法,所以需要将测试代码封装成runCase方法,签名如下runCase(self, vars)代码位置

欢迎大家多提宝贵意见,谢谢
就酱,上个链接,溜了溜了。。。(o゚v゚) ノ

我是链接


↙↙↙阅读原文可查看相关链接,并与作者交流