基于UIRecorder的web端UI自动化重跑实现

上一篇写了移动端的基于testng+cucumber的自动化重跑,这一篇来记录一下web端的UI自动化重跑。由于web端用的是UIRecorder进行UI自动化的,比较方便,只需要录制回放即可,所以web端采用了它,用的工具不一样,重跑的方式就要重新配置。

重跑仍分为两部分内容:失败用例重跑、报告去重和更新。具体如下:

1、获取失败的场景列表

uirecorder执行完毕后,会生成一个report文件夹,里面存放报告的内容,如index.html和index.json。其中,index.json中存放所有用例步骤的执行情况,所有执行通过的用例、所有执行失败的用例和所有跳过的用例,数据十分详尽。index.json文件中数据结构如下:

基于UIRecorder的web端UI自动化重跑实现_第1张图片

其中allPasses、allFailures、allPending中分别存放所有通过、失败和跳过的用例。如,allFailures中内容大体如下:

基于UIRecorder的web端UI自动化重跑实现_第2张图片

由于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()

最终生成三个报告如下:

基于UIRecorder的web端UI自动化重跑实现_第3张图片

其中,第一个报告是第一次执行时生成的报告,第二个报告时失败重跑的场景执行情况报告,第三个是将整体用例执行情况进行汇总后的报告。虽然merge的报告只有数量进行了更新,具体步骤没有更新,但仍可通过查看rerun的报告中的具体步骤看执行情况。因为merge报告中失败的用例跟整体失败的用例是一致的。

 

 

你可能感兴趣的:(UI自动化)