2016-10-31 8 views
1

最近Rails 4アプリケーションでは、メインアプリケーションとワーカープロセスの両方が正しく起動されていることを確認するだけで問題を回避できました応用。 HerokuのためSidekiqプロセスの成功したブートのテストを自動化する方法

当社Procfileはそうのようになります。今

web: bundle exec unicorn -p $PORT -c config/heroku/unicorn.rb 
sidekiq: bundle exec sidekiq -q high -q medium -q low 

、我々は10+コンテナ間スイートを二分しても、完了するまでに30分を要し、非常に大きなテストスイートを実行します。

CircleCIを使用しており、Sidekiqブートアッププロセスをシミュレートする次のようなテストを追加することを検討しています。

require 'spec_helper' 

RSpec.describe 'Booting processes' do 

    context 'Sidekiq server' do 
    it 'loads successfully' do 
     boot_sidekiq_sequence = <<-SEQ 
     require 'sidekiq/cli' 
     Sidekiq::CLI.instance.environment = '#{ENV['RAILS_ENV']}' 
     Sidekiq::CLI.instance.send(:boot_system) 
     SEQ 

     expect(system(%{echo "#{boot_sidekiq_sequence}" | ruby > /dev/null})).to be_truthy, 
     "The Sidekiq process could not boot up properly. Run `sidekiq` to troubleshoot" 
    end 
    end 
end 

これに問題があることである:それは(私たちもそこに重大な変更を行うことから開発者を保護する当社Procfileからの読み取りが必要になり、当社のアプリケーションの起動プロセスのかなり完全なテストではありません

  • テストランタイムに遅くなり、約30秒が追加されます
  • 私の好みでは少し低レベルです。

サイドキックのブートプロセスをテストするのは、ブート時に例外が発生した場合にのみ終了するということです。

誰もこの種のテストを自動化するために、より良い、より速く、より徹底したアプローチを推奨できますか?

+0

なぜdownvotesですか?この場所は残酷です。 – doremi

+1

SOには適していると思われますが、多くの人が自由に回答できる明確な答えを持っていません。 –

+0

これをもっと具体的にする方法はありますか? 「ただUATが必要です」という別のスレッドのあなたの助言も、受け入れられる回答です。それは私の構成員にその事件をするのを助けるだろう。 – doremi

答えて

1

統合テストの場合は、可能な限り本番プロセスに近いプロセスを実行するのがベストです(bundle exec sidekiq ...)。 CLI APIを使用してインプロセスでブートしません。

私は最初だけで、この特別なんでしょう仕事エンキュー:

def perform 
    puts "Sidekiq booted" 
    Process.kill($$, TERM) # terminate ourselves 
end 

が続いてバイナリを実行し、STDOUTを監視することにより、Sidekiqを実行します。 30秒以内に/ booted /が見える場合は、PASSしてください。 30秒以内に何も見えない場合は、FAILして子供を殺す。

関連する問題