QR Send

スマホとPCのChrome間で、URLやテキストをQRコード1回のペアリングで送り合える自作Chrome拡張。アカウント不要・無料。

使ってみる →

ruby + selenium(RSpecなど)の例外処理には回数を指定すべきです

Selenium・自動化

エラーを捕捉してくれる例外処理(begin,rescue,retry)

自動テストなどでは、対象のアプリの不具合ではなく、コードやマシンなどのクライアント側のエラーが発生した場合のために例外処理を入れると運用がスムーズになります。
これ超便利。「なぜか時々ここでコケるんだよなぁ。。。」っていう場合にエラーを捕捉して、その処理をやり直してくれます。

こんな感じですね。

begin
  # ここでよくエラーが起こるけど通る時もある
  driver.find_element(:id, 'element').click
rescue
  # エラーが起きたら処理をやり直す
  retry
end

begin句の処理が成功するまでエラーを吐かずにリトライしてくれます。
改めて超便利ですね。余計なsleepとか入れなくて良いので助かります。

 

永遠に通らなければただの無限ループになってしまうので危険

注意すべきは、begin句の処理が永遠に通らなければ、永遠にretryし続けます。
無限ループでテストが止まってしまいますね。

では、どうすべきか。

 

試行回数を指定して、超えたらraiseでエラーを発生させる

さすがに10回試して1度も通らなければアプリやテストコードを修正すべきでしょう。
ということで例外処理に回数を指定して、10回以上失敗したらエラーを発生させます。

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を発生させるのも良いのではないでしょうか。

コメント

  1. 伊藤淳一 より:

    こんにちは。
    retryは回数を制限しないと無限ループしてしまう、という説明は正しいのですが、自力で実装せずにrspec-retryというgemを使う方法もあります。
    僕はいつもこのgemを使っています。

    https://github.com/NoRedInk/rspec-retry

    ネットを探すと日本語の情報もいくつか見つかるはずです。
    もしご存じ出なかったら一度チェックしてみてください。

    • katsuya より:

      い、伊藤さんからコメントもらえるなんて。。。。著書読ませてもらっています!!素晴らしいです!!

      コメントがスパムばかりで気付きませんでした。。。

      なるほど、rspec中でリトライ回数などが指定できるのですね!知りませんでした!このgem参考にさせていただきます!!

タイトルとURLをコピーしました