airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告_airtest测试报告

1 # -- encoding=utf-8 --
2 # Run Airtest in parallel on multi-device
3 import os
4 import traceback
5 import subprocess
6 import webbrowser
7 import time
8 import json
9 import shutil
10 from airtest.core.android.adb import ADB
11 from jinja2 import Environment, FileSystemLoader
12
13
14 def run(devices, airs):
15 “”“”
16 run_all
17 18 19 “”"
20 try:
21 data_r=[]
22 global time_s
23 time_s = time.time()
24 for air in airs:
25 results = load_jdon_data(air)
26 tasks = run_on_multi_device(devices, air, results)
27 for task in tasks:
28 status = task[‘process’].wait()
29 results[‘tests’][task[‘dev’]] = run_one_report(task[‘air’], task[‘dev’])
30 results[‘tests’][task[‘dev’]][‘status’] = status
31 name = air.split(“.”)[0]
32 json.dump(results, open(get_path(“result”)+os.sep+name+‘data.json’, “w”), indent=4)
33 data_r.append(results)
34 run_summary(data_r)
35 except Exception as e:
36 traceback.print_exc()
37
38
39 def run_on_multi_device(devices, air, results):
40 “”"
41 在多台设备上运行airtest脚本
42 Run airtest on multi-device
43 “”"
44 tasks = []
45 for dev in devices:
46 log_dir = get_path(“log”,dev,air)
47 #命令行执行:airtest run openOrder.air --device Android://127.0.0.1:5037/b7f0c036 --log F:\airtest_code\good_store_project\log\openOrder
48 cmd = [
49 “airtest”,
50 “run”,
51 air,
52 “–device”,
53 “Android:///” + dev,
54 “–log”,
55 log_dir
56 ]
57 try:
58 tasks.append({
59 ‘process’: subprocess.Popen(cmd, cwd=os.getcwd()),
60 ‘dev’: dev,
61 ‘air’: air
62 })
63 except Exception as e:
64 traceback.print_exc()
65 return tasks
66
67 #点击每个用例的详情页面
68 def run_one_report(air, dev):
69 “”“”
70 生成一个脚本的测试报告
71 Build one test report for one air script
72 “”"
73 try:
74 log_dir = get_path(“log”,dev, air)
75 log = os.path.join(log_dir, ‘log.txt’)
76 if os.path.isfile(log):
77 #命令行执行:airtest report F:\airtest_code\good_store_project\openOrder.air --log_root F:\airtest_code\good_store_project\log\openOrder --outfile F:\airtest_code\good_store_project\log\openOrder\openOrder.html --lang zh
78 #如果是selenium,则最后要加上selenium插件
79 #airtest report F:\airtest_code\good_store_project\openOrder.air --log_root F:\airtest_code\good_store_project\log\openOrder --outfile F:\airtest_code\good_store_project\log\openOrder\openOrder.html --lang zh --plugins airtest_selenium.report
80 cmd = [
81 “airtest”,
82 “report”,
83 air,
84 “–log_root”,
85 log_dir,
86 “–outfile”,
87 os.path.join(log_dir, ‘log.html’),
88 “–lang”,
89 “zh”
90 ]
91 ret = subprocess.call(cmd, shell=True, cwd=os.getcwd())
92 return {
93 ‘status’: ret,
94 ‘path’: os.path.join(log_dir, ‘log.html’)
95 }
96 else:
97 print(“Report build Failed. File not found in dir %s” % log)
98 except Exception as e:
99 traceback.print_exc()
100 return {‘status’: -1, ‘device’: dev, ‘path’: ‘’}
101
102
103 def run_summary(data):
104 “”“”
105 生成汇总的测试报告
106 Build sumary test report
107 “”"
108 try:
109 for i in data:
110 c = get_json_value_by_key(i,“status”)
111
112 summary = {
113 ‘time’: “%.3f” % (time.time() - time_s),
114 ‘success’: c.count(0),
115 ‘count’: len©
116 }
117 summary[‘start_all’] = time.strftime(“%Y-%m-%d %H:%M:%S”,
118 time.localtime(time_s))
119 summary[“result”] = data
120 print(“summary++++++++++”,summary)
121
122 env = Environment(loader=FileSystemLoader(os.getcwd()),
123 trim_blocks=True)
124 html = env.get_template(‘report_tpl.html’).render(data=summary)
125 with open(“report.html”, “w”, encoding=“utf-8”) as f:
126 f.write(html)
127 webbrowser.open(“report.html”)
128 except Exception as e:
129 traceback.print_exc()
130
131
132 def load_jdon_data(air):
133 “”“”
134 加载进度
135 返回一个空的进度数据
136 “”"
137 clear_log_dir(air)
138 return {
139 ‘start’: time.time(),
140 ‘script’: air,
141 ‘tests’: {}
142
143 }
144
145 def clear_log_dir(air):
146 “”“”
147 清理log文件夹 openCard.air/log
148 Remove folder openCard.air/log
149 “”"
150 log = os.path.join(os.getcwd(), air, ‘log’)
151 if os.path.exists(log):
152 shutil.rmtree(log)
153
154 #获取key为status的值
155 def get_json_value_by_key(in_json, target_key, results=[]):
156 for key,value in in_json.items(): # 循环获取key,value
157 if key == target_key:
158 results.append(value)
159 if isinstance(value, dict):
160 get_json_value_by_key(value,target_key)
161 return results
162
163 #获取路径
164 def get_path(content,device=None,air=“openCard.air”):
165 root_path = os.getcwd()
166 path = os.getcwd()
167 if content==“result”:
168 #返回测试报告路径
169 path = os.path.join(root_path,“result”)
170 elif content == “log”:
171 log_dir = os.path.join(root_path,air, ‘log’, device.replace(“.”, "
").replace(’:', ‘_’))
172 #如果没有日志路径则创建一个
173 if not os.path.exists(log_dir):
174 os.makedirs(log_dir)
175 #返回日志路径
176 path = log_dir
177 elif content == “cases”:
178 #返回测试用例路径
179 path = os.path.join(root_path,air)
180 else:
181 #返回根目录
182 path = root_path
183 return path
184
185 #获取路径下所有air的测试用例文件
186 def get_cases(path):
187 cases=[]
188 for name in os.listdir(get_path(path)): # 遍历当前路径下的文件夹和文件名称
189 if name.endswith(“.air”):
190 cases.append(name)
191 return cases
192
193 def sort_cases(cases,loginAir,outAir):
194 #清除列表中的登录、退出登录,然后将其分别添加到列表的第一位和最后一位
195 cases.remove(loginAir)
196 cases.remove(outAir)
197 cases.insert(0, loginAir)
198 cases.insert(len(airs), outAir)
199 return cases
200
201
202 if name == ‘main’:
203
204 “”"
205 初始化数据
206 Init variables here
207 “”"
208 #获取所有已连接的设备列表
209 devices = [tmp[0] for tmp in ADB().devices()]
210 #设置指定设备执行测试用例
211 # devices = [“BTY4C16705003852”,“b7f0c036”]
212 #获取所有测试用例
213 airs = get_cases(“root”)
214 #将登录用例排在最前面执行,退出用例排在最后面执行
215 sort_airs = sort_cases(airs,“loginPro.air”,“loginOutPro.air”)
216 #获取指定用例,按顺序执行
217 # sort_airs = [“openCardPro.air”,“openOrderPro.air”,“quickMoneyPro.air”]
218 “”"
219 执行脚本
220 excute scripts
221 “”"
222 # 运行所有脚本
223 run(devices, sort_airs)

2.report_tpl.html

1
2
3
4
5
6
7
8
9 Airtest 多设备并行测试结果汇总
10
11
210
211


212

213

214

215

汇总报告

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

中…(img-VZ2jUkgV-1712641668961)]
[外链图片转存中…(img-Ucc65bDg-1712641668962)]
[外链图片转存中…(img-Bz00TmuN-1712641668962)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-7zmkL78o-1712641668962)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值