京东质量社区 接口测试实践和一些想法

taki for 京东 · 2016年03月22日 · 最后由 taki 回复于 2018年07月10日 · 11361 次阅读
本帖已被设为精华帖!

因为最近想接触一下移动测试方面,所以了加入了 TesterHome 这个社区,看见了很多优秀的文章,也看见了很多讨论《自动化测试的困惑》《很多接口测试框架》《接口测试感悟》,下面我谈一下个人的见解,勿喜勿喷。


接口测试的好处


  • 简单 (对于开发基础比较好的同学来说)
  • 稳定 (成功率极高,很少出现 UI 自动化测试的各种状况)
  • 效率 (1 个接口下的 100 条用例 1 秒执行完成)
  • 可信 (UI 自动化测试报告天天发送,一堆 Fail,费了好大劲排查原因,结果各种环境、浏览器问题等,慢慢大家对这个就想白盒扫描工具的报告一样,当成垃圾邮件)
  • 时间 (用例编写时间段短,也不需要写测试脚本,调试页面脚本)

接口分析、工具选择


  • 目前主流的协议 HTTP、WEBSERVICE、REST 等,还有一些 dubbo、hessian 等个别公司内部开发或者二次改装的协议。
  • 其实我们做接口测试对于是什么协议前期不用太怎么关注,我们主要关注怎么模拟发送请求。(当然学一样东西,不仅仅要知道,而且要知道原理,否则就违背了我们身为技术人员这个职业了)
  • 当我们确定接口是哪些协议的时候,那么我们就开始选择模拟调用端了。
  • 基于 HTTP 接口测试的工具:restclient、postman、jmeter、soapUI 等等,基于 JAVA 代码的 httpclinet、JAVA 自带的 URLConnection 等。
  • Dubbo 之类的可能要自己客户端请求代码了。
  • 所以接口测试第一件事情,确定客户端或者调用工具。

用例编写、开始执行


  • 开始编写前置条件、入参、返回结果、预期结果等测试用例相关信息。
  • 运用工具去执行测试用例。
  • 校验返回结果是否正确。 -简单的一个 接口测试完成。

【思考】手工接口用例执行完了,那我们开始自动化测试吧


  • 开始找各种开源框架,二次开发等。
  • 编写各种脚本。
  • 准备各种接口自动化测试用例。
  • 准备接口数据。

我们在回顾一下自动化测试的好处,可以帮助人做某些事情,提高效率,减少资源。
那么我们专门为了做接口自动化测试而做了以上 4 点工作。
如果我作为功能测试人员的话,我是不会想做完手工测试在去维护各种接口自动化用例和数据 (事实证明其他同事确实如此)。
框架可能好做,接口请求客户端也可能好写,用例数据的维护呢?


一个想法

  • 手工接口测试和自动化测试能够有效的结合起来是不是更有好处,测试人员在做手工接口测试的同时数据可以保存下来,然后可以批量运行,发送报告,这样是不是接口自动化测试呢?

实践

  • 我们没有做框架。
  • 根据公司的技术,做了一套接口测试的平台,它不是最好的,但是可能是最适合的。
  • 当然你也可以基于开发工具二次开发。
  • 菜单列表工程介绍。

  • 工具箱是一个工具集合,和市面工具没有区别,打码的是公司内部的协议就不外传了。


接口测试菜单


-接口测试主要是创建接口与项目进行绑定。

  • 直接在这里进行接口的手工测试,当手工接口测试结束之后,执行的用例数据可以作为自动化测试用例使用。
  • 创建接口

  • 接口列表,可以在这里选择接口执行所有测试用例,也可以设置前置,后置条件,数据恢复,维护接口写的测试用例。

  • 测试用例维护

  • 新增测试用例,里面可以设置一些数据库条件、数据查询校验条件、断言匹配规则以及接口测试,针对 JSON 的 List 自动排序对比,在这里测试之后直接就保存了自动化回归用例。


报告


  • 当然还有执行报告、邮件报告、定时任务、Diff 对比等

  • Diff


以上内容仅供参考,平台的功能没有全部介绍,希望能给大家带来帮助。

共收到 47 条回复 时间 点赞

亲,请问能否介绍一下这套框架是以什么为内核的?
看了看感觉一头雾水啊。。。

准备数据和数据恢复具体怎么实现呀?

taki #45 · 2016年03月22日 Author

#1 楼 @585945 亲,不好意思啊,介绍的不太明白,这个不是框架,是一套 WEB 系统,主要是针对接口测试,接口自动化,接口 MOCK,接口性能的工具平台。主要就想表述一个思想,1.让手工和自动化结合,2.不要为了自动化而自动化,没有带来收益,却带来工作量。

taki #4 · 2016年03月22日 Author

#2 楼 @sanlengjingvv 这里的有点暴力执行操作被测系统数据库,SQL 由用户自己编写,SQL 和用例绑定,都是参数化的

