1

我想对我的 mochiweb 应用程序进行高级测试,就像可以在 Python 中使用 WebTest、在 Django 中使用测试客户端以及在 Ruby on Rails 中进行功能或集成测试一样。我不太挑剔如何去做。基本上我只想发送或模拟 HTTP 请求并对结果做出断言。

我重构了我的代码,以便我的请求处理程序不会调用Req:respond()自己,而是返回一个 tuple {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()从我的请求处理程序中。我正在考虑的另一个解决方案是使用第三方 Web 测试库,不必用 Erlang 编写。也许是 Ruby 或 Python 甚至 Selenium 中的东西。

那么,您会推荐什么解决方案来对 mochiweb 应用程序进行功能或集成测试?

4

3 回答 3

1

我们主要将测试与 HTTP 管道分离。无论如何,通常在功能环境中做正确的事情。

src/mochiweb_multipart.erl 中有一些 eunit 代码可能与您的特定用例更相关。

于 2010-12-31T17:05:14.520 回答
0

为什么不直接使用 http 客户端来拨打电话?我使用 ibrowse 系统测试我的 webmachine 服务器,包括根据需要发布数据。

于 2010-12-31T20:28:18.573 回答
0

我使用通用测试服务器,为了测试我使用 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.
于 2011-01-01T07:53:15.133 回答