如何在jenkins中持续集成pytest并生成Allure报告之踩坑记之获取用例总数

最近开始使用pytest和allure并使用jenkins持续集成,目前成果:自动生成接口case(根据charles导出.chlsj),jenkins持续集成,邮件通知(此处有坑)等,相关代码会在全部完成后公开git,先上执行效果图

Allure报告效果图
邮件通知效果图

这里先记录一下遇到的坑:

坑①:邮件通知时无法获取用例个数

具体描述:pytest执行时要生成allure2的报告,导致不能同时生成xml,html或者其他类型文件,这又导致jenkins使用的邮件报告不能使用Junit或者TestNG插件以${TEST_COUNTS,var=”xxx”}的方式调用测试结果。

解决方案:

❌:jenkins使用Text Finder插件,邮件模板直接使用 ${BUILD_LOG_MULTILINE_REGEX}参数去正则匹配运行日志(如:${BUILD_LOG_MULTILINE_REGEX,showTruncatedLines=”false”,regex=”(?<=passed,\ )\d+”}),可以匹配到,但无法对结果进行运算,无法得到用例总数,失败

❌:邮件模板中使用js,基于上面基础,使用js正则匹配(可以做精准匹配),然后计算用例总数,最后js赋值给相应用例标签(惊喜,终于搞定),然后测试发现邮件会屏蔽所以js,不管js在header还是body,统统屏蔽,防止js注入,失败

✅:jenkins使用Text Finder插件,保存日志结果为xxx.log(开始觉得pytest应该可以保存运行日志,找了一下没找到,放弃),在pytest脚本执行完成后,再构建一个shell,运行脚本check_results去正则匹配用例数了(终于可以直接用脚本去匹配😊),代码如下:

import os,re
PATH = os.path.split(os.path.realpath(__file__))[0]
def checked():
    
    with open(PATH + "/"+"results.log","r", encoding="utf-8") as f:  
        for line in f.readlines():
           
            if "====================" and "passed"  in line:
                passed = r"\b(\w+)\b\s*[^d][^and]?\s*\\?passed"
                failed = r"\b(\w+)\b\s*[^d][^and]?\s*\\?failed"
                skipped = r"\b(\w+)\b\s*[^d][^and]?\s*\\?skipped"
                #passed = re.findall(",(.*?)passed,",line)
                #failed = re.findall("====================(.*?)failed,",line)
                passed = re.findall(passed,line)
                failed = re.findall(failed,line)
                skipped = re.findall(skipped,line)
                if len(passed) == 0:
                    passed.append("0")
                if len(failed) == 0:
                    failed.append("0")
                if len(skipped) == 0:
                    skipped.append("0")                
                total = int(passed[0]) + int(failed[0]) +int(skipped[0])
                if os.path.exists(PATH + "/" + "results.txt"):  
                    os.remove(PATH + "/" + "results.txt")
                with open(PATH + "/"+"results.txt","w") as r:
                    r.write("passed=%s\n"%passed[0])
                    r.write("failed=%s\n"%failed[0])
                    r.write("skipped=%s\n"%skipped[0])
                    r.write("total=%s\n"%total)
                    
if __name__ == '__main__':  
    checked()

然后通过这个脚本生成一个environment.txt

passed=9
failed=2
skipped=1
total=12

最后在jenkins中增加构建步骤使用Inject environment variables把environment.txt文件加载到默认环境变量,此时邮件中就可以任性调用了✌️

成功

打赏 赞(2) 分享
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注