第一次发表东西,请轻拍
公司的业务接口都是用 Java 封装的,提供的使用方法大部分都是 HTTP GET. 传入参数,前端直接获取 JSON 进行开发。前期构建了 Web UI 的自动化测试框架(基于 Web 界面的管理系统,WebDriver 和 appium 实现 PC 和移动端的回归测试)。现阶段集成了接口相关的自动化。
结合 UI 自动化,为每一个 Case 配置前置和后置操作。比如要测试淘宝的下订单接口,需要先登录并加入相关商品到购物车;在调用接口后,需要验证一下订单的正确性。由于 UI 和 HTTP 接口自动化集成于一个 Web 系统中,所以能够方便的调用 WEB(APP)UI 用例。
返回的 JSON 直接使用 JSONPATH 作验证。
不知道 JSONPATH 有没有人使用,反正我觉得用起来事半功倍。
目前只有基本的功能,请社区大神指出问题,提点建议,谢谢!
补充 2016/02/24
贴点体现思路的代码!
由于有一个 Web 系统,所以以 SpringMVC 的 Controller 为逻辑主入口,前端界面请求要执行的接口 id 和 Case id
@RequestMapping(value = "apicase/{apiId}/{id}", method = RequestMethod.POST)
@ResponseBody
public String runApiCase(@PathVariable("id") Integer id,
@PathVariable("apiId") Integer apiId, Model model,
HttpServletRequest request) {
APIHttp apiHttp = apiHttpService.get(apiId);
APICases apiCases = apiCasesService.get(id);
runApiCaseLogic(apiHttp, apiCases, request, false);
return "success";
}
执行逻辑的代码大致如下
private void runApiCaseLogic(APIHttp apiHttp, APICases apiCases,
HttpServletRequest request, boolean parallel) {
List<PropertyFilter> filters = PropertyFilter
.buildFromHttpRequest(request);
PropertyFilter cpFilter = new PropertyFilter("EQI_caseId",
String.valueOf(apiCases.getId()));
filters.add(cpFilter);
//取出所有验证步骤,接下来的工作交给Runner执行,其中beforeRunner 和 afterRunner为UI用例的Runner,分别为前置操作和后置验证
List<APISteps> list = apiStepsService.search(filters);
HttpApiRunner har = new HttpApiRunner(1, base, paramList,
apiCases.getDescription(), APISteps
beforeRunner, afterRunner);
Thread runThread = new Thread(har);
runThread.start();
}
大致的验证逻辑
目前很简单,只是 GET 到结果随后用 JSONPATH 作验证,并给出反馈
public class HttpApiRunner implements Runnable {
//成员变量xxxxx
public String verifyJsonPath(String jsonPath) {
try {
Object r = JsonPath.read(result, jsonPath);
if (r instanceof JSONArray) {
if (((JSONArray) r).size() > 0) {
success++;
return jsonPath + "通过";
} else {
failure++;
return jsonPath + "<strong>失败!!</strong>";
}
} else {
failure++;
return "返回的不是JSONArray,请检查";
}
} catch (PathNotFoundException e) {
failure++;
return "没有找到对应的jsonPath" + jsonPath;
} catch (InvalidPathException e) {
failure++;
return "不合法的JsonPath" + jsonPath;
}
}
@Override
public void run() {
try {
/**
* 前置操作
*/
if (beforeRunner != null) {
Thread beforeThread = new Thread(beforeRunner);
beforeThread.start();
try {
beforeThread.join();
} catch (InterruptedException e) {
}
}
/**
* 接口验证。 目前直接GET即可,后期如果有需求可根据成员 Method作相应的调整
*/
byte[] b = HttpRequest.get(url + "?" + paramList).bytes();
try {
String result = HttpRequest.uncompressDeflateEncoding(b);
this.result = result;
} catch (DataFormatException | IOException e) {
e.printStackTrace();
}
//随后调用上方的 verifyJsonPath(result),进行数据正确性校验。
//最后是后置验证,验证调用接口后产生的一些结果
if (afterRunner != null) {
new Thread(afterRunner).start();
}
//最后是整合整个结果,将结果持久化或者是发邮件,亦或是保存为html。目前只是发送邮件, 还没开发其他展现方式。
}