接口测试 基于 Http 的接口自动化测试

lyu · 2016年02月23日 · 最后由 konami1986 回复于 2016年02月24日 · 2096 次阅读

第一次发表东西,请轻拍

公司的业务接口都是用 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。目前只是发送邮件, 还没开发其他展现方式。
}
共收到 11 条回复 时间 点赞

虽然发帖是要鼓励的,但是这个。。。能不能再详细点额。。= =

鼓励小而美的文章, 不过你这也太小了. 没代码, 纯侃...
jsonpath 我在自己的接口测试工具中使用了, 的确很好用. 而且用处很大.

lyu #3 · 2016年02月24日 Author

@monkey @seveniruby 第一次发帖不够详细,下次会注意! 补充了一些东西!

lyu #4 · 2016年02月24日 Author

@seveniruby jsonpath 我只是扫了一遍文档,发现就算是他最最基本的功能都能满足我大部分的验证需求,所以就选择了。具体复杂点的用法还没尝试过呢。慢慢试试看。 我想到 jsonpath 是当时总在想自己写一些逻辑去作接口返回的 json 验证。后来我想在用 webdriver 或者 appium 的时候都可以用 xpath 解析,有没有一种叫 jsonpath 的东西呢?于是 google 一搜,还真是有!

虽然不了解这方面,但还是很想问下楼主这个框架实现后的效果和数据如何。有没有什么心得。

lyu #6 · 2016年02月24日 Author

#5 楼 @m13890 目前只是刚刚搭建起来,正如我写的,还有很多功能需要开发,还有很多用例需要创建,才能完全支持公司的业务。所以现在还无法给出数据。不过可维护性和易用性还不错。后期会根据自己的想法和各位的建议持续更新效果。

lyu #7 · 2016年02月24日 Author

@monkey 不准备再发帖了!刚去读了一些精华文章,比如那个海豚自动化测试系统,感觉过于牛了。我发贴就是班门弄斧了。

#3 楼 @jet 嗯,补充的蛮好的。也不是每个人每次都写得出精华文章的,一步一步来呗

@jet 对于执行成功的 CASE,可以将 http 请求、JSON 结构解析入库,做为当前接口版本的基线。
1,下一个版本与当前基线进行对比,基本可以确认所有的变更范围,扫清所有的受影响接口。
2,也可以产出线上接口的监控

lyu #10 · 2016年02月24日 Author

可以用 php curl 做接口自动化

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册