2014-07-22 51 views
1

我在ExUnit中編寫了一些測試來說明不同的Supervisor策略如何工作。我曾計劃通過故意導致產生的進程失敗來測試結果,然後測試重新啓動的進程的輸出。編寫受監督進程不會失敗的測試

到目前爲止,我一直沒有成功地創建通過測試,因爲初始過程失敗導致測試失敗。我試圖在Supervisor/GenServer實現和測試實現中捕獲錯誤(try/catch),但我無法捕獲任何錯誤並避免測試失敗。

  1. 是否有任何方法來捕獲這些錯誤,以便它們不會觸發測試失敗?
  2. 是否有更好/不同的方法來測試不同的主管策略?

謝謝!

回答

1

你需要小心你的鏈接。當你啓動一個主管時,它與當前進程相關聯,所以如果你導致主管(或其他鏈接進程)崩潰,它也會導致測試崩潰。

您可以通過設置Process.flag(:trap_exit, true)來更改此行爲,現在鏈接不會觸發崩潰,而是您可以在郵箱中找到格式爲{:EXIT, pid, reason}的郵件。

這是一個很好的測試方法,但對於生產或一般情況下,您可能想要設置某種顯示器。

+0

我很難確定Process.flag應該在哪裏。目前,鏈接結構如下:測試 - >管理員 - > GenServer。測試然後導致GenServer發出ArgumentError並崩潰。我在捕獲除測試級別以外的任何級別的錯誤方面都沒有成功。 在測試級別進行捕獲時,我已經在測試模塊中初始化GenServer並將其提供給Supervisor。我遇到的問題是GenServer現在已經在運行,不能作爲工作者啓動。 關於如何構建呼叫的任何想法? – arami

+0

@arami:看一下https://github.com/mprymek/suptest - 你必須從mix.exs中刪除應用程序模塊,這樣應用程序不會自動啓動,然後手動啓動它(請參閱https:// github。 com/mprymek/suptest/blob/master/test/suptest_test.exs) –

+0

謝謝米羅斯拉夫! – arami

1

因爲我故意導致進程失敗,並希望在ExUnit測試中忽略此故障,所以我最終使用catch_exit/1來防止測試進程失敗。

相關問題