最近、mi CI サーバー (Teamcity) を、同じ構成でかなり似た OS を持つ別の強力なマシンに移動しました。
それ以来、私の統合仕様のいくつかが失敗し始めました。私のセットアップはかなり標準的で、Rails 3 + カピバラ + ポルターガイスト + ファントム js です。
失敗は決定論的であり、常に発生し、DOM で欠落しているノードに常に関連しています。また、同様の設定の異なるプロジェクト間で失敗が発生するため、プロジェクトの構成に関連するものではありません。これは、カピバラ 1.x とカピバラ 2 の両方で発生しています。
これは最も単純な失敗仕様です。この仕様は JavaScript を必要とせずに実行されるため、この問題はラックのみの仕様にも存在することに注意してください。
scenario 'require an unsubscription' do
visit unsubscribe_index_path
within main_content do
choose list.description
fill_in 'Email', :with => subscriber.email
click_button 'Unsubscribe'
end
save_page # <--- Added to debug output
# !!! HERE is the first failing assertion
page.should have_content('You should have received a confirmation message')
# Analytics event recorded
# !!! this also is failing
page.should have_event('Unsubscription', 'Sent', list_name)
# If I comment previous two lines the spec passes on CI machine
# this means that the form is submitted with success since email is triggered
# from controller code
last_email_sent.should have_subject 'Unsubscribe request received'
last_email_sent.should deliver_to subscriber.email
end
私が試したこと:
- 異なるマシンで仕様を実行すると、すべての開発マシンとステージング サーバーで動作します。CI環境外でもCIマシンでしか障害を再現できません(つまり、コマンドラインからスペックを実行することによって)
Capybara.default_wait_time
ばかげたことに増加20
page.should have_content
列の前に残忍な睡眠を試みた- RVM、ruby、capybara、poltergeist を CI マシンの最新バージョンにアップグレードします。
- teamcity を最新バージョンにアップグレードする
私が見つけた最も奇妙なことはsave_page
、失敗した行の直前に呼び出しを追加したときです。自分のマシンで仕様を実行し、次にサーバーが失敗している CI でこれら 2 つのファイルを比較すると、結果は次のようになります。
$ diff capybara-201309071*.html
26a27,29
> <script type='text/javascript'>
> _gaq.push(["_trackEvent","Unsubscription","Sent","listname"]);
> </script>
90a94,96
> <div class="alert-message message notice">
> <p>You should have received a confirmation message</p>
> </div>
どちらが仕様を失敗させる 2 つの欠落部分であり、フォームが送信され、コントローラー アクションが正常に実行されますが、dom の欠落部分が 2 つあります。それはどのように可能ですか?そして、なぜこれが1台のマシンでのみ起こっているのですか?
記録のために、これら 2 つの DOM は、標準の Rails ツールで追加されます。
redirect_to unsubscribe_index_path, notice: ...
もう1つは分析宝石を使用