上一篇写了移动端的基于testng+cucumber的自动化重跑,这一篇来记录一下web端的UI自动化重跑。由于web端用的是UIRecorder进行UI自动化的,比较方便,只需要录制回放即可,所以web端采用了它,用的工具不一样,重跑的方式就要重新配置。
重跑仍分为两部分内容:失败用例重跑、报告去重和更新。具体如下:
1、获取失败的场景列表
uirecorder执行完毕后,会生成一个report文件夹,里面存放报告的内容,如index.html和index.json。其中,index.json中存放所有用例步骤的执行情况,所有执行通过的用例、所有执行失败的用例和所有跳过的用例,数据十分详尽。index.json文件中数据结构如下:
其中allPasses、allFailures、allPending中分别存放所有通过、失败和跳过的用例。如,allFailures中内容大体如下:
由于UI自动化运行时需要有上下文,所以不能单独只跑失败的那几步,需要将存在失败或者跳过的用例对应的场景均重跑一遍。
通过获取allFailures和allPending中的fullTitle来获取需要重跑的场景列表。由于同一个场景中可能有多步失败,所以统计时需要进行去重。
代码如下:
def getAllFailuresFile(r):
failure_json = r['allFailures']
pending_json = r['allPending']
list = []
for str1 in failure_json:
file_name = str1['fullTitle'].split(':')[0].split('/')[1].strip() + ".js"
if file_name not in list:
list.append(file_name)
for str2 in pending_json:
file_name2 = str2['fullTitle'].split(':')[0].split('/')[1].strip() + ".js"
if file_name2 not in list:
list.append(file_name2)
print("==========需要重跑的文件列表如下:\n{}".format(list))
return list
2、获取了需要重跑的列表后,对其进行重跑:
def reRunFailScript(url,list):
allfile = ""
for filename in list:
file = url + filename
allfile += file + " "
print(allfile)
os.system("mocha {} --reporter mochawesome-uirecorder".format(allfile))
3、报告更新和去重
由于报告的形式是html形式,而且每个步骤等数据比较复杂,所以通过只修改通过、失败、跳过的个数,具体的步骤看失败重跑的报告即可。
多次尝试直接通过python修改html文件,都没有达到效果,于是采用了一个非常笨拙的“曲线救国”的方式:先建一个test.html文件,把之前生成的报告index.html文件以iframe的方式嵌入到test.html中,然后把需要修改的字段赋值为一个可识别的字符串,然后通过python脚本修改对应的字符串。
test.html文件如下:
test
更新报告的python脚本如下:
def updateHTMLData(html_file,old_json_file,new_json_file):
if not os.path.exists(html_file):
exit(-1)
f = open(html_file,"rb")
lines = f.readlines()
f.close()
f = open(html_file,"wb+")
tests,passes,pending,failures = replaceSourceAllSuiteFail(old_json_file,new_json_file)
for line in lines:
if line.find("333")>=0:
f.writelines(re.sub("333",str(tests),line))
elif line.find("444")>=0:
f.writelines(re.sub("444",str(passes),line))
elif line.find("555")>=0:
f.writelines(re.sub("555",str(failures),line))
elif line.find("666")>=0:
f.writelines(re.sub("666",str(pending),line))
elif line.find("777") >= 0:
f.writelines(re.sub("777", str(round(pending * 100/tests,2)) + "% Pending", line))
elif line.find("888") >= 0:
f.writelines(re.sub("888", str(round(passes * 100/tests,2)) + "% Passing", line))
else:
f.writelines(line)
f.close()
最终生成三个报告如下:
其中,第一个报告是第一次执行时生成的报告,第二个报告时失败重跑的场景执行情况报告,第三个是将整体用例执行情况进行汇总后的报告。虽然merge的报告只有数量进行了更新,具体步骤没有更新,但仍可通过查看rerun的报告中的具体步骤看执行情况。因为merge报告中失败的用例跟整体失败的用例是一致的。