我有一个应用程序,我将消息转发给gen_server以启动操作,然后我每秒调用gen_server来收集中间结果,直到操作完成。在制作中,它通常需要几分钟,但它仅受输入大小的限制,我也想测试一小时的操作。
我希望始终通过根据需要运行测试来确保此操作仍然有效。理想情况下,我也希望使用不同的输入多次运行此测试。
我现在使用eunit,但它似乎没有专门构建的方法来实现这个场景。 commmon测试是否提供此功能?有没有一种优雅的方法来测试这个,还是我应该破解一些东西?总的来说,我在如何系统地测试Erlang中的有状态异步操作时遇到了麻烦。
答案 0 :(得分:6)
是的,常见的测试会做到这一点。
这是我们的erlang emacs模式提供的常见测试套件框架的缩减版本(您可以使用the normal erlang one或erlware 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)