ruby + selenium(RSpecなど)の例外処理には回数を指定すべきです
エラーを捕捉してくれる例外処理(begin,rescue,retry)
自動テストなどでは、対象のアプリの不具合ではなく、コードやマシンなどのクライアント側のエラーが発生した場合のために例外処理を入れると運用がスムーズになります。
これ超便利。「なぜか時々ここでコケるんだよなぁ。。。」っていう場合にエラーを捕捉して、その処理をやり直してくれます。
こんな感じですね。
1 2 3 4 5 6 7 |
begin # ここでよくエラーが起こるけど通る時もある driver.find_element(:id, 'element').click rescue # エラーが起きたら処理をやり直す retry end |
begin句の処理が成功するまでエラーを吐かずにリトライしてくれます。
改めて超便利ですね。余計なsleepとか入れなくて良いので助かります。
永遠に通らなければただの無限ループになってしまうので危険
注意すべきは、begin句の処理が永遠に通らなければ、永遠にretryし続けます。
無限ループでテストが止まってしまいますね。
では、どうすべきか。
試行回数を指定して、超えたらraiseでエラーを発生させる
さすがに10回試して1度も通らなければアプリやテストコードを修正すべきでしょう。
ということで例外処理に回数を指定して、10回以上失敗したらエラーを発生させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
i = 0 begin driver.find_element(:id, 'element').click rescue # 10回まではやり直す if i < 10 i += 1 # sleepを短めに入れて再試行 sleep 0.2 retry else # エラーを発生させて止める raise end end # => : unhandled exception |
簡単ですね。
また、以前記事にも書いたのですが、補足したエラーを表示させつつ、retryすることもできます。
通ったけど、何か問題があるよっていうことを知らせてくれます。
rescueでどんなエラーが起きたか表示させる | katsulog
RSpecであればpendingを発生させるのも良いのではないでしょうか。
こんにちは。
retryは回数を制限しないと無限ループしてしまう、という説明は正しいのですが、自力で実装せずにrspec-retryというgemを使う方法もあります。
僕はいつもこのgemを使っています。
https://github.com/NoRedInk/rspec-retry
ネットを探すと日本語の情報もいくつか見つかるはずです。
もしご存じ出なかったら一度チェックしてみてください。
い、伊藤さんからコメントもらえるなんて。。。。著書読ませてもらっています!!素晴らしいです!!
コメントがスパムばかりで気付きませんでした。。。
なるほど、rspec中でリトライ回数などが指定できるのですね!知りませんでした!このgem参考にさせていただきます!!