pytest合并allure报告解决方案
背景
在执行自动化测试的过程中,为了实现自动化的高通过率,可能会反复的重试,直至大多数甚至全部用例执行通过,以此来需要人为分析的用例量,减少人力投入,提高执行效率;
在用例少或者资源消耗小,用例执行快速高效的情况下,可以每次都执行全量用例,但是一旦用例数达到一定量级,全量重试就不再适用,重试失败用例或者指定用例才能满足需求。
在前面的文章中 pytest构造测试缓存执行指定用例 提到构造测试缓存执行指定用例,或者将使用上次测试任务归档的缓存重试失败的用例,使用缓存测试的方法可以执行指定用例,大大提高执行效率。
但是反复的重试,有带来的新的问题,报告有多份,第一份报告包含全部用例数据,通过率可能又不甚理想,后续报告通过率上去了,但缺失了大部分的测试用例,可能无法全面反映测试状况。
测试任务 | 输入描述 | 输出 |
---|---|---|
任务A | 无缓存,全量测试 | 缓存A,报告A |
任务B | 使用缓存A重试 | 缓存B,报告B |
任务C | 使用缓存B重试 | 缓存C,报告C |
任务D | 使用缓存C重试 | 缓存D,报告D |
… | … | … |
基于上述种种问题,实践中,理想自动化测试的理想状态是:使用缓存重试失败用例,每次报告都包含全部的测试用例数据,在每份报告的用例总数不变的情况下,用例的整体通过率能够逐渐提高
本文将提供解决方案,在实践中可以有效地提升自动化测试报告的质量与效率,确保在反复重试过程中,无论是报告的完整性还是数据呈现都得到合理保障
测试前置改造
前置中增加两个变量pytest_cache
与allure_result
用于传递缓存与allure结果文件压缩包下载地址,通过判断是否有对应参数值进行下载解压到工作目录,参考示例脚本:
- pytest_cache:缓存下载地址
- allure_result:allure结果文件下载地址
# /bin/bash
# 变量参数(触发测试任务时传递)
export pytest_cache=http://10.132.1.127:8123/PytestTask/1000_pytest_cache.tar.gz
export allure_result=http://10.132.1.127:8123/PytestTask/1000_allure-results.tar.gz # 判断是否有指定缓存,如果有就下载缓存,用例重试失败用例
if [ -n "$pytest_cache" ]; thencd ${WORKSPACE};wget ${pytest_cache} -O ./pytest_cache_old.tar.gz;tar -zxf ./pytest_cache_old.tar.gz;
fi# 判断是否有指定报告数据,如果有就下载,用于后续合并
if [ -n "$allure_result" ]; thencd ${WORKSPACE};wget ${allure_result} -O ./allure_result_old.tar.gz;tar -zxf ./allure_result_old.tar.gz;
fi
pytest测试命令
pytest测试命令必须指定参数:--last-failed --last-failed-no-failures all --alluredir ./allure-results
其中--alluredir
参数指定的值必须为/allure-results
因为后文会对其进行打包归档
- –last-failed
功能:此选项指示 pytest 仅运行上次测试运行中失败的测试用例。如果上次运行中有测试未通过,这个选项会让你专注于解决这些具体的失败用例,而不是每次都运行所有测试。
应用场景:在调试时,如果你发现某些测试失败,这个选项允许你快速重试并关注那些失败的测试,而不必进行全面的测试。 - –last-failed-no-failures all
功能:此选项用于扩展 --last-failed 的功能。如果在上次测试中没有任何失败的测试用例,则会运行所有测试。
应用场景:这确保了即使在上一次运行中没有失败,你也能执行整个测试套件,确保代码的完整性和正确性。 - –alluredir ./allure-results
功能:此选项指定了用于存储测试报告结果的目录,它用于与 Allure 报告工具兼容。执行测试后,pytest 会将测试结果(成功和失败)以 Allure 支持的格式存储到你指定的目录(在这里是 ./allure-results)。
应用场景:这样做可以生成可视化的测试报告,便于后期查看和分析测试结果。运行完成后,可以使用 Allure 命令生成和查看测试报告,帮助更好地理解测试情况。
完整的pytest测试命令例如:pytest -v -s -l ${test_dir} -m "${mark}" --last-failed --last-failed-no-failures all -n ${concurrency} --reruns ${reruns} --timeout 7200 --show-capture=stderr --dist=worksteal --durations=30 --alluredir ./allure-results
测试后置改造
改造测试后置,主要是生成测试报告,并且将测试生成的一些文件进行打包上传归档,便于后续使用(这里的文件服务是一个单独的web服务)
# /bin/bash
# 参数变量
# 文件服务地址,用于缓存文件
export file_server=10.132.1.127:8123
# 文件服务地址上存放的目录
export save_dir=PytestTask
# 测试任务编号(正常应该是读取环境变量)
export task_num=1001# 生成报告
allure generate -c -o allure-report ./allure-results# 声明报告类型数组
report_types=("allure-report" "allure-results" "pytest_cache")# 打包文件
for report_type in "${report_types[@]}"; dotar_name="${task_num}_${report_type}.tar.gz"if [[ "$report_type" == "pytest_cache" ]]; thentar -zcf ${tar_name} ./.pytest_cacheelsetar -zcf ${tar_name} ./${report_type}fi
done# 上传文件
for report_type in "${report_types[@]}"; dofile_address="./${task_num}_${report_type}.tar.gz"curl -X POST "http://${file_server}/files/${save_dir}" -F "file=@$file_address" || echo -e "\033[31m ${file_server}服务异常,报告上传失败 \033[0m"
done# 输出下载地址
echo -e "\e[31m 归档文件下载地址: http://${file_server}/${save_dir}/${task_num}_allure-results.tar.gz \e[0m"
echo -e "\e[31m 归档报告下载地址: http://${file_server}/${save_dir}/${task_num}_allure-report.tar.gz \e[0m"
echo -e "\e[31m 归档缓存下载地址: http://${file_server}/${save_dir}/${task_num}_pytest_cache.tar.gz \e[0m"