15
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2023

Day 2

Testの書き方 プロセス編

Last updated at Posted at 2023-11-03

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<...>

ここではパターンマッチに使用し、
どのモニター参照からのメッセージかを指定するために必要になる。

15
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?