【问题标题】:Erlang YAWS: How to test a simple REST web service?Erlang YAWS:如何测试一个简单的 REST Web 服务?
【发布时间】:2012-08-17 02:46:26
【问题描述】:

在一个简单的基于 Erlang YAWS 的 RESTful 应用程序中,我想要一组测试,将 HTTP 请求发送到 RESTful API,从服务器获取响应,然后测试这些响应。

如果每个“send-request-get-request-test”测试都可以在 EUnit 中运行(可以使用测试生成器),那就太好了。

我还希望能够使用rebar (make test) 运行这组测试。

最近我在另一个应用程序(Mochiweb)中usedibrowse,但我发现它使用起来很麻烦。

是否有任何其他选项可以编写可以将 HTTP 请求发送到 YAWS RESTful 应用程序的 Erlang/OTP 测试?最常见的方法是什么?

【问题讨论】:

    标签: rest erlang erlang-otp yaws eunit


    【解决方案1】:

    你可以使用Tsung,但我会这样做:我会使用一个好的HTTP Client 编写一个大规模线程测试器,比如curl,或者ibrowse 从不同的机器上运行。然后根据我想要的进行测试。

    编辑


    现在,重新编译 erlang 库中的 ibrowse 库并将其 ebin 放在代码路径中。 %% 确保 Ibrowse 已启动
    确保ibrowse()-> case whereis(ibrowse) 的 未定义-> ibrowse:start(); 任何时候 is_pid(Any)-> ok 结束。
    %% 发出获取请求
    do_get(链接)-> 试试 ibrowse:send_req(Link,[],get) 的 {ok,_,_,结果} -> %% 结果可能是 JSON 在这种情况下你会 %% mochijson2:decode(结果) 其他 -> {错误,其他} 抓住 E1:E2 -> {异常,{E1,E2}} 结束。
    %% 保存对文件的响应
    保存到文件(链接)-> 尝试 ibrowse:send_req(Link,[],get,[],[{save_response_to_file,true}]) 的 {ok,_,_,{file,FilePath}} -> %% 对文件做任何事情, %%------------------------------------------------ -------- %% 喜欢 {ok,FileHandle} = file:open(FilePath,[read]) %%------------------------------------------------ ----- %% OR {ok,Contents} = file:read_file(FilePath) %%------------------------------------------------ -------- %% 或者如果响应是 .zip 文件 %% {ok,FileList} = zip:unzip(FilePath), %% [开始 process_file_contents(element(2,file:read_file(F))) 结束 || F 其他 -> {错误,其他} 抓住 E1:E2 -> {异常,{E1,E2}} 结束。
    %% 做一个 POST %% 通常,如果你使用 mochijson 来编码 erlang 术语 %% 到 JSON,你将:: %% JSON = list:flatten(mochijson:encode({struct,[Terms]}))
    发布(链接,JSON)-> 试试 ibrowse:send_req(Link,[],post,JSON,[]) 的 {_,_,_,结果} -> 尝试 mochijson2:decode(Result) of {struct,[{>,>},...]} ->
    %% 继续 JSONOther -> {错误,JSONOther} 抓住 R:R2 -> {异常,{R:R2}} 结尾; 任何 -> erlang:throw({write_failed,Link,Any}) 抓住 E1:E2 -> {异常,{E1,E2}} 结束。
    %% 发出 put 请求 %% 与 Post 相同,只需将原子 'post' 更改为 'put'

    %% 将标头添加到请求中
    发布(链接,JSON)-> 标头 = [{"Content-Type","application/json"}], 尝试 ibrowse:send_req(Link,Headers,post,JSON,[]) of
    {_,_,_,Re​​sult} -> 尝试 mochijson2:decode(Result) of {struct,[{>,>},...]} ->
    %% 继续 JSONOther -> {错误,JSONOther} 抓住 R:R2 -> {异常,{R:R2}} 结尾; 任何 -> erlang:throw({write_failed,Link,Any}) 抓住 E1:E2 -> {异常,{E1,E2}} 结束。 如果您未能在代码路径中安装 ibrowse,请告诉我们

    【讨论】:

    • 我不需要用很多请求测试大量系统负载。 ibrowse 是否足以在同一台机器上运行?
    • 如果我使用 ibrowse,如何将它合并到我的 OTP 应用程序的 EUnit 套件中?我应该将 ibrowse 应用程序放入 deps/ 目录并从我的 EUnit 测试中调用 ibrowse:send_req() 吗?
    • 如果您更新它并提供有关如何将 ibrowse 正确嵌入 Erlang 应用程序的信息,我很乐意将您的答案标记为已接受。
    • 穆萨亚约书亚,谢谢!我已将 ibrowse 目录放入我的 Mochiweb 应用程序的 deps/ 目录中。涉及使用存储在 ebin/ 中的某些 C 代码的测试会出错,因为它们找不到 C 二进制文件(C 二进制文件在 ebin/ 中,但 ibrowse 束文件在 deps/ibrowse/ebin 中)。你说“在erlang lib中有ibrowse库,......在代码路径中有它的ebin”是什么意思? (对不起这样一个菜鸟问题)
    • 是的。将它放在代码路径中,就像mnesiastdlibebin 应该在 erlang lib 中。
    【解决方案2】:

    我使用 common_test 和 ibrowse 来测试基于 REST 的服务。

    1. 它是 erlang 发行版的一部分
    2. 您可以从钢筋调用测试
    3. 您可以配置您的测试,以便并行运行、顺序......

    看看这个演示文稿:http://www.erlang-factory.com/upload/presentations/275/CommonTestPresentation.pdf

    【讨论】:

      【解决方案3】:

      你试过etest,尤其是etest_http吗?

      【讨论】:

        猜你喜欢
        • 2013-03-13
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2015-05-04
        • 2010-09-17
        • 2017-01-23
        • 2013-03-13
        • 2011-01-13
        相关资源
        最近更新 更多