Эрланг: Как мне это проверить? - PullRequest
4 голосов
/ 19 января 2010

У меня есть приложение, в котором я передаю сообщение gen_server для запуска операции, а затем каждую секунду вызываю gen_server для получения промежуточных результатов до завершения операции. В производстве это обычно занимает пару минут, но оно ограничено только размером ввода, и я бы тоже хотел протестировать операции продолжительностью в один час.

Я хочу всегда проверять, работает ли эта операция, запуская тест по мере необходимости. В идеале, я хотел бы запустить этот тест несколько раз с разными входами, а также.

Я сейчас использую eunit, но, похоже, у него нет специально разработанного способа реализации этого сценария. Обеспечивает ли это общий тест? Есть ли элегантный способ проверить это или я должен просто взломать что-нибудь? В общем, у меня возникают проблемы с тем, как систематически проверять асинхронные операции с сохранением состояния в Erlang.

Ответы [ 2 ]

6 голосов
/ 19 января 2010

Да, общий тест сделает это.

Это урезанная версия стандартного набора тестов, который обеспечивает наш режим erlang emacs (вы можете использовать обычный 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.

Есть 2 основных способа сделать это.

Сначала запустите gen_server в init_per_suite/1, а затем проведите большое количество атомарных тестов, которые будут работать на этом долго работающем сервере, а затем разрушите gen_server в end_per_suite/1. Это предпочтительный способ - ваш gen_server должен быть долговременным и постоянным во многих транзакциях, бла-бла ...

Другой способ - выполнить одноэлементный тест, запустить gen_server с init_per_testcase/2 и развернуть его в end_per_testcase/2

1 голос
/ 19 января 2010

Тестирование Асинхронных операций с состоянием сложно на любом языке, Erlang или иным.

Я бы порекомендовал использовать etap и заставить асинхронные тесты запускать обратный вызов, который затем запустит etap: end_tests ()

Поскольку etap использует работающий тестовый сервер и ожидает вызова end_test, у вас есть немного больше возможностей для управления асинхронными тестами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...