Appium 如何实现跑完所有用例之后再将失败的用例重跑一次?

醋精测试媛 · June 02, 2021 · Last by 醋精测试媛 replied at June 04, 2021 · 3881 hits

在之前的帖子 ( https://testerhome.com/topics/29456 ) 中,有大佬提到过这样的一个重跑建议:

全部跑完之后记录下来哪些用例时跑失败的,然后再重新跑一遍失败的用例。重跑和第一次执行的内容是毫无关联的。

今天想将其实现一下,但是发现 pytest 的 pytest-rerunfailures 插件中的 reruns 设置之后,是当一个用例失败之后就马上重跑,而 pytest-repeat插件中的 count 设置之后是不管是否失败都会重跑。

发现了 pytest-rerunfailures 中有--lf可以实现重跑上次失败的用例,所以想试试,我是这样设置的:

login_tests_json_report = "./outputs/reports"
login_tests_html_report = "./outputs/reports/login"
pytest.main(["-m login", f"--alluredir={login_tests_json_report}"])
pytest.main(["-m login", "--lf"])
os.system(f"allure generate {login_tests_json_report} -o {login_tests_html_report} --clean")
os.system(f"allure serve {login_tests_json_report}")

但是我发现 allure 报告中只有重跑后的结果记录,即只有pytest.main(["-m login", "--lf"])运行后的报告,retries 中没有相关的信息,并且我没有添加 “ --clean-alluredir” 之类的参数。

报告如下:

请问,如何实现既能 “跑完所有用例之后再将失败的用例重跑一次” 又能 在 allure 报告的 history 或者 retries 中显示呢?还是说其实--lf 可以实现但是我用的不对?

共收到 16 条回复 时间 点赞

想实现 “跑完所有用例之后再将失败的用例重跑”,可以用pytest-xdist,设置参数--looponfail,这个参数作用是 after each run pytest waits until a file in your project changes and then reruns the previously failing tests。遗憾的是我没找到哪个参数可以设定重试次数,某博主说会一直重试直到所有测试通过。所以 “重跑一次” 还得再想办法。
pytest-rerunfailures实现的是当前用例失败后重跑当前用例,没达到设定重试次数通过了就跑下条用例,达到设定重试次数失败也是跑下条用例。
pytest-repeat实现的是当前用例重跑,不管每次结果是通过还是失败,必须跑够设定次数,然后跑下条用例。
allure 报告的 history 或者 retries。history 一般用于 CI,显示的是运行历史记录,比如共运行了 9 次 (注意,不是重试9 次),每次在什么时间运行的及运行结果。然后点击选中某条记录,可以在 retries 页面看到它是重试3 次运行通过的 (设置的最大重试次数是 5 次),分别对应的 3 条记录是,pass 2021/05/27 at 23:35:16,broken 2021/05/27 at 22:56:12,broken 2021/05/27 at 19:13:56

Thirty-Thirty 回复

pytest-xdist 我没有注意过,因为我觉得 ui 自动化测试应该无法实现分布式,参数--looponfail 可以直接用吗,另外,最重要的是,这个可以和 allure 结合嘛

可以直接用。使用 pytest-xdist 可以实现分布式 UI 自动化测试。可以跟 allure 结合。

厉害啦小姐姐!做好了 UI 自动化,再去看 API 自动化就会感觉 so easy,呵呵!

我更新了在 1 楼的回复,之前存在部分错误

Thirty-Thirty 回复

谢谢!!

有现成的插件可以使用吗?没有的话可以通过判断 pytest 运行后缓存文件 lastfailed 里的内容进行判断,路径一般在项目文件夹下的.pytest_cache\v\cache\lastfailed,这里会保存上一次运行失败的结果
如果用例全成功这里的内容就是个空{},否则会保存失败的用例名称。写个 run 方法来运行所有用例 pytest.main(),然后判断 lastfailed 中的内容是否为{},不为空再调一次 pytest.main(["--lf"])
没现成插件的话这种方式应该能满足你的需求

Yh。 回复

你可以看到我上面的问题是你写的方式,但是,遇到了 allure 报告无法获取到前面一次的执行结果的问题

我自己写了个 demo 试了下,没问题的

Yh。 回复

是我写的哪里不对吗?

你试试看把这两句注释了
os.system(f"allure generate {login_tests_json_report} -o {login_tests_html_report} --clean")
os.system(f"allure serve {login_tests_json_report}")
运行之后执行 allure serve 报告路径

这样试试

Yh。 回复

这两句生成 allure 报告,请问如果注释掉如何生成呢

只留 os.system(f"allure serve {login_tests_json_report}") 试试

Yh。 回复

好的,我试试。谢谢你

不能注释掉整行吧,试试只删除--clean

17Floor has deleted
login_tests_json_report = "./outputs/reports"
login_tests_html_report = "./outputs/reports/login"
pytest.main(["-m login", f"--alluredir={login_tests_json_report}", "--clean-alluredir"])
pytest.main(["--lf", f"--alluredir={login_tests_json_report}"])
os.system(f"allure generate {login_tests_json_report} -o {login_tests_html_report} --clean")
os.system(f"allure serve {login_tests_json_report}")

一次 clean alluredir,一次不 clean
另外下面的--clean 不能删

醋精测试媛 关闭了讨论 04 Jun 17:43
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up