最近在使用airtest进行app自动化,但是只能单个执行,实际需要批量执行。看了网上很多文章,其实很多都没真正实践或者说实践不完全,用的不好用。所以,就自己在那些文章的基础上进行了改进与优化。

一、结构


settings.py:放置配置信息,需要修改配置信息直接改改文件即可,不必到代码去改。

air:该项目下所有的.air文件都存放在这。可以在新建.air文件时直接放到此目录即可。

lib:公共方法库,看自己需求可将一些公共方法提取出来放到此文件夹下,方便重复调用。

log:将所有.air执行过程中的log和最终的html都放到该目录下

template:存放各种html模板的文件夹,可以放多个,需要变更时到settings.py里修改所要用的模板名称即可。

report:存放测试报告

二、执行文件

直接上代码:

from airtest.cli.runner import AirtestCase,run_script
import airtest.report.report as report
from conf.settings import *
from argparse import *
import shutil,os,io,jinja2,datetimeclass Air_Case_Handler(AirtestCase):def setUp(self):super(Air_Case_Handler, self).setUp()def tearDown(self):super(Air_Case_Handler,self).tearDown()def run_air(self,air_dir,device):start_time = datetime.datetime.now()start_time_fmt = start_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]results = []root_log = log_pathif os.path.isdir(root_log):shutil.rmtree(root_log)else:os.makedirs(root_log)for file in os.listdir(air_path):if file.endswith(".air"):airName = fileairDirName = file.replace(".air","")script = os.path.join(air_dir,file)air_log = os.path.join(root_path,"log\\" + airDirName)if os.path.isdir(air_log):#print(air_log)shutil.rmtree(air_log)else:os.makedirs(air_log)html = os.path.join(air_log,"log.html")args = Namespace(device=device, log = air_log, recording=None, script=script)try:run_script(args,AirtestCase)except AssertionError as e:passfinally:rpt = report.LogToHtml(script, air_log)rpt.report("log_template.html", output_file=html)result = {}result["name"] = airName.replace('.air', '')result["result"] = rpt.test_resultresults.append(result)end_time = datetime.datetime.now()end_time_fmt = end_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]duration = (end_time - start_time).secondsenv = jinja2.Environment(loader=jinja2.FileSystemLoader(template_path),extensions=(),autoescape=True)template = env.get_template(template_name, template_path)project_name = root_path.split("\\")[-1]success = 0fail = 0for res in results:if res['result']:success += 1else:fail += 1report_name = "report_"+end_time.strftime("%Y%m%d%H%M%S")+".html"html = template.render({"results": results,"stime":start_time_fmt,'etime':end_time_fmt,'duration':duration,"project":project_name,"success":success,"fail":fail})output_file = os.path.join(root_path,"report" ,report_name)with io.open(output_file, 'w', encoding="utf-8") as f:f.write(html)if __name__ == "__main__":test = Air_Case_Handler()test.run_air(air_path,devices)

这样,执行下来会发现只要有个地方报错就会中断,不在执行剩余用例。原因在于airtest包里面的runner.py文件里的run_script方法写的是在遇到断言失败时,直接终止程序:sys.exit(-1),找到该文件

pthon\Lib\site-packages\airtest\cli\runner.py

改一下即可:

三、测试报告

先上效果图:

这个算朴素版的模板,有需要的可以自己再额外扩展。
几个点说明一下:
1、模板里的参数都来源于runCase.py,采用的是flask框架,参数通过template.render()来传递,可自行增删改。html里调用是通过{{varname}}实现的。
2、各个用例具体结果是放在log目录下,而report.html是放在report文件加下,所以template里的href路径要改为../log/xxxx
3、页面引用了jquery/echart/bootstrap都是线上引用,所以如果没上网的话可能界面会变得更朴素点哈

template_summary.html

