rubyでのスレッドコードのテスト
-
05-07-2019 - |
質問
DataMapperの delayed_job
クローンを作成しています。ワーカープロセス内のスレッドを除いて、動作していると思われるコードをテストし、コードをテストしました。これをテストする方法については delayed_job
を探しましたが、現在はコードのその部分のテストがあります。以下は、テストする必要があるコードです。アイデア? (私はrspec BTWを使用しています)
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self) #this method well tested
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
も参照してください。 解決
テスト時にワーカーをサブプロセスとして起動し、完全に起動するのを待ってから、出力を確認したり、シグナルを送信したりできます。
Unicorn プロジェクトから、この分野でかなり多くの具体的なテストのアイデアを得ることができると思います。
他のヒント
最良のアプローチは、 Thread.new
メソッドをスタブ化し、「複雑な」ものを確認することです。ものは、個別にテストできる独自のメソッドにあります。したがって、次のようになります。
class Foo
def start
Thread.new do
do_something
end
end
def do_something
loop do
foo.bar(bar.foo)
end
end
end
その後、次のようにテストします。
describe Foo
it "starts thread running do_something" do
f = Foo.new
expect(Thread).to receive(:new).and_yield
expect(f).to receive(:do_something)
f.start
end
it "do_something loops with and calls foo.bar with bar.foo" do
f = Foo.new
expect(f).to receive(:loop).and_yield #for multiple yields: receive(:loop).and_yield.and_yield.and_yield...
expect(foo).to receive(:bar).with(bar.foo)
f.do_something
end
end
こうすることで、目的の結果を得るためにあまり手間をかける必要がなくなります。
スレッドを完全にテストすることは不可能です。できることは、モックを使用することです。
(次のようなもの) object.should_recieve(:trap).with( 'TERM')。and yield object.start
テストでスレッドを明快にするだけでどうですか。
Thread.stub(:new).and_yield
start
# assertions...
所属していません StackOverflow