筆者はSeleniumやAppiumを用いたpytestを使い、webアプリやモバイルアプリのUIテストを行なっています。
その際に、SeleniumやAppiumのサーバ側のエラーで通信タイムアウトが発生し、テストがFailしてしまうケースに遭遇しました。
そのため、テストがFailした結果の中に「webアプリやモバイルアプリ起因のFail」と「SeleniumやAppiumといったテスト環境起因のFail」が混ざってしまい、集計に手間がかかっていました。
通信タイムアウト自体はSeleniumやAppiumサーバを再起動することで復旧したため、pytestのセットアップ時に動作チェックする処理は盛り込んでいましたが、テスト途中でサーバ異常となることもあったため、テスト途中でも対策できないものかと悩んでいました。
そんな悩みを解決するための1つとして「pytest-rerunfailures」というパッケージを見つけました。
https://github.com/pytest-dev/pytest-rerunfailures
機能を抜粋すると
・Failが発生した後にpytestをやり直した結果がPassとなれば、最終的なpytest結果もPassとなる
・pytestにオプション設定すればFailしても指定回数だけpytestをやり直してくれる
$ pytest --reruns 5
・指定したエラーの時だけやり直すことができる
$ pytest --reruns 5 --only-rerun AssertionError
・指定したエラーの時だけFailとして終了することができる
$ pytest --reruns 5 --rerun-except AssertionError
となるため、例えば「アプリ内でエラーメッセージが発生した時はAssertionErrorを出すことでpytestをFailで終了させるが、通信エラー時のTimeoutErrorの時にはpytestをやり直す」といったことが実現できます。