Elixir测试中的OTP进程管理与周期性动作测试
在Elixir的测试中,我们常常需要启动和停止GenServer等OTP进程。传统的方式是直接调用 GenServer 的 start_link/1 函数,如:
assert {:ok, pid} = RollingAverageServer.start_link(max_measurements: n)
这种方式虽然能测试 start_link/1 函数的正确性,但存在一些问题。主要问题是启动的进程与测试进程的生命周期关联不清晰,只是简单地链接在一起。当测试结束时,测试进程会正常终止,与之链接的GenServer进程也会随之终止,但测试进程不会等待 start_link/1 启动的进程正确关闭。这可能导致在下一个测试开始时,前一个测试启动的GenServer进程仍在关闭中,从而引发名称冲突、竞态条件等问题。
例如,有两个测试都以相同的名称启动服务器:
test "some test" do
assert {:ok, _pid} =
RollingAverageServer.start_link(
name: :my_server,
max_measurements: 3
)
# «assertions»
end
test "some other test" do
assert {:ok, _pid}
超级会员免费看
订阅专栏 解锁全文
35

被折叠的 条评论
为什么被折叠?