之前有好几家公司都做了类似的平台. 你这个做的还是挺全的.

taki #11 · 2016年03月22日 Author

#5 楼 @seveniruby 恩,类似的还挺多的,这套系统运行了 1 年多了,目前看数据,对工作提升还是非常高的,尤其对于使用 SOA 架构和微服务架构设计的公司。

不错,做的挺全。

之前也有做一下自动化的接口测试,但由于时间精力问题没有做成平台形式。有几个问题想交流下:

  1. 做成平台的出发点?代码 +excel 也能达到类似效果,为何要做成 Web 平台
  2. 平台是二次开发还是纯自己开发?大概花费多少人时?
  3. 接口测试后续维护中保持接口协议与后台一致是一个比较麻烦的问题,想问下你对于接口测试平台加入接口协议相关功能(自动校验数据结构是否正确,生成符合协议要求的随机数据等)看法如何?
taki #8 · 2016年03月22日 Author

#7 楼 @chenhengjie123

做成平台的出发点:1.主要是想让测试人员在项目里面做手工接口测试,数据得以保存,直接回归,也可以把研发加入项目
2.推进研发自测,目前的单次调用次数,测试人员占百分之 70,开发占百分之 30,对于开发来说不想花那么多时间去学习研究各种工具,有现成的我也就用了。
3.可是化、去代码,有些测试同学对代码没有那么深的基础,这里没那么抽象,维护两张表格他就会用了。
4.里面有些类似 DUBBO 开发的 javaRpc 服务,这种的做成了去代码的形式,为整个公司服务。
开发平台:平台是是自主开发的,人时的话看能力吧,需求明确,可能半个月不用就出来了。
第三个我没太理解是什么意思?

两个人同时请求了一个改变数据的接口会有问题吗

#3 楼 @taki 目前我们部门做的只是一个简单的基于 excel 的接口测试框架,看了您的分享感觉很厉害啊 (页面感觉像是 extjs 系列的前端框架)~请问您那边对于 diff 是如何实现的呢?是不是有第三方的类库可以支持?后台的话是否是使用 springmvc 之类的框架搭建呢?感觉内部调用接口的代码您那边是封装了一套支持各种协议的类库

#7 楼 @chenhengjie123 @taki 做成平台其实是牺牲了灵活性和开放性来降低入门的门槛. 这是当年大 QA 时代的产物.
web 平台和 excel 都不是最适合接口测试的形态. 他们的表现能力较弱. 但是满足平常的需求还是可以的. 毕竟日常的一般需求还是最多的. 优秀的架构是一套底层接口测试框架, 再加上一定的上层建筑就足够了. 可以自己做 Web, 也可以让接口测试框架直接对接 redmine 或者 jira. 利用 jira 的流程自定义来实现相同的效果.

taki #12 · 2016年03月22日 Author

#9 楼 @sanlengjingvv 可能会有问题,概率应该不大,只要不是绝对的并发就没问题

taki #13 · 2016年03月22日 Author

#10 楼 @sigma diff 用的是第三方的 js 插件,页面时 jquery easyui ,后台是 springMvc ,mybaits

#8 楼 @taki 第三个的意思是平台能否同时承担一部分接口协议维护和两端联调的工作。

例如接口协议更改后,客户端可以直接找平台 Mock 生成的随机数据来检验自己解析代码,后台可以找平台确认自己的实现是否符合协议要求。

taki #15 · 2016年03月22日 Author

#11 楼 @seveniruby 是的,灵活性上面肯定是牺牲了,这个是为了满足日常过多繁杂的测试任务,起到快速迭代的作用,和 redmine 或则 jira 结合的话,我们之前做过一套 UI 自动化的平台,和 remdmise 和 jira 直接打通的,直接在里面提 BUG 或者获取需求,不过效果不太好,改变一个人的工作方式还是很难,是有接口的测试框架的。把质量流程串联起来还是不错的,不过不好做······

#14 楼 @chenhengjie123 协议的维护还没有,不同的协议实现方式不同,在没有改协议的模式下,要新增的,同一个接口貌似协议是不能变更吧,随机数据检验自己解析代码是指 webservice?

我也想问下检查点是怎么做的,比如实际结果是{data:[{a:b},{a:c},{a:d}],code:0},你这里是如何对类似于这样的结果进行检查的?

#16 楼 @taki 这个要看具体协议。

可能我说的不够准确。我说的协议不是 http 协议或者别的协议,主要是接口数据结构。这个当遇到添加新功能时有可能会通过扩充字段来做。

举个例子,协议指定登录接口的数据结构如下:

{
  "username": "stringType",
  "password": "stringType"
}

那么客户端根据这个协议写完解析语句后,可以随机生成下面的数据来联调:

字段结构错误
{}

正常数据
{
  "username": "adsafasdf",
  "password": "asvxzcv"
}

