Erlang init_per_group终止了gen_server

3

常见测试init_per_group/2在使用gen_server:start_link启动时会终止gen_server, 但使用gen_server:start启动服务器是可以的。

gen_server可以在init_per_suite/1init_per_testcase/2中使用任何一种方法(startstart_link)启动。

为什么不能在init_per_group/2中使用gen_server:start_link启动gen_server呢?


当 gen_server:start_link 失败时,错误代码是什么? - undefined
1
没有错误。我的服务器捕获了退出标志。 所以在init_per_group/2的末尾,我在gen_server:terminate/2中得到了这个原因: {#Ref<0.0.1.845>,1475, [{server,<0.226.0>}, {watchdog,<0.225.0>}, {tc_logfile, ... [配置数据] 我使用的是Erlang 18.1和Common Test v1.12。 - undefined
1个回答

3
这是因为init_per_group在一个单独的进程中运行,就像每个测试用例一样,并且该进程以退出原因退出,该原因传达了有关组初始化成功/失败的信息。来自test_server:run_test_case_eval:
exit({Ref,Time,Value,Loc,Opts}).

由于gen_server与运行init_per_group的进程链接在一起,并且由于退出原因不是normal,且gen_server未捕获退出,因此gen_server进程以相同的退出原因退出。

另一方面,init_per_testcase在与测试用例本身相同的进程中运行,因此不会出现这个问题。


谢谢。现在我明白了。但还有一些奇怪的地方:当 gen_server 使用 trap exits 时,它不会接收到 {'EXIT', ...} 消息,并且还是会终止。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接