<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
<html>
<head><title>测试报告</title><style>.fail {color: red;text-align: center;}.success {color: green;text-align: center;}.details-col-elapsed {text-align: center;}.details-col-msg {text-align: center;background-color:#ccc;}</style>
</head>
<body>
<div>
<div class="panel panel-primary" style="margin-right: 20px;"><div class="panel-heading"><h2><span class="text-success"><i class="glyphicon glyphicon-flag"></i></span>《{{project}}》<small><font color="white">测试结果</font></small></h2></div><div class="panel-body"><h4>开始时间:<code>{{stime}}</code></h4><h4>结束时间:<code>{{etime}}</code></h4><h4>累计耗时:<code><span style="background-color:lightgray;border-radius:5px;padding-left:3px;padding-right:3px;"><font color="blue">{{duration}}秒</font></span></code></h4><h4>测试结果:Total-&nbsp;<font color="DodgerBlue">{{results|length}}</font>,&nbsp;Success-&nbsp<font color="green">{{success}}</font>,&nbsp;Fail-&nbsp;<font color="red">{{fail}}</font></h4><div class="col-xs-9"><table width="800" border="thin" cellspacing="0" cellpadding="0" class='table table-striped'><tr  width="600"><th class="details-col-msg col-xs-1">序号</th><th width="300" class='details-col-msg   col-xs-3'>用例名称</th><th class='details-col-msg  col-xs-3'>执行结果</th></tr>{% for r in results %}<tr><td class="details-col-elapsed  col-xs-1">{{loop.index}}</td><td class='details-col-elapsed  col-xs-3'><a href="../log/{{r.name}}/log.html" target="view_window">{{r.name}}</a></td><td class="{{'success' if r.result else 'fail'}}   col-xs-3">{{"成功" if r.result else "失败"}}</td></tr>{% endfor %}</table></div><div class="col-xs-4 pull-left"><div id="pie_echarts" class="layui-card-body" style="width: 100%;height:200%;"></div></div></div>
</div>
</body>
<script src="https://cdn.bootcss.com/echarts/4.4.0-rc.1/echarts.min.js"></script>
<script>
// 基于准备好的dom,初始化echarts实例var myChart = echarts.init(document.getElementById('pie_echarts'));// 指定图表的配置项和数据option = {title: {text: '执行结果统计:',x: 'left'},tooltip: {trigger: 'item',formatter: "{a} <br/>{b} : {c} ({d}%)"},color: ['#CD5C5C',  '#9ACD32'],stillShowZeroSum: false,series: [{name: '测试结果',type: 'pie',radius: '80%',center: ['60%', '60%'],data: [{value: {{fail|tojson}}, name: '失败'},{value: {{success|tojson}}, name: '成功'}],itemStyle: {emphasis: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(128, 128, 128, 0.5)'}}}]};// 使用刚指定的配置项和数据显示图表。myChart.setOption(option);</script>
</html>

四、执行

执行脚本必须cmd进入到目录下,用

Python runCase.py

才可以。不然会报

嗯。热乎的!刚出炉的!有实际实践的!希望有用。
至此。

源码:https://pan.baidu.com/s/1XzgKAv01PC1fHTDlgeDBHg
解压密码:1234

Airtest自动化测试——批量执行脚本(实测)相关推荐

  1. linux批量执行命令脚本,2.3-命令批量执行脚本

    命令批量执行脚本,同样需要两个脚本来实现:1 exe.expect 2 exe.sh 3 ip.list    IP列表 cat exe.expect #!/usr/bin/expect set ho ...

  2. 使用sshpass在Linux服务器上批量执行脚本

    用途描述: 如果Linux服务器未配置免密登录,每次使用ssh执行远程脚本时,都需要输入密码. 使用sshpass命令可以在多个Linux服务器上批量执行脚本,操作步骤如下: 1.安装sshpass ...

  3. Oracle批量执行脚本文件

    在工作过程中遇到需要执行60多个存储的脚本,一个一个执行费时费力,总结一个批量执行脚本的方法: 第一步:cmd 打开DOS窗口,输入命令dir c:\users\procedure/s/b > ...

  4. bat+sqlcmd 批量执行脚本

    Hello,此BAT脚本能够帮助开发者将某目录下全部SQL脚本按文件名称依次在指定数据库中批量执行. 不用忍受powershell invoke-sqlcmd 的笨重.在指执行时多一种选择. bat文 ...

  5. 利用bat批量执行脚本文件

    1.读取目录文件 利用bat 的for命令读取中的sql文件 for /r %%c in (0*.sql) do echo %%c %%c 相当于变量 in() 中的为循环的范围 此句的作用是显示当前 ...

  6. 通过ANT实现jmeter批量执行脚本、生成报告、发送邮件全套build.xml文件

    在开始通过ANT运行build.xml之前,有一步必须要做,那就是将JMeter所在目录下extras子目录里的ant-JMeter-1.1.1.jar复制到Ant所在目录lib子目录之下,这样Ant ...

  7. 存储过程批量执行脚本

    DELIMITER $$ CREATE PROCEDURE test_insert3 () BEGINDECLARE i INT DEFAULT 0;DECLARE order_no INT DEFA ...

  8. sqlplus中批量执行sql脚本(Oracle)

    假如我们有很多sql脚本,如果一个一个sql脚本文件执行显然过于麻烦,下边我们演示sql脚本批量执行. 解决方法:将需要执行的sql脚本文件的@绝对路径 存放到一个脚本文件中,然后执行这个脚本文件就可 ...

  9. java ui自动化测试脚本,如何用Airtest编写UI自动化脚本(示例代码)

    前言 游戏并不像app一样直接把渲染树节点暴露出来,这就造成游戏UI自动化在元素定位上的不方便性,不过依赖airtest的图片识别,我们可以直接跳过元素检查,以图片对比的形式进行自动化,虽然效率可能会 ...

最新文章

  1. Python入门100题 | 第016题
  2. 概率论 第二章 随机变量及其分布
  3. Hive参数性能调优
  4. 奋斗吧!我们为之奋斗的正则表达式
  5. 高程图 GridMap
  6. 【论文笔记】中文词向量论文综述(二)
  7. 安装flash player提示版本不是最新,无法安装
  8. zigbee协议栈学习(0)
  9. ppt制作弹跳的小球动画效果_PPT制作弹跳的小球动画效果实例教程
  10. opencv学习十三:图像金字塔和图像梯度
  11. 搜索优化之四叉树算法(三)
  12. apk编辑器android源码,APK编辑器
  13. NShape(开源矢量图形编辑器) 入门(一)
  14. Studing Day2 - python基础2
  15. 对话霍金弟子:AI能帮助人类到其他星球进行时空旅行 | AI英雄
  16. 后台系统的权限控制与管理
  17. 笔记本故障:输入密钥界面没有文字
  18. 澤地萃 (易經大意 韓長庚)
  19. 毕业1年半,我从月薪3000变成百万粉丝博主 | 附野生运营技巧
  20. python爬虫案例——东方财富股票数据采集

热门文章

  1. 头指针为head的带头结点的单链表判空条件head->next==null?
  2. Windows原版系统下载地址
  3. 复盘:智能座舱系列文五- 它的3种交互方式之隐式交互
  4. 生成树协议(RTP、RSTP、MSTP)
  5. STP/RSTP协议(二)
  6. tomcat下载、安装、配置(新手教程墨迹版)
  7. MX25上SD卡的插拨检测机制
  8. 学习C语言:自幂数最通俗讲解
  9. 手把手教你入门Hadoop(附代码资源)
  10. Hadoop入门及官网教程