Testの書き方 プロセス編
Supervisorの監視ツリーに追加しているプロセスを
確認するテストを記述する方法をまとめる。
application.ex
内のSupervisorの監視ツリーに追加したプロセス、またはSupervisorは、
テスト時にも起動されるらしい。
追加していない場合は以下を参照すること
起動を確認するテストの書き方
プロセスが起動していることを確認するには、次の記述を使用すると良い。
assert is_pid(GenServer.whereis(プロセスモジュール))
GenServer.whereis(プロセスモジュール)
でプロセスのidを取得し、
is_pid
でプロセスのIDであるかチェックしている。
再起動を確認するテストの書き方
以下の記述を行うことでプロセスの監視を開始し、
プロセスの終了時にメッセージを送信することができる。
ref = Process.monitor(プロセスID)
プロセスが終了したときに送信されるメッセージは、次の形式で送信される。
{:DOWN, #Reference<...>, :process, #PID<...>, 終了理由}
終了理由には以下のいずれかになる。
-
:nomal
-GenServer.stop()
などで終了させた場合に設定される。 -
:killed
-Process.exit(プロセスID, :kill)
を実行した際に設定される。
プロセスを意図的に終了させるには、以下の関数を使用する。
Process.exit(プロセスID, :kill)
具体的なコードは次のようになる。
p_id = GenServer.whereis(プロセスモジュール)
p_ref = Process.monitor(p_id)
Process.exit(p_id, :kill)
receive do
{:DOWN, ^p_ref, :process, ^p_id, :killed} ->
# プロセスの再起動を待つ
Process.sleep(1000)
assert is_pid(GenServer.whereis(p_id))
after
1000 ->
# flunk()で失敗メッセージを記述する
flunk("not restarted.")
end
Process.monitor
とは
Process.monitor()
の戻り値は以下のようになる。
#Reference<...>
ここではパターンマッチに使用し、
どのモニター参照からのメッセージかを指定するために必要になる。