我正在编写一些使用Maven故障安全插件运行的集成测试(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,但最好通过一些日志记录系统来完成。
此外,我希望在测试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(方法/类规则、错误收集器等)
- 使用一些特殊的记录器
- 。
附言。我不是在寻找一种简单地将这些详细信息写入单独文件的解决方案,因为我认为它的含义不太用户友好。
谢谢!
Hamcrest(为什么我应该使用Hamcrest-Matcher和assertThat()而不是传统的assertXXX()-Methods)和自定义Matcher<Response>
(如何实现hamcrest匹配器,有没有一种简单的方法可以使用Hamcrest匹配字段?)。
只需对Matcher
进行一些工作,这将允许您将测试编写为:
assertThat(response, hasStatus(200));
assertThat(response, hasJsonPathEval("foo.bar.id", eq("baz"));
任何失败都将包括您的response
的toString
表示。
这在功能上等效于:
assertEquals(response.toString(), 200, response.getStatus());
但更清楚地表明,您希望在失败时显示测试的response
和描述。
需要做的就是制作自定义错误消息以打印您想要的任何内容
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 3 库junit.framework.Assert
。 你应该使用 JUnit 4 的 org.junit.Assert