Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。一括でのテストの場合に、たまにエラーになるケースがあります。環境は下記のような感じです。'random'にしています。randomでない場合に一括実行すると必ずエラーになるのでrandomにしています。テストコードは、具体的には以下。その他にも同じようにランダムにエラーになる箇所があります。endエラー内容は、他のケースでも以下のような感じです。このようなケースに陥った方アドバイスをお願いします。endendrspec_helperは以下の通りです。}をspec_helper.rbに追記。'random'をコメントアウト。spec/feature/のみテスト。end上記のテストコードでエラーとなる。failures)しかし、再度実行すると、エラーとなります。(エラーになるかどうかは不定)。============別件で以下のエラー対策にtest.rbを編集しました。falseすると、エラーの様相が変わりました。Capybaraのスクリーンショットなどが取得できるようになりました。クリックができないなどになりました。上記の設定変更はAjax使用時の並行処理発生を防止するWaitforAjax絡みで、DBへの並行接続が問題になっているという情報があった(過去に見たのでリンク不明)なので、今まで出ていたエラーの原因はDB絡みと仮定します。現段階でもランダムにエラーは発生します。設定変更以降にエラーになる原因は、タイミングなのかなと思います。試しにWaitForAjaxで、sleepを入れて試してみました。endendさらに、wait_for_ajaxを以下の箇所に追加してみました。visitの後clickなどの処理すべてすると、エラーの発生頻度が低くなりました(数十回程度試した結果ですが。)推測ですが、以下の要因が混在していたのだと思います。間様子見をし、また経過を追加します。追加した箇所の例を記載しておきます。nil:NilClass`が発生します。===============ローカル環境とCI上(外部サービス)で20回程度テストして、1回だけ以下のエラーが出ました。nil:NilClassエラー発生の頻度は下がりましたが、根本的に解決とはいえないのですし、wait_for_ajaxを使わないとpoltergeistのJSテストが成り立たないというのも変な感じです。引き続き回答をお待ちしています。ちなみにCapybara-webkitに変更しても同じような箇所でエラーになります。Capybara-webkitの場合、現在の設定でもエラーが出ます。個の銅バッジ記憶の片隅に何かのこっているのですが、思い出せないので、おもいだしたら回答しようと思いますが、読んでいて気になった点が一つ。「randomでない場合に一括実行すると必ずエラーになるのでrandomにしています。」これはどういうことでしょう。順番に実行するのは、ランダムにしてても確率的に起きえるので、ランダムでもシリアルでもどちらでも通るコードになってないとまずいのではないでしょうか。一括でテストの後始末をする方法も紹介されていました。2:41randomにしない場合、実行順序が決まるので、そのパターンで「エラーになること」はわかっていたのですが、解決策が見つからなかったのでrandomにしていたので‌​す(一時的に)。}は試してませんでした。試してみましたので補足します。そのテストだけ実行するとどうなるか気になります。するとどうなりますか。Poltergeist使ったことないのでわからんですが、なんとなくタイミングの問題に思えますね。8:52エラーが出た箇所のみを実行するとパスします(複数回やってみてですが、回数を重ねればどうなるか不明です)。:webkit)けれど、ランダムなエラーは発生します。詳しくは補足として回答に記載しました。trueを付けるとJSの処理が終わる前にRSpec側が先に進んでしまい、本来通るはずのテストがパスしない、もしくはタイミングによってパスするときと失敗するときがある、ということは僕も良く体験しています。トラブルシューティングの方法としては以下のようなことを良く試します。長さのsleepを入れてみます。(RSpec側のコードを変更)これで毎回テストがパスするようならRSpec側を適当にsleepさせる必要があると言うことです。sleep秒数が長すぎるとテストの実行に時間がかかるので、0.5や1など、テストが失敗しないレベルの短い秒数を指定してください。sleepを長くしてもテストが失敗するのであれば、問題は別のところにあると思われます。ようにログ出力を埋め込んで処理が実行されたタイミングやメソッドの戻り値、DBの値などを出力してみてください。ログに出力された情報からテストが落ちた原因が推測できるかもしれません。テストのたびにDBが完全にリセットされるので、タイミングによって失敗する、ということがおきにくくなるかもしれません。僕自身はtruncationを使っています。設定のサンプルはこちらです。僕もネットで見たことがありますが、実際には使ったことがありません。原始的ですがsleepをよく使っています。Ajaxとは限らないので)allow_concurrencyという設定も変更したことはないです。このあたりはあまり凝ったことをせず、シンプルな状態でデバッグを進めていく方がいいんじゃないかなと思います。簡単に原因は見つからないかもしれませんが、こうした情報を参考にしながら試行錯誤してみてください。個の銅バッジテストのためではなく、通常の実装のためにコードを変える作業で、今回のようなランダムのエラーが出なくなりました。投稿後数ヶ月間でfeatureテストについては数十個ですが、現在のところ出てません。次回以降同様のエラーが出るようであれば回答頂いたようにデバッグをトライしてみます。ありがとうございました。|3回答というわけではないですが、自分も似たような問題にぶつかったので、問題を特定したやりかたを共有します。問題が出るシード値を特定します。Rspecを実行すると以下のように出力されます。(再現したりしなかったりするのであれば実行順以外の要因がある可能性があります)。テストに失敗するシード値を絞り込んだらそれをメモします。次に、失敗の原因となるファイルを特定します。{対象ファイル相対パス}で特定のファイルだけテストを実行出来ます。{ファイル2}と複数指定も出来ます。ディレクトリ指定で配下のファイルを丸ごと指定することも出来ます。順番で失敗するのであれば、特定のファイルが原因となる可能性が高いので、失敗するテストが含まれるファイルと失敗の原因が含まれるファイルの候補を指定してテスト実行し、原因を絞り込みます。--order=random:{シード値}自分の場合は上記を実行して、二分探索を行い、原因となるファイルを絞り込みました。{ファイルパス}:{行番号}で行番号も指定出来ますので、ケース単位で絞り込む場合は試してみてください。個の銅バッジすみません、rspecの引数に誤りがあったので修正しました。5:48やってみました。--order=random:19257280592076218045415554471751924560という風に。上記値でエラーになっていたテストがパスしてしまいました。(数十回程度のテスト)である箇所のテストが極稀にエラーになっていたのですが、javascriptの変更をある程度加えた結果(通常の実装として)、別の箇所がランダムにエラーになるようになりました。wait_for_ajaxでajaxを待つ処理をしているのですが、js自体の処理に依存していそうです。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。