字段数据类型错误
{
  "username": 1123123,
  "password": 15612
}
...
taki #19 · 2016年03月22日 Author

#18 楼 @chenhengjie123 你是说加字段哈,数据结构变了,如果新增字段了,并且这个字段影响路径或者分支,可以理解功能变更或者需求变更么,有源码可以扫描出来的

—— 来自 TesterHome 官方 安卓客户端

taki #28 · 2016年03月22日 Author

#17 楼 @lose 目前 5 种方式,全文字符串,包含,关键字,去属性,不包含

—— 来自 TesterHome 官方 安卓客户端

#19 楼 @taki 可以这么理解。只是两端的代码都还没写,只是把数据结构定下来了。

taki #25 · 2016年03月22日 Author

#21 楼 @chenhengjie123 如果你的文档标准化,是可以做到解析的,类似 wsdl,要有一定规则的,wsdl 刚出来的时候也没有解析他的方法和参数的吧,所以你定义一次文档规范,后续都应该可用

—— 来自 TesterHome 官方 安卓客户端

请问,这个框架接口之间的依赖测试怎么实现呢?

taki #27 · 2016年03月23日 Author

#23 楼 @songdefei 被测接口依赖外部接口?

—— 来自 TesterHome 官方 安卓客户端

有没有可能实现流程化的业务测试功能? 比如用一个接口执行产生的数据测试另一个接口?

taki #26 · 2016年03月24日 Author

#25 楼 @drugstar 没做流程化的接口串联

#3 楼 @taki 这个很赞同,不要为了自动化自动化,适合自己的才是最好的,我也觉得手工和自动化有效结合比较好

个人感觉:手工和自动化有效结合比较好一点,一边手工测试,调试 JM 脚本,测试过程中接口出现问题,研发修复,可以不再用手工进行回归测试,直接可以进行自动化的回归了,从而实现了,手工进行测试,自动化进行回归的目的了。目前我搭建了接口自动化的框架,jenkins+jmeter+ant ,通过 tomcat 虚拟目录,进行测试报告的发布。大家看一下,我这个方案是否可行

taki #32 · 2016年03月25日 Author

#28 楼 @allanwendy 这种方案是可行的,主要体现一种思想,用什么工具 或者自己开发 都可以的。你这种方案能做成一站式服务的话最好,用户不用关注怎么上传 jm 脚本 什么之类的。关注两个点:1.手工自动化结合,2.简单。

#29 楼 @taki 恩,接下来就准备这块的工作了,之前一直在想的是把接口手动测试与接口自动化分开来做,后来想了一下,不合理,还是手动 + 自动化持续来做比较方便

看到有这种工具开放出来,感觉蛮欣慰

taki #32 · 2016年03月31日 Author

#31 楼 @bean 欣慰 嘿嘿

#32 楼 @taki 测试之前需要把数据重置吗

taki #14 · 2016年04月08日 Author

#33 楼 @kuangxiaoying 看业务吧,查询类的不需要

#34 楼 @taki 我总是觉得测试用例不应该跟数据有依赖关系,否则改用例的时候还要改环境。但是用例执行前自动构建测试数据又觉得麻烦。有什么建议吗/谢谢

taki #36 · 2016年04月11日 Author

#35 楼 @kuangxiaoying 这里面也没有依赖关系吧,做任何测试都离不开数据,除非你不做测试,什么按照一定规律生成数据之类的,各种算法生成,业务改了那么你的自动构建的代码是不是也要修改了

顶一个,学习

匿名 #38 · 2016年04月13日

这工具开源吗?

taki #42 · 2016年04月14日 Author

#38 楼 @mengfeiyang 没开源

我想问一下,你们的数据库 的 测试数据准备和销毁是怎么做的 ,让测试人员写 sql 还是 ?

taki #41 · 2016年05月03日 Author

#40 楼 @ycwdaaaa 测试人员写

请问执行之前的测试准备,包括上面朋友说的数据的准备和还原,脏数据的处理,测试环境的准备,比如涉及到数据库,某些 service 的启动,config 文件的修改,接口参数的关联,并发执行的数据隔离,字符串加解密等等楼主有没有不错的经验?

taki #45 · 2016年05月06日 Author

#42 楼 @simple 数据的处理我们都是在页面通过 SQL 参数化 绑定具体用例处理的,这个系统的应用是在末节使用的,所以 service、config 文件的修改都是在环境方面处理,是可以接入 jenkins 或者其他工具,目前没有做接口的流程化,那个也不好做,如果做的话相当于模拟了开发的前段对吧?加密和解密可以把算法加入进来,线下的测试数据没有做数据隔离

这个项目考虑开源不?挺全面挺好用的!

taki #45 · 2018年03月07日 Author
TestingNG 回复

与公司中间件耦合太重了,不好拆分,暂时没有

taki #47 · 2018年07月10日 Author

@lisha_2008 @TestingNG 后面会有替代品开源

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