最近在使用airtest进行app自动化,但是只能单个执行,实际需要批量执行。看了网上很多文章,其实很多都没真正实践或者说实践不完全,用的不好用。所以,就自己在那些文章的基础上进行了改进与优化。
settings.py
:放置配置信息,需要修改配置信息直接改改文件即可,不必到代码去改。
air:
该项目下所有的.air文件都存放在这。可以在新建.air文件时直接放到此目录即可。
lib:
公共方法库,看自己需求可将一些公共方法提取出来放到此文件夹下,方便重复调用。
log
:将所有.air执行过程中的log和最终的html都放到该目录下
template
:存放各种html模板的文件夹,可以放多个,需要变更时到settings.py里修改所要用的模板名称即可。
直接上代码:
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,datetime
class 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_path
if 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 = file
airDirName = 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:
pass
finally:
rpt = report.LogToHtml(script, air_log)
rpt.report("log_template.html", output_file=html)
result = {}
result["name"] = airName.replace('.air', '')
result["result"] = rpt.test_result
results.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).seconds
env = 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 = 0
fail = 0
for res in results:
if res['result']:
success += 1
else:
fail += 1
report_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)
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
"Content-Type" content="text/html; charset=utf-8" />
测试报告
"panel panel-primary" style="margin-right: 20px;">
《{{project}}》测试结果
开始时间:{{stime}}
结束时间:{{etime}}
累计耗时:"background-color:lightgray;border-radius:5px;padding-left:3px;padding-right:3px;">{{duration}}秒
测试结果:Total- {{results|length}}, Success- {{success}}, Fail- {{fail}}
序号
用例名称
执行结果
{% for r in results %}
{{loop.index}}
{{r.name}}/log.html" target="view_window">{{r.name}}
{{'success' if r.result else 'fail'}} col-xs-3">{{"成功" if r.result else "失败"}}
{% endfor %}
"col-xs-4 pull-left">
"pie_echarts" class="layui-card-body" style="width: 100%;height:200%;">
四、执行
执行脚本必须cmd进入到目录下,用
Python runCase.py
才可以。不然会报
嗯。热乎的!刚出炉的!有实际实践的!希望有用。
至此。
源码:https://pan.baidu.com/s/1XzgKAv01PC1fHTDlgeDBHg
解压密码:1234