2011-05-06 51 views
3

我是一個erlang的初學者,我編寫了一個基本的gen server程序,如下所示,我想知道如何測試服務器,以便我可以知道它的效果。如何在erlang中測試gen server?

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

BTW:該程序可以被編譯,它是不是一個很好的計劃,我只是想打印的東西,以確保它的工作原理:)

+0

您能澄清一下「測試服務器,我知道它運行良好嗎?」你試圖尋找什麼測試用例/問題的來源? – elliot42 2011-05-06 06:52:04

回答

1

你可以嘗試以下操作之一:

1)使用erlang shell並手動調用這些命令。確保源或.beam文件是Erlang的路徑(參數-pz)

2)寫一個EUnit測試用例

PS:我認爲你必須在你的代碼中的錯誤,因爲你似乎開始模塊ch3作爲服務器,而不是gen_server_test模塊。

+0

謝謝!只需調用該函數即可使服務器正常工作! – why 2011-05-06 06:59:44

8

gen_server實現模塊的美妙之處在於它只是一個回調模塊。一個甚至不需要產生底層的gen_server進程來測試它。

所有你需要做的就是讓你的測試框架(通常是eunit)通過注入不同的輸入(不同的gen_server狀態,不同的輸入消息)等來調用所有的handle_call/cast/info函數,並確保它返回正確的響應元組(例如,{reply,ok,NewState}或{noreply,NewState}等)

當然,如果你的回調函數不是pure functions,例如,在你的handle_call函數中,如果你正在向另一個進程發送消息,例如,或者你正在修改一個ets表。在這種情況下,您必須確保所有必需的流程和表格都是在運行測試之前預先創建的。