Тестирование приложений Erlang на основе ковбоя с использованием общего теста

У меня есть приложение Erlang, основанное на Cowboy, и я хотел бы проверить его.

Ранее я использовал библиотеку wooga etest_http для такого рода задач, но я хотел бы начать использовать общие тесты, так как я заметил, что этот способ используется в ковбоях. Я попытался настроить очень простой тест, но не могу его правильно запустить.

Кто- нибудь может предоставить мне пример для тестирования базового примера echo_get и сказать мне, как правильно запустить тест из консоли, используя Makefile, содержащийся в примере?

3 ответа

Решение

Пример make используется только для сборки приложения echo_get. Таким образом, чтобы протестировать приложение echo_get, вы можете добавить набор тестов и вызвать make && rebar -v 1 skip_deps=true ct (Арматура должна быть в PATH) из оболочки. Также вам нужно etest и etest_http в вашем Erlang PATH или добавить его с помощью rebar.config в вашем приложении. Вы можете использовать httpc или curl с os:cmd/1 вместо ehttp_test:)

test / my_test_SUITE.erl ( полный пример)

-module(my_test_SUITE).

-compile(export_all).

-include_lib("common_test/include/ct.hrl").

% etest macros
-include_lib ("etest/include/etest.hrl").
% etest_http macros
-include_lib ("etest_http/include/etest_http.hrl").

suite() ->
    [{timetrap,{seconds,30}}].

init_per_suite(Config) ->
    %% start your app or release here
    %% for example start echo_get release
    os:cmd("./_rel/bin/echo_get_example start"),
    Config.

end_per_suite(_Config) ->
    %% stop your app or release here
    %% for example stop echo_get release
    os:cmd("./_rel/bin/echo_get_example stop")
    ok.

init_per_testcase(_TestCase, Config) ->
    Config.

end_per_testcase(_TestCase, _Config) ->
    ok.

all() -> 
    [my_test_case].

my_test_case(_Config) ->
    Response = ?perform_get("http://localhost:8080/?echo=saymyname"),
    ?assert_status(200, Response),
    ?assert_body("saymyname", Response).
    ok.

Следующее запускает приложение hello_world и его зависимости, но использует последние скомпилированные версии, а не ту, что в./_rel; это может или не может быть то, что вы хотите, но это избегает timer:sleep(1000)

-module(hello_world_SUITE).
-include_lib("common_test/include/ct.hrl").
-export([all/0, init_per_suite/1, end_per_suite/1]).
-export([http_get_hello_world/1]).

all() ->
    [http_get_hello_world].

init_per_suite(Config) ->
    {ok, App_Start_List} = start([hello_world]),
    inets:start(),
    [{app_start_list, App_Start_List}|Config].

end_per_suite(Config) ->
    inets:stop(),
    stop(?config(app_start_list, Config)),
    Config.

http_get_hello_world(_Config) ->
    {ok, {{_Version, 200, _ReasonPhrase}, _Headers, Body}} =
        httpc:request(get, {"http://localhost:8080", []}, [], []),
    Body = "Hello World!\n".

start(Apps) ->
    {ok, do_start(_To_start = Apps, _Started = [])}.

do_start([], Started) ->
    Started;
do_start([App|Apps], Started) ->
    case application:start(App) of
    ok ->
        do_start(Apps, [App|Started]);
    {error, {not_started, Dep}} ->
        do_start([Dep|[App|Apps]], Started)
    end.

stop(Apps) ->
    _ = [ application:stop(App) || App <- Apps ],
    ok.

Используйте https://github.com/extend/gun

чтобы запустить предоставленный пример (учитывая "пистолет" в папке "пользователь"): ct_run -suite twitter_SUITE.erl -logdir ./results -pa /home/user/gun/deps/*/ebin /home/user/gun/ebin

Другие вопросы по тегам