接口测试 API 自动化测试框架分享

testly · 2015年10月11日 · 最后由 小忍 回复于 2020年11月05日 · 611 次阅读
本帖已被设为精华帖!

前言

接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率,仍然是大部分公司需要解决的问题。

框架定位

  • 数据驱动设计模式,无需写测试代码脚本即可实现自动化
  • 等价类非等价类覆盖, E2E(接口流程性测试) Case 覆盖
  • 使用 Excel 的方式进行自动化用例编写,简单,易用,高效。

框架架构图

框架介绍

技术栈

Jenkins + Svn + Maven+TestNG+ReportNG+(HttpClien+URLConnection)

Case 展示

1,单个接口 Case

Json response 解析用的是 JsonPath 解析方式,检查点以 “,” 隔开

2.,E2E 流程性自动化 Case

其中可以取上面的 Step 的 response 内的参数作为下面步骤的入参或者检查预期值。

执行展示

先配置用例脚本模板:

配置好全局环境配置:

Jenkins 配置任务并执行,得到自动化测试报告
邮件报告:

测试报告:
  • 任务概述

  • 步骤过程打印:

接口与接口之间可以按规定的参数进行 取值与赋值,单独由数据中心去控制遍历的接口是否需要进行数据转换!~
这样可以把一些简单的 API 业务流串起来持续集成,方便快速迭代~!

框架优势:

1 编写 Case 效率
  • 易编写,在 Excel 内编写负责 粘贴非常简单方便,全局替换也非常方便。

  • 易维护,无需每个人写代码脚本,在用例模板内可维护性高很多。

  • 易交接,自动化模板基本都能看懂,思路一目了然。

2 执行效率

3,支持接口之间参数定义(需使用定义参数)

4,HTTPCode 检查非正常外的状态均会报错!

(只有错误的地址才会出现在测试报告里面)

  • 报告详情示例:

5,响应超时预警邮件触发:
  • 单个接口响应超过 5 秒自动触发代码发送邮件给指定人

6 全局参数变量
  • 指定参数 TTPod_Rondom(20) 在执行过程中代码会自动替换成 一个范围在 0~20 以内的随机数

7 框架轻便灵活,无缝对接 持续集成,持续交付

与 TestNG +Maven+Jenkins 搭建持续集成链路,非常简单。

欢迎一起交流,一起进步 可以关注我的微信公众号:“测试开发进阶” - 点我关注

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 99 条回复 时间 点赞

赞 多谢分享!

谢分享!

我最近也在做自动化接口测试,基于 httpclient, 使用 json 传递数据,get 接口的比较容易实现,但是遇到 post 和 put 接口时,涉及到修改数据,不知道怎么准备数据以及如何让数据不断重复利用。

已关注!

#3 楼 @sz_mizu 其实你可以做一些参数化或者一些随机数,就像我这个模板,传值的时候会有多个公用的变量可以用,可以保证每次参数按要求去赋值

单一接口的参数化,以及返回结果的正则校验也应该支持

testly #94 · 2015年10月12日 Author

#6 楼 @vigossjjj 正则校验是支持的么,单一接口的参数化可以去随机或顺序去取一列配置好的参数,目前还会有一些公共的参数比如说一个范围内的随机数,自增数等等,

这些 url 怎么获得的?有文档?

#8 楼 @doctorq 有接口文档的!

#9 楼 @testly 所以这个是重点~~给提供文档的 RD 是好伙伴

testly #11 · 2015年10月12日 Author

#10 楼 @doctorq 这是硬性要求,每个接口开发前都会有文档,其实数据的准备比较麻烦,但是配置之后后面就方便了!

#11 楼 @testly硬啥硬,我们就没有文档

testly #13 · 2015年10月12日 Author

#12 楼 @doctorq 没有文档那得测试的时候自己去收集了!~相对比较麻烦!

#13 楼 @testly 不愧是阿里音乐的测试老大,牛逼

testly #15 · 2015年10月12日 Author

#14 楼 @monkey 猴哥你的嘲讽是我努力的方向!~

17楼 已删除

mark,跪舔柴爷。

赞 学习学习

20楼 已删除

高大上。。。

学习了。
ps:框架介绍——图里的执行层 Jenkins 写错了

testly #81 · 2015年10月12日 Author

#22 楼 @delete31 果然是测试!

