RIT Tech Blog

株式会社RITのエンジニアが知見を共有する技術ブログです。

ActionMailerでdeliver_laterしてるテストが頻繁に止まるようになった話

内容は薄いですが結構ハマったのでメモ

結論

非同期処理内でDBからデータ取ってくるときはassert_enqueued_jobsとかassert_enqueued_emailsで囲んどこう

経緯

弊社のプロダクトではRuby on Railsを利用していてMinitestでテストを書いているんですが、最近になって頻繁にテストが失敗するようになりました。 成功する時もあれば失敗する時もあり、docker-composeでコンテナ立ち上げすぎて色々足りてないのかなーぐらいに思ってたのですが、大体止まったタイミイングのログを見るとActionMailer周りの処理だったので、非同期処理が何か悪さしてるのかと思って調査をはじめました。

予想

最近入れたactive_elastic_jobが悪いんじゃないか

最近非同期処理に影響を与えそうな改修をしたのはこれだったので一番怪しんでたのですが冤罪でした

そもそもtestのqueue_adapterにactive_elastic_job使ってなかったので関係ない

testのRollback先に走ってjobのdeserialize失敗してるんじゃないか

基本的にはログ出さずに止まってるだけだったのですが、たまにdeserializeでエラーログ出ることがあったので怪しいと思い調査 queueを処理してからテスト終わるようにしたらうまくいくんじゃないかと思ったので↓みたいにassert_enqueued_emailsで囲んでみたところ

class SampleTest < ActiveSupport::TestCase
  include ActionMailer::TestHelper

  test 'sample test' do
    assert_enqueued_emails 1 do
      Sample.test_method
    end
  end
end

ActiomMailer起因で失敗することがなくなりました

絶対失敗するわけじゃなかったり最近失敗が増えてきたのはコンテナの立てすぎでテストの処理が重くなってJobの処理する前にRollbackしちゃうケースが増えちゃったって感じなんですかね