Erlang:我应该怎么测试呢?

时间:2010-01-18 21:45:52

标签: erlang

我有一个应用程序,我将消息转发给gen_server以启动操作,然后我每秒调用gen_server来收集中间结果,直到操作完成。在制作中,它通常需要几分钟,但它仅受输入大小的限制,我也想测试一小时的操作。

我希望始终通过根据需要运行测试来确保此操作仍然有效。理想情况下,我也希望使用不同的输入多次运行此测试。

我现在使用eunit,但它似乎没有专门构建的方法来实现这个场景。 commmon测试是否提供此功能?有没有一种优雅的方法来测试这个,还是我应该破解一些东西?总的来说,我在如何系统地测试Erlang中的有状态异步操作时遇到了麻烦。

2 个答案:

答案 0 :(得分:6)

是的,常见的测试会做到这一点。

这是我们的erlang emacs模式提供的常见测试套件框架的缩减版本(您可以使用the normal erlang oneerlware one):

-module(junk).

%% Note: This directive should only be used in test suites.
-compile(export_all).

-include("test_server.hrl").

%%
%% set up for the suite...
%%
init_per_suite(Config) ->
    Config.

end_per_suite(_Config) ->
    ok.

%%
%% setup for each case in the suite - can know which test case it is in
init_per_testcase(_TestCase, Config) ->
    Config.

end_per_testcase(_TestCase, _Config) ->
    ok.

%%
%% allows the suite to be programmatically managed
%%
all(doc) ->
    ["Describe the main purpose of this suite"];

all(suite) ->
    [].

%% Test cases starts here.
%%--------------------------------------------------------------------
test_case(doc) ->
    ["Describe the main purpose of test case"];

test_case(suite) ->
    [];

test_case(Config) when is_list(Config) ->
    ok.

有两种基本方法可以做到。

首先在init_per_suite/1中启动gen_server,然后进行大量原子测试,这些测试作用于长时间运行的服务器,然后在end_per_suite/1中删除gen_server。这是首选的方式 - 你的gen_server应该是长期运行的并且在许多事务中都是持久的,等等...

另一种方法是进行单例测试并使用init_per_testcase/2启动gen_server并将其拆分为end_per_testcase/2

答案 1 :(得分:1)

测试有状态的异步操作在任何语言,Erlang或其他方面都很难。

我会建议使用etap并让异步测试运行一个回调,然后运行etap:end_tests()

由于etap使用正在运行的测试服务器并等待end_test调用,因此您可以更多地控制异步测试。