JUnit集成测试应报告HTTP请求/响应详细信息

时间:2015-01-11 21:07:46

标签: java unit-testing maven junit jenkins

我正在编写一些使用Maven Failsafe插件运行的集成测试(IT)。

简而言之,这些IT执行HTTP调用并分析JSON响应以确保存在某些元素。

当测试失败时,我希望能够看到HTTP请求和响应(标题,正文等)的详细信息,而不仅仅是断言失败消息。

如果我的测试看起来像这样:

public class FooBarTest {

    MyHttpClient httpClient;

    @Before
    public void setupHttpClient(){
       this.httpClient = ...
    }

    @Test
    public void testFooBarBaz(){
       Response response = this.httpClient.get("http://some/url");
       Assert.assertEquals(200, response.getStatus());
       String json = response.getBody();
       Assert.assertEquals("baz", evalJsonPath(json, "foo.bar.id"));
    }
}

当从命令行(通过Maven)运行测试时,我希望能够看到断言错误以及请求和响应详细信息。我认为这需要打印到System.out / err,但通过一些Logging系统可以做得更好。

此外,我希望在surefire / failsafe产生的测试TXT报告文件中提供相同的信息:

-------------------------------------------------------------------------------
Test set: com.sample.FooBarTest
-------------------------------------------------------------------------------

REQUEST: {...}
RESPONSE: {...}

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 3.273 sec <<< FAILURE! - in com.sample.FooBarTest
testFooBarBaz(com.sample.FooBarTest)  Time elapsed: 3.27 sec  <<< ERROR!
junit.framework.AssertionFailedError: expected:<200> but was:<404>
     at junit.framework.Assert.fail(Assert.java:47)
     at junit.framework.Assert.failNotEquals(Assert.java:283)
     at junit.framework.Assert.assertEquals(Assert.java:64)
     at junit.framework.Assert.assertEquals(Assert.java:195)
     at junit.framework.Assert.assertEquals(Assert.java:201)
     at com.sample.FooBarTest.testFooBarBaz(FooBarTest.java:XX)

最后,XML报告中应该以某种方式显示相同的细节,Jenkins在深入查看失败的测试页面时也会显示此信息。

如果可能的话,我只关心在测试失败时打印这些信息。

我怎样才能做到这一点?我已经开始研究这些选项了,但是会有更多的指导意见

  • 自定义JUnit记者,跑步者或听众
  • JUnit @Rules(方法/类规则,ErrorCollector等)
  • 使用一些特殊记录器
  • ...

PS。我不是在寻找一个简单地将这些细节写入单独文件的解决方案,因为我认为这样做的含义对用户不太友好。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以将Hamcrest(Why should I use Hamcrest-Matcher and assertThat() instead of traditional assertXXX()-Methods)与自定义Matcher<Response>how to implement a hamcrest matcherIs there a simple way to match a field using Hamcrest?)一起使用。

通过对Matcher的一点工作,这将允许您将测试编写为:

assertThat(response, hasStatus(200));
assertThat(response, hasJsonPathEval("foo.bar.id", eq("baz"));

,任何失败都会包含toString的{​​{1}}代表。

这在功能上等同于:

response

但更清楚的是,您希望assertEquals(response.toString(), 200, response.getStatus()); 和测试说明在失败时显示。

答案 1 :(得分:1)

您需要做的就是制作自定义错误消息以打印您想要的任何内容

 assertEquals( getResponseDetails(response), 200, response.getStatus());
 ...
 assertEquals( getResponseDetails(response), "baz", evalJsonPath(json, "foo.bar.id"));

getResponseDetails()是您编写的方法。

private String getResponseDetails(Response response){
   StringBuider builder = new StringBuilder();

   buider.append("header = '").append(response.getHeader()).append("'\n");
   ...//similar code for body etc

   return builder.toString();

}

此字符串将写入您配置测试输出以进入Maven配置的任何位置,并且仅在测试失败时打印。

或者可选地,因为它显示Response可能是您创建的自定义类,您可以使Response#toString()包含您想要的信息,在这种情况下您只需执行此操作:

 assertEquals( response, 200, response.getStatus());
 ...
 assertEquals( response, "baz", evalJsonPath(json, "foo.bar.id"));

作为旁注:我从您的堆栈跟踪中注意到您正在使用junit.framework.Assert这是旧的JUnit 3库。您应该使用JUnit 4&#39; org.junit.Assert代替