验证 http get 的 return 值
Validate return value of http get
假设您有这样的测试用例:
@Test
public class MsgFlowIT extends TestNGCitrusTestDesigner {
@Autowired
private HttpClient todoClient;
@CitrusTest(name = "SampleJavaTest.Send")
public void Send() {
http()
.client(todoClient)
.send()
.post("/api/values/Method1")
.contentType("application/xml")
.name("Method1")
.messageType(MessageType.XML)
.payload(<XmlMessage>msg1</XmlMessage>);
http()
.client(todoClient)
.send()
.get("/api/values/Method2")
//.response(HttpStatus.OK)
.contentType("application/xml")
.messageType(MessageType.XML)
.name("Method2")
//.accept("text/html")
.expect(<XmlMessage>msg2</XmlMessage>); // check if the return value of "get" matches the ".expect"
}
是否可以使用 http-get 的 return 值并检查它是否匹配
预定义的 xml 结构或满足 xpath 表达式?
就我而言,我肯定必须知道 http-get return 是什么并将其与某些预期的 xml 进行比较。
我希望有人能在这里提供帮助,我已经投入了很多时间:/
Citrus 客户端发送 GET 请求并从服务器获得响应。您完全缺少测试代码示例中的 receive
部分。在您的示例中,您只是发送了两个请求而没有在测试中收到响应以进行验证。
您可以使用预期 header 和负载信息验证响应消息。我建议在您的代码示例中使用以下 send-receive 操作:
@Test
public class MsgFlowIT extends TestNGCitrusTestDesigner {
@Autowired
private HttpClient todoClient;
@CitrusTest(name = "SampleJavaTest.Send")
public void sendAndReceive() {
http()
.client(todoClient)
.send()
.post("/api/values/Method1")
.contentType("application/xml")
.name("Method1")
.messageType(MessageType.XML)
.payload("<XmlMessage>msg1</XmlMessage>");
http()
.client(todoClient)
.receive()
.response(HttpStatus.OK)
.header("X-SomeHeader", "expectedValue")
.payload("<SomeExpectedXml>foo</SomeExpectedXml>");
http()
.client(todoClient)
.send()
.get("/api/values/Method2")
.contentType("application/xml")
.messageType(MessageType.XML)
.name("Method2");
http()
.client(todoClient)
.receive()
.response(HttpStatus.FOUND)
.header("X-SomeHeader", "expectedValue")
.xpath("/some/expression", "expectedValue")
.payload("<SomeExpectedXml>foo</SomeExpectedXml>");
}
}
每个 send
后跟同一个客户端端点上的 receive
。另请注意,Http 本质上是一种同步协议,因此发送操作会阻止测试,直到收到来自服务器的响应。
除了使用预期 header 和有效载荷验证接收到的响应消息外,您还可以在该接收操作上定义 XPath 表达式以进行验证。
假设您有这样的测试用例:
@Test
public class MsgFlowIT extends TestNGCitrusTestDesigner {
@Autowired
private HttpClient todoClient;
@CitrusTest(name = "SampleJavaTest.Send")
public void Send() {
http()
.client(todoClient)
.send()
.post("/api/values/Method1")
.contentType("application/xml")
.name("Method1")
.messageType(MessageType.XML)
.payload(<XmlMessage>msg1</XmlMessage>);
http()
.client(todoClient)
.send()
.get("/api/values/Method2")
//.response(HttpStatus.OK)
.contentType("application/xml")
.messageType(MessageType.XML)
.name("Method2")
//.accept("text/html")
.expect(<XmlMessage>msg2</XmlMessage>); // check if the return value of "get" matches the ".expect"
}
是否可以使用 http-get 的 return 值并检查它是否匹配 预定义的 xml 结构或满足 xpath 表达式? 就我而言,我肯定必须知道 http-get return 是什么并将其与某些预期的 xml 进行比较。 我希望有人能在这里提供帮助,我已经投入了很多时间:/
Citrus 客户端发送 GET 请求并从服务器获得响应。您完全缺少测试代码示例中的 receive
部分。在您的示例中,您只是发送了两个请求而没有在测试中收到响应以进行验证。
您可以使用预期 header 和负载信息验证响应消息。我建议在您的代码示例中使用以下 send-receive 操作:
@Test
public class MsgFlowIT extends TestNGCitrusTestDesigner {
@Autowired
private HttpClient todoClient;
@CitrusTest(name = "SampleJavaTest.Send")
public void sendAndReceive() {
http()
.client(todoClient)
.send()
.post("/api/values/Method1")
.contentType("application/xml")
.name("Method1")
.messageType(MessageType.XML)
.payload("<XmlMessage>msg1</XmlMessage>");
http()
.client(todoClient)
.receive()
.response(HttpStatus.OK)
.header("X-SomeHeader", "expectedValue")
.payload("<SomeExpectedXml>foo</SomeExpectedXml>");
http()
.client(todoClient)
.send()
.get("/api/values/Method2")
.contentType("application/xml")
.messageType(MessageType.XML)
.name("Method2");
http()
.client(todoClient)
.receive()
.response(HttpStatus.FOUND)
.header("X-SomeHeader", "expectedValue")
.xpath("/some/expression", "expectedValue")
.payload("<SomeExpectedXml>foo</SomeExpectedXml>");
}
}
每个 send
后跟同一个客户端端点上的 receive
。另请注意,Http 本质上是一种同步协议,因此发送操作会阻止测试,直到收到来自服务器的响应。
除了使用预期 header 和有效载荷验证接收到的响应消息外,您还可以在该接收操作上定义 XPath 表达式以进行验证。