有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

简而言之,它们执行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)运行测试时,我希望能够看到断言错误以及请求和响应的详细信息。我认为这需要打印到系统中。out/err,但最好通过一些日志系统来完成

此外,我希望在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等)
  • 使用一些特殊的记录器
<> P.S.我不想寻找一个简单的解决方案,因为我认为这样的细节对用户来说不太友好。p>

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您可以将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表示您的response

    这在功能上等同于:

    assertEquals(response.toString(), 200, response.getStatus());
    

    但更清楚的是,您希望在失败时显示response和测试描述

  2. # 2 楼答案

    你所需要做的就是制作一个自定义的错误消息来打印你想要的任何东西

     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,这是旧的JUnit3库。您应该使用JUnit4的org.junit.Assert