Erlang YAWS:如何测试一个简单的 REST Web 服务?
Posted
技术标签:
【中文标题】Erlang YAWS:如何测试一个简单的 REST Web 服务?【英文标题】:Erlang YAWS: How to test a simple REST web service? 【发布时间】: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 测试?最常见的方法是什么?
【问题讨论】:
【参考方案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 _,_,_,Result -> 尝试 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”是什么意思? (对不起这样一个菜鸟问题) 是的。将它放在代码路径中,就像mnesia
和stdlib
。 ebin
应该在 erlang lib
中。【参考方案2】:
我使用 common_test 和 ibrowse 来测试基于 REST 的服务。
-
它是 erlang 发行版的一部分
您可以从钢筋调用测试
您可以配置您的测试,以便并行运行、顺序......
看看这个演示文稿:http://www.erlang-factory.com/upload/presentations/275/CommonTestPresentation.pdf
【讨论】:
【参考方案3】:你试过etest,尤其是etest_http吗?
【讨论】:
以上是关于Erlang YAWS:如何测试一个简单的 REST Web 服务?的主要内容,如果未能解决你的问题,请参考以下文章
Erlang/Yaws:无法使用 .conf 文件在应用程序中启动 Web 服务器
Erlang:函数在 shell 中工作,但不在 YAWS 中
erlang build OK 后,yaws 没有在 CentOS 上构建