【发布时间】:2014-04-04 10:59:25
【问题描述】:
我的任务是实现必须使用远程restful 服务的集成测试。问题是,我们不希望将任何测试数据放入真正的宁静服务中。
一般我们有:
负责从 RESTful 保存和加载数据的控制器:
@RequestMapping(value="/user/save", method = RequestMethod.POST)
saveUserData(@RequestParam String data, @RequestParam String user){
// here is the logic to send the data to save
restfulClient.save(user, data);
}
@RequestMapping(value="/user/load", method = RequestMethod.POST)
loadUserData(@RequestParam String data , @RequestParam String user){
// here is the logic to load the data from restful service
return restfulClient.load(user, data);
}
RestfulClient 只是向远程 Restful 服务发出 put 和 get 请求以保存和加载用户数据。
2 黄瓜场景:
When user User is saving data some_data
Then user User sees saved data is some_data
3 黄瓜测试:
@When("^user (.+) is saving data (.+)$")
public void whenSave(String userName, String data) throws Exception {
MockHttpServletRequestBuilder req = post("/user/save").contentType(APPLICATION_JSON_UTF8).content(data);
callUrl = getMockMvc().perform(req.session(userName));
}
@Then("^user (.+) sees saved data is (.+)$")
public void thenResponseAndDataAreCorrect(String userName, String data) throws Exception {
MockHttpServletRequestBuilder req = get("/user/load").content(data);
callUrl = getMockMvc().perform(req.session(req.session(userName));
callUrl.andExpect(status().isOk());
callUrl.andExpect(jsonPath("$.Records[*].data", hasItems(userName)));
}
测试可以在不同的线程中同时执行,因此每个测试的 user_id 可以不同。在这种情况下,我们需要为每个 id 写入和读取数据。
http://some.restful.service/{user_id}
很高兴知道我们可以在上述情况下使用的一些方法。
【问题讨论】:
-
嗯,你问的是微不足道的。您是否考虑过使用
dbunit(dbunit.sourceforge.neta)?通过使用它,您可以在运行测试之前为数据库设置状态,并在测试完成后删除所有测试创建的数据。 -
远程 RESTful 服务是否在您的控制之下?您可以复制一份用于测试目的,以防止对现场环境造成任何中毒吗?如果没有,您可能需要考虑模拟这个 RESTful 服务(通过创建您自己的简化版本),并针对它运行集成测试。
-
我们选择了模拟 RESTful 客户端的方法。
-
我个人同意你的嘲笑方法。也希望 SoapUI 能对你有所帮助soapui.org/Getting-Started/mock-services.html
标签: java rest integration-testing cucumber-jvm