7

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

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

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

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

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

4

3 回答 3

6

您是否尝试过 etest尤其是etest_http

于 2012-08-21T22:47:10.670 回答
5

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

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

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

于 2012-08-22T08:59:34.760 回答
4

你可以使用Tsung,但这就是我要做的:我会使用一个好的HTTP Clientlike编写一个大规模线程测试器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,[{<<"key1">>,<<"value1">>},...]} ->
%% 继续 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,[{<<"key1">>,<<"value1">>},...]} ->
%% 继续 JSONOther -> {错误,JSONOther} 抓住 R:R2 -> {异常,{R:R2}} 结尾; 任何 -> erlang:throw({write_failed,Link,Any}) 抓住 E1:E2 -> {异常,{E1,E2}} 结尾。
如果您未能在代码路径中安装 ibrowse,请告诉我们

于 2012-08-22T06:09:28.800 回答