第一次发表东西,请轻拍

公司的业务接口都是用 Java 封装的,提供的使用方法大部分都是 HTTP GET. 传入参数,前端直接获取 JSON 进行开发。前期构建了 Web UI 的自动化测试框架(基于 Web 界面的管理系统,WebDriver 和 appium 实现 PC 和移动端的回归测试)。现阶段集成了接口相关的自动化。

  1. 整体框架为: 接口->接口用例->用例验证步骤. 一个接口管理多个用例(接口相当于套件),一个用例管理多个验证步骤。
  2. 测试结果持久化到 DB,在管理系统中查看。验证失败或者返回状态码错误的相关接口,发邮件到相关人员。
  3. 结合 UI 自动化,为每一个 Case 配置前置和后置操作。比如要测试淘宝的下订单接口,需要先登录并加入相关商品到购物车;在调用接口后,需要验证一下订单的正确性。由于 UI 和 HTTP 接口自动化集成于一个 Web 系统中,所以能够方便的调用 WEB(APP)UI 用例。

  4. 返回的 JSON 直接使用 JSONPATH 作验证。

https://github.com/jayway/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。目前只是发送邮件, 还没开发其他展现方式。
}


↙↙↙阅读原文可查看相关链接,并与作者交流