牛逼

#5 楼 @testly 接口测试一些操作使数据库中的数据发生了变化,在一个接口测试完后需要恢复数据吗 (恢复到原来的数据,以保证下次可以重复利用这条数据),如果要恢复数据的话是否要操作数据库?

testly #26 · 2015年10月12日 Author

#25 楼 @sz_mizu 这个问题还确实有点棘手,要恢复数据库的话如果可以通过接口能实现的话可以加一个步骤接口来恢复这个字段,或者更偏方你可以参数化源数据,比如:抽奖的 case 一个用户只能抽奖一次,你执行完之后必须得去改数据库才能重复抽,你可以参数化这个用户在 100 个用户里面去随机去取用户来抽奖!这样可以么?

有 2 个问题请教下,那个耗时是怎么计算的额,执行前和执行后时间戳么还是。 jenkins 集成 testng.xml 文件怎么执行的

testly #28 · 2015年10月13日 Author

#27 楼 @13651969749 耗时是建立发送请求进入缓存流之前和 得到响应之间的时间 ,第二个问题是吧 testng.xml 写在 pom.xml 里面!我这边还把 testng.xml 作为参数在 jenkins 那边是可以选择来跑哪个 xml

#28 楼 @testly 明白了,tks。。

前来顶帖

testly #31 · 2015年10月13日 Author

#30 楼 @sophia_jl 老大好!

JJ BOOM SKY~

想学,但是不知道如何下手

testly #34 · 2015年10月15日 Author

#33 楼 @lovoro 很简单,你先熟悉 HttpClien 把一些发送请求的方法封装起来,再想办法在发送请求参数上面去做功夫 @!尽量保持灵活性强,又要坚持代码通用,不需要重复 coding!框架的话比较简单!先把第一步完成后面好弄的!

不愧是阿里音乐的测试老大,牛逼

一直有个疑问,就是无论是 API 的自动化还是功能自动化,当某些操作使数据库中的数据发生了变化,要恢复到原来的数据,是不是只能通过操作数据库?毕竟要持续地跑 case 的话,是必须要恢复到原来的数据啊!

testly #37 · 2015年10月16日 Author

#36 楼 @charles 按你的说法,打个比方,如果人工取测试完测试下来是不是最后需要去数据库重置数据? 如果是的化可以自己派生出一个通过 java 去修改数据库至于需要重置数据和表的可以作为变量放到数据文件内在每次执行完后去自动执行重置数据脚本即可?

testly #67 · 2015年10月16日 Author

#35 楼 @75281920 你也跟着瞎起哄

没有数据需要通过查询数据库的吗?

testly #65 · 2015年10月19日 Author

#39 楼 @alwans 建立在这套框架之上可以支持扩展数据库查询提取参数再传参! 至于怎么实现原理是一样的,在数据模板配置指定参数程序会去数据库拿指定的参数!

两个问题:
1.像对某一个音乐进行下单的话,url 中肯定会带上这个音乐的 id,那接口自动化的话需要遍历所有的音乐吗?还是说只需要测试一条就可以了。
2.另外 url 中动态的数据要如何进行处理呢?

testly #42 · 2015年10月22日 Author

#41 楼 @zsx10110 第一个问题 id 第一,可以随机取 id,第二可以通过之前的接口来取值再传过去~/b 每次执行时执行一次,如果多次的话也可以通过配置 文件来实现,配置文件里面有一个执行次数的选项
第二,动态数据可以支持 数据库查询再赋值给接口,查询数据库和传值的过程都可以通过文件配置来实现,还支持上接口之间参数传递,还支持参数化!

大哥,框架很好,但是源码呢 :)

8 错,涨姿势,来个源码 demo 呗。

楼主,请教两个问题:

  1. 是否有可视化界面给用户操作
  2. case 间传参数是如何实现的?

越来越多的大牛分享接口测试了,非常感谢。

testly #58 · 2015年10月29日 Author

#45 楼 @franky 界面还没做,只有 Jenkins 界面去 run,第二个问题,case 之间参数 在数据模版里面用根据关键字去正则提取!比如在 “返回下单接口返回的 “order_id” 需要提取出来,只需要在 模板的一列写上关键字:” order_id“就可以了!

有个疑问,如果是验证手机验证码这类的接口,要怎么才能自动获得验证码?

