gpt4 book ai didi

testing - eunit:如何测试一个简单的进程?

转载 作者:行者123 更新时间:2023-11-28 19:48:57 24 4
gpt4 key购买 nike

我目前正在为一个模块编写测试,该模块在以 spawn_link(?MODULE, init, [self()]) 开始的简单进程中运行。

在我的 eunit 测试中,我定义了一个设置和拆卸函数以及一组测试生成器。

all_tests_test_() ->
{inorder, {
foreach,
fun setup/0,
fun teardown/1,
[
fun my_test/1
]}
}.

设置乐趣创建被测过程:

setup() ->
{ok, Pid} = protocol:start_link(),
process_flag(trap_exit,true),
error_logger:info_msg("[~p] Setting up process ~p~n", [self(), Pid]),
Pid.

测试看起来像这样:

my_test(Pid) ->
[ fun() ->
error_logger:info_msg("[~p] Sending to ~p~n", [self(), Pid]),
Pid ! something,
receive
Msg -> ?assertMatch(expected_result, Msg)
after
500 -> ?assert(false)
end
end ].

我的大部分模块都是 gen_server 但为此我认为没有所有 gen_server 样板代码会更容易...

测试的输出如下所示:

=INFO REPORT==== 31-Mar-2014::21:20:12 ===
[<0.117.0>] Setting up process <0.122.0>

=INFO REPORT==== 31-Mar-2014::21:20:12 ===
[<0.124.0>] Sending to <0.122.0>

=INFO REPORT==== 31-Mar-2014::21:20:12 ===
[<0.122.0>] Sending expected_result to <0.117.0>
protocol_test: my_test...*failed*
in function protocol_test:'-my_test/1-fun-0-'/0 (test/protocol_test.erl, line 37)
**error:{assertion_failed,[{module,protocol_test},
{line,37},
{expression,"false"},
{expected,true},
{value,false}]}

从 Pids 中,您可以看到运行设置 (117) 的进程与运行测试用例 (124) 的进程不同。然而,被测过程是相同的 (122)。这会导致测试用例失败,因为接收方永远不会收到消息并且会遇到超时。

这是 eunit 生成新进程以运行测试用例的预期行为吗?

一般来说,是否有更好的方法来测试进程或其他异步行为(如强制转换)?或者您会建议始终使用 gen_server 来获得同步接口(interface)吗?

谢谢!

[编辑]

澄清一下,协议(protocol)如何知道进程,这是 start_link/0 的乐趣:

start_link() ->
Pid = spawn_link(?MODULE, init, [self()]),
{ok, Pid}.

协议(protocol)与调用者紧密相关。如果其中一个崩溃了,我希望另一个也死掉。我知道我可以使用 gen_server 和 supervisors,实际上它在部分应用程序中这样做了,但对于这个模块,我认为它有点过头了。

最佳答案

你试过吗:

all_tests_test_() ->
{inorder, {
foreach,
local,
fun setup/0,
fun teardown/1,
[
fun my_test/1
]}
}.

从文档来看,这似乎是你所需要的。

关于testing - eunit:如何测试一个简单的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22771788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com