我是一个初学者与erlang,我写了一个基本的gen服务器程序如下,我想知道,如何测试服务器,所以我可以知道它的工作很好。
-module(gen_server_test).
-behaviour(gen_server).
-export([start_link/0]).
-export([alloc/0, free/1]).
-export([init/1, handle_call/3, handle_cast/2]).
start_link() ->
gen_server:start_link({local, gen_server_test}, ch3, [], []).
alloc() ->
gen_server:call(gen_server_test, alloc).
free(Ch) ->
gen_server:cast(gen_server_test, {free, Ch}).
init(_Args) ->
{ok, channels()}.
handle_call(alloc, _From, Chs) ->
{Ch, Chs2} = alloc(Chs),
{reply, Ch, Chs2}.
handle_cast({free, Ch}, Chs) ->
io:format(Ch),
io:format(Chs),
Chs2 = free(),
{noreply, Chs2}.
free() ->
io:format("free").
channels() ->
io:format("channels").
alloc(chs) ->
io:format("alloc chs").
顺便说一句:程序可以编译,而且它不是一个好程序,我只是想打印一些东西,以确保它的工作:)
2条答案
按热度按时间jgwigjjp1#
gen_server实现模块的优点在于它只是一个回调模块,甚至不需要生成底层的gen_server进程来测试它。
你需要做的就是让你的测试框架(通常是eunit)通过注入不同的输入(不同的gen_server状态,不同的输入消息)等来调用所有的handle_call/cast/info函数,并确保它返回正确的响应元组(例如{reply,ok,NewState}或{noreply,NewState}等)。
当然,如果你的回调函数不是pure functions的话,这就不能很好地工作。例如,在你的handle_call函数中,如果你正在为eg.向另一个进程发送一条消息,或者如果你正在修改一个ets表。在这种情况下,你必须确保所有需要的进程和表在运行测试之前都已经预先创建好了。
aemubtdh2#
您可以尝试以下操作之一:
1.使用erlang shell并手动调用命令。确保源文件或.beam文件位于Erlang路径(参数
-pz
,如下所示:(单位:erl -pz <path here>
)1.编写EUnit测试用例
PS:我认为你的代码中有一个错误,因为你似乎启动了模块
ch3
作为服务器,而不是gen_server_test
模块。