testly #56 · 2015年11月03日 Author

#48 楼 @et91 如果你的验证码存在数据库内那只要在接口请求前配一条 sql 把验证码取出来就行了!如果不是存在 sql 那你手工测试怎么取?

有开源吗?学习,学习!

testly #51 · 2015年11月04日 Author

#50 楼 @yangxiangfu 不好意思哈,集团的代码估计还不能对外公开!

大赞!我们也在做接口测试的框架。@seveniruby是主程。找时间一定交流一下啊。

testly #52 · 2015年11月09日 Author

#52 楼 @skytraveler 向你们学习

想问下,如果接口里面有个参数需要其他参数加起来的 MD5 值,这种情况怎么处理好啊

testly #50 · 2015年11月13日 Author

#54 楼 @yanzilove MD5 是在发到服务端再去解密的吧?,这种场景你如果能用工具 把参数加上 MD5 值能请求成功我这个也就可以的!

#55 楼 @testly 谢谢回复,现在也在做类似的框架,跟你的比起来,发现我的太草率了

testly #57 · 2015年11月13日 Author

#56 楼 @yanzilove 你也可以分享一下 你的东西,大家一起帮你完善,大家互勉!

#57 楼 @testly
不敢班门弄斧啊

赞,另外能支持 cookie、headers 一些信息的配置吗?

testly #60 · 2015年11月16日 Author

#59 楼 @li_hugo 这些都可以在配置触发器内配置,httpclient 本身有一些关于 cookie 的方法!应该支持的!

请教:
1.你怎么控制检查点的,检查 json 里面的某个或者多个字段的数据?
2,如果里面有图片,是否还有再次发一次请求去验证?

testly #63 · 2015年11月27日 Author

#62 楼 @284772894
第一个问题:检查点是由测试人员确定好预期结结果,我会把它的预期变为一个集合 然后根据集合里面的每一个 key 和对应关键字去返回的 Jason 里面一层一层的找!可以支持复杂结构体层级路径遍历
第二个问题:据我的了解一般的接口返回里面只会有图片的 url?

#63 楼 @testly json 不是 jason

#63 楼 @testly
#62 楼 @284772894 对于图片的 url,我觉着用 url 到服务器判断文件是否存在应该就可以了

#63 楼 @testly 弱弱的问一句,你这个自动化框架是用 java 写的吧,python 能实现你这个自动化框架吗?

testly #68 · 2015年12月09日 Author

#67 楼 @yuwuhen333 我觉得应该可以吧,跟语言没有关系!

设计思路很棒,赞个

不得不赞!!这是实现私有云测了吗?

能分享下源码吗??

先赞个!请问接口测试中接口间的参数依赖是怎么解决的呢 (如果不用持久化方式)?而且返回的 response 的 body 参数校验的预期值是否写在 excel 中?@

#63 楼 @testly

testly #74 · 2016年02月27日 Author

#73 楼 @sigma 比如 接口之间的参数可以用公共的参数接收并传递下去~ 教验点也都是写在文档里面 也可以通过参数传递把上面接口传下来作为下面接口的校验点(还可以通过在文件里面写 sql 直接去数据库捞数据并作为校验点)~

#74 楼 @testly 谢谢解惑与指教~目前我准备做一个轻量级的接口测试框架,但是参数传递的话,如果在 java 用静态变量存储的话是可以,但是我不想硬编码到代码中,想弄个通用点的 (适于任何项目),excel 数据驱动的,目前还在不断尝试中,感觉难点在于如何组织、处理 excel 中的数据哇~

testly #76 · 2016年02月27日 Author

#75 楼 @sigma 我目前就是脱离代码的~ 比如上一个接口取出来一个 orderId 下一个接口请求需要用的话 只需要在文档里面贴入 “${orderId}” 就会自动替换获取之前取得值 ,类似这样的~
其实我的思路就是将取出来的数据装到一个 Map 里面 替换的话根据对应的 Key 替换对应的 value

#76 楼 @testly 那您的处理数据的代码逻辑一定很强大,我要自己去实现试试,多谢指教~

testly #78 · 2016年02月27日 Author

#77 楼 @sigma 建议设计一个数据中心 ~作用是 入参出参的数据转换~

