4

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

ところで:プログラムはコンパイルできますが、それは良いプログラムではありません。何かを印刷して、動作することを確認したいだけです:)

4

2 に答える 2

8

gen_server 実装モジュールの利点は、それが単なるコールバック モジュールであることです。根底にある gen_server プロセスを生成してテストする必要さえありません。

必要なことは、テスト フレームワーク (通常は eunit) にさまざまな入力 (さまざまな gen_server 状態、さまざまな入力メッセージ) などを注入してすべての handle_call/cast/info 関数を呼び出し、正しい応答タプル (例: {reply, ok, NewState} または {noreply, NewState} など)

もちろん、コールバック関数が純粋な関数でない場合、これは完全には機能しません。たとえば、handle_call 関数で、たとえば別のプロセスにメッセージを送信している場合、または ets テーブルを変更している場合。その場合、テストを実行する前に、必要なすべてのプロセスとテーブルが事前に作成されていることを確認する必要があります。

于 2011-05-06T07:49:05.423 に答える
2

次のいずれかを試すことができます。

  1. erlang シェルを使用して、コマンドを手動で呼び出します。ソースまたは .beam ファイルが Erlang パスにあることを確認してください (パラメーター-pz、次のように: erl -pz <path here>)

  2. EUnit テスト ケースを作成する

ch3PS:モジュールではなくサーバーとしてモジュールを起動しているように見えるため、コードにエラーがあると思いますgen_server_test

于 2011-05-06T06:50:43.227 に答える