Как протестировать приложение mochiweb?

Я хотел бы провести высокоуровневое тестирование моего приложения mochiweb, как это можно сделать на Python с WebTest, в Django с тестовым клиентом и в Ruby on Rails с функциональным или интеграционным тестированием. Я не слишком разборчив в том, как это сделать. По сути, я просто хотел бы отправлять или моделировать HTTP-запросы и делать утверждения о результате.

Я изменил код, чтобы обработчик запросов не вызывал Req:respond() сами, но верните кортеж {Code, Headers, Body}, Это позволяет мне создавать фиктивные запросы с mochiweb_request:new(), передайте их моему диспетчеру запросов и сделайте утверждения о результате с помощью EUnit:

make_request(Method, Path) ->
    Request = mochiweb_request:new(nil, Method, Path, {1, 1},
        mochiweb_headers:make([{"Accept", "text/html"}])),
    Response = myapp:dispatch(Request),
    Response.


signin_test() ->
    {Code, _, _} = make_request('GET', "/signin"),
    ?assertEqual(Code, 200),
    ok.

Теперь моя проблема в том, как проверить POST-запросы. В mochiweb я не нашел ничего, что позволило бы мне это сделать. При чтении кода mochiweb кажется, что когда Req:parse_post() вызывается, он вызывает чтение на сокете. Я нашел интересный тестовый код в src / mochiweb.erl. Очевидно, это включает в себя создание HTTP-сообщений, запись их в сокет и чтение ответа обратно. Я пытался сделать это в своем собственном тестовом коде, но мне не удалось ничего получить через несколько часов. Я начинаю задаваться вопросом, иду ли я в правильном направлении. Может быть, мне нужно еще больше отделить мою функциональность от HTTP-соединения, т.е. не называть Req:parse_post() из моих обработчиков запросов. Другим решением, о котором я думаю, было бы использование сторонней библиотеки веб-тестирования, не обязательно написанной на Erlang. Может быть, что-то в Ruby или Python или даже, может быть, Selenium.

Итак, какое решение вы бы порекомендовали для функционального или интеграционного тестирования приложения mochiweb?

3 ответа

Решение

Я использую общий тестовый сервер и для тестирования я использую ibrowse. Вот пример:

post_cap_query_no_caps(_Config) ->
A="<?xml version=\"1.0\" encoding=\"utf-8\"?><query><capabilities/></query>",
{ok, "200", _C, Body}=ibrowse:send_req("http://localhost:8000/devices",  XML_CONTENT_TYPE, post, A),
"<devices/>" == Body.

В основном мы отделяем наши тесты от HTTP-соединения. Обычно в любом случае это правильная вещь.

В src/mochiweb_multipart.erl есть некоторый код eunit, который, вероятно, больше подходит для вашего конкретного случая использования.

Почему бы вам просто не использовать http-клиент для звонков? Я использую ibrowse для системного тестирования моего сервера webmachine, включая размещение данных по мере необходимости.

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