#78 楼 @testly T T 我都写到一起了,入参是 JSONStirng,转为 JSONObject,出参全部转为 String,之后用 JSONPath 表达式获取需要的 actualValue 跟 expectValue 比对,目前还在思考如何实现接口间参数传递~

@testly 问下这个报告是用 reportng 生成的?

testly #81 · 2016年03月11日 Author

#80 楼 @mark 对的,

#81 楼 @testly 请问大神"检查多个文件全部遍历文件内的所有接口"是通过配置文件实现指定读取的 excel 文件集合吗?目前我按照您的思路实现了一个简单的单文件自动化接口测试框架,而且由于使用了 testng 的 dataprovider,所以造成我产生的报告中 (reportNG) 所有测试方法的名称都一样 (因为只有一个@Test注解,或者能动态的根据我传入 test 方法的参数 caseDescription 去修改@Test中的 description?)

testly #22 · 2016年03月12日 Author

#82 楼 @sigma 目前我是脱离 @Test注解 的
通过和失败都是打点 自己写方法

#83 楼 @testly 多谢指教,看来我得研究下 reportng 自己生成的 html 模板了,修改自带的 template

testly #20 · 2016年03月13日 Author

#84 楼 @sigma 最好自己定制,testng +reportNG 有局限性

#85 楼 @testly 好的,目前还在熟悉中,自己定制的话需要用到 java 的类似于 html 模板啥的,这个之前没研究过,准备研究下,感觉一个好的报告系统真是对于自动化测试来说非常重要

陈恒捷 接口测试的一些感悟 中提及了此贴 03月20日 07:55
恒温 感谢 fir.im —— 结果公布 中提及了此贴 06月05日 05:20

好文章,,, 有开源吗?

我最近也在编写一个类似这样的叫接口自动化框架,也是 excel 为数据源,不一样的是测试用例没有采用 testng 之类的单元测试框架测试。是将整个框架打包成一个 jar 包,给组内的人员进行使用,使用 java 执行 jar 包的命令,带上 excel 文档的路径就可以自动运行了。但这种情况下,报表方面比较难做,请教下楼主,这种情况下,怎么能做好报表?

DC 回复

excel 里除了数据,专门弄几页做 testNG 的事,程序里控制。然后每次跑完收集结果,形成 report。
哈哈,我实现过你的需求,有需要可以找我~~

mark 下,学习下思路!!

Alpha 回复

能分享下源码吗?大家共同学习

DC 回复

代码很容易,主要是思路。我帖子里会慢慢说清楚的

你好,楼主想问一下,excel 作为输入源,里面会包含特别多的接口时你们会做分类吗?还有怎么校验结果呢?比如验证某个接口数据是否正确需要查数据库,那么用 excel 批量读取待测接口后,怎么区分哪些接口的结果需要从库里查?或是结果怎么校验正确与否呢?多谢!!!

testly #96 · 2018年04月17日 Author
y 回复

接口本身自带属性属于哪个 service 或者哪个业务模块 按照这个分就可以了
查数据校验看做成一个 step 就可以了 把查出来的数据包装成 json 格式 按照接口返回一样的校验。

testly 回复

好的,我试一下~~~谢谢楼主指教!

post 请求方式,表格数据源 data 里面为什么不直接用 json 格式,而是转成 get 方式,要用的时候还得转 json? 如果有数组参数怎么办?

阿三 回复

这个入參的类型是业务形态决定的,我们需要做的支持各种情况
如果有数组 也是按照 key:value 的方式进行入參,同 postman 理

100楼 已删除

楼主您好,看到您的分享获益匪浅,有个小小的疑问。我们公司的接口都是 Restful 风格的,比方说http://www.baidu.com/api/v3/sessions/h5/13500000009,,是否需要在 Excel 专门用一个字段来做参数化,还是就在 URL 里面写死?这是个发送短信验证码的接口,结尾的手机号

大神 期待开源 学习下

学习了

有个问题想请教大家

1.问题:想在代码中通过一个类跑流程化用例接口,但是流程用例中可能【每个接口的请求类型不一样,请求方法也不一样】,这样该如何方便处理呢

2.目前的做法:通过在用例中加上请求头字段,然后在代码里面用 if 分支去根据

用例详情

判断代码

我知道这样处理是很笨的一个方法,请求类型那么多,不可能一个个都写上去,但是一直没想到很好的解决办法,希望大家能给一些思路

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