一、API 测试的基本步骤

通常来讲,API 测试的基本步骤主要包括以下三大步骤:

1、准备测试数据;

2、通过通用的或自己开发的API测试工具发起对被测API的request;

3、验证返回结果的response。

常用的API测试工具有命令行工具cURL、图形界面工具Postman或SoapUI,支持API性能测试的JMeter等。

二、API复杂场景举例

通过使用基础的测试工具,可以做简单场景的API测试;而项目进行过程中,为了解决实际的一些问题,我们会设计更加复杂的测试场景,下面列举几个实际项目中的典型场景。

场景一:API串联调用

以协议支付为例,我们知道,三方公司接入网联后,用协议支付取代代扣,而协议支付的流程中需要用户输入银行返回的验证码完成绑卡。从接口层面上看,顺序是先调用协议签约API,返回状态成功且获取到短信验证码后,再使用此短信验证码作为输入参数调用代扣API。协议签约和代扣两个API是顺序调用,而且在两次调用中间有获取手机上的短信验证码,这些过程都需要通过程序自动化实现以提高效率。

场景二:API接口加密

为保证API接口安全,系统间和系统内模块间互相访问需要进行加密处理,常用的加密方式有DES、AES、RSA、MD5等,各系统的加密方式并不一样(接口调用方和接口提供方约定好即可),意味着API测试需要支持多种自动化加密方式程。某些系统还会返回加密的响应报文,也需要识别并解密。

场景三:异步API测试

异步API指请求发出后后收到一个同步响应,但并不是最终处理结果,最终结果通过回调或者主动查询获得。对于这样的API,同步响应的验证只是第一步,后续还得继续验证DB中的值、MQ中的值、以及异步回调是否成功等。对于异步回调,我们可以模拟回调地址来验证成功与否;而对于主动查询,我们就得通过查看DB中的状态值来验证了,但是查询到结果的时间点不确定,几分钟到几小时都有可能,这就得有一个定时DB查询任务去验证。

场景四:API测试中的外部依赖

APIA调用APIB且B不可用,此时如何测试APIA需要考虑。比如支付系统对三方支付通道、对银行的依赖,并不是所有的三方都支持测试环境,解决此问题的核心思路是搭建MockServer,而且尽量做到通用性,我们开发了一套Mock系统 -aMock,通过页面录入接口信息,保存在数据库内,通过Nginx访问配置好的Mock接口,后台统一处理请求信息,然后通过URL和报文特性去匹配特定的响应信息。

三、API测试平台

我们的API测试平台是要基于业务场景的,即要支持各业务的共性需求,又要针对不同业务的个性特点加以开发来丰富API测试能力;而且,对用例也要有很好的规划,结果有清楚的展示,测试平台架构如下图:

BIT:业务接口测试(BusinessInterfaceTest)

SUT:被测系统(SystemUnderTest)

TestCaseManagement:测试用例管理,包括从测试用例到测试用例集,再到测试任务的数据关系的建立和维护。测试用例是最小单位,测试用例集是从某一维度对用例进行的归集,测试任务即测试执行,可立即触发也可定时执行,只能执行测试用例集。

Util:工具类封装,主要提供数据加解密,数据类型转换,配置文件读写,数据字典的缓存服务等。

Validator:接口响应字段和数据库字段的验证封装。

RiskManagement:风控处理,因为会涉及支付真实资金,需要内置风控规则来保证资金安全,风险可控。

Timer:定时任务服务,包括

  • 串联API用例中,前置用例的状态判断;

  • 异步API的数据库校验;

  • 超时API用例的失效状态判断;

  • 定时执行的任务计划。

MockServer:用例依赖的外部系统Mock服务。

Portal:API测试平台门户网站,包括测试用例的录入,维护,测试任务的执行,结果查看,导出等都通过门户进行操作。

DB:存储测试用例数据以及相应的测试任务、测试报告数据,还有项目配置等。

目前API测试平台上各项目维护用例总结1200多条,以回归用例为主,且还在不断增加中,随着用例的不断添加,平台也历经了一系列优化,下面就谈谈这个过程中的一些思考。

四、测试数据准备

对于大量API用例的执行,需要数据驱动测试,也就是说可以将测试数据和测试代码分离解耦,这样便于测试数据的维护同时也保证了数据的准确性,用例设计格式是这样

  1. <accountName>${accountName}</accountName>
  2. <accountNo>${accountNo}</accountNo>
  3. <identNo>${identNo}</identNo>

几个关键数据节点由DataProvider提供,为了增加测试覆盖度,数据库相似的测试数据有多条,比如多条四要素(银行卡号、手机号、身份证号、姓名)数据,当大量用例需要读取时,可采用缓存方式存储并读取到cList里面,通过循环遍历,使每条测试数据都可以被均匀读取,下面是替换关键数据节点的一段代码,将cList数据依次赋给对应变量。

五、测试执行的逻辑控制

很多情况下的测试是场景化API测试,涉及用例的顺序调用。如下图,“签约-成功-kftn-协议”依赖于“签约-成功-kftn短信”的执行;在添加用例时配置好关联关系。

执行时,会根据用例属性将此两条依据有无前置条件划分为两类,分别存放于两个list里,无前置条件的用例可以马上执行,有前置条件的用例,设置TestStatus为0,等待定时任务轮询触发执行。分类执行代码如下图

定时任务每分钟执行一次,下面一段是判断前置API的执行状态,只有“0000”代表成功,当前API才能执行,执行时,需要读取前置用例的结果数据并传入;如果前置API失败,则停止任务执行,多条API用例顺序执行也是同样的道理;即使有外部依赖的用例,比如短信验证码,我们也可以通过写一段手机APP程序自动上传短信验证码到服务器,然后触发延迟获取验证码,得到后通过DB记录用例执行的状态和结果,并传给下一个API使用,就完成了多用例的顺序执行。此外,测试任务的执行封装成restful接口,可以更加灵活地和目前团队正在开发中的CICD系统结合一起。

六、测试结果的验证

通过分析业务,API的结果校验大致分为两种类型,响应校验和数据库校验。响应校验是针对response报文字段的校验,可精确匹配也可通过正则表达式模糊匹配;数据库校验是基于定时任务的,需要在用例里面根据约定格式设置校验方法,比如下面的sql检验条件,会在准生产环境通过指定单号以及其他条件去查询返回字段,并判断status是否为7,从而判断用例是否成功。

  1. PreOnline.|,|SELECTtb.outer_batch_no,tb.status,bs.send_statusFROM
  2. bs_outpay.trans_batchtbleft joinbs_outpay.es_business_sendbsontb.business_batch_no=bs.entity_uuidandbs.entity_status<> WHEREtb.outer_batch_noin (?) order bytb.CREATED_TIMEDESC|,|{"status":""}

用例状态分为成功、失败、处理中、超时四种状态,分别通过配置相应SQL查询条件去映射,成功和失败是终态,处理中则是需要定时任务继续查询,超时,是我们内部设定的一个状态,目前是超过一个小时未返回终态设为超时,此API用例失效并报警,需要人工参与查看。所有这些规则都是在用例建立和编辑的时候添加的,如下图,一条用例包括了响应校验(值校验、key校验)和数据库校验,通过这种比较灵活的设计,基本能够满足复杂API测试场景。需要指出一点是,很多应用不允许外部测试平台直接访问数据库,我们的解决办法是写一个数据查询服务部署在系统环境中,只提供查询功能,并且有加密验证保证通讯双方(测试平台和数据查询服务之间)可信。

通常来说,测试平台或框架可以从某种层面上理解为工具链的串联,开发此平台的过程中,我们使用的技术栈有springmvc+herbinate做逻辑控制、amazingUI做用例管理、echart做结果展示,还使用Jenkins做任务调度等,用户就是各业务线测试人员,他们不需要了解具体代码的实现,但是需要对系统结构以及用例规则有很好的理解,这样才能设计出符合测试场景的用例。

任何测试平台的设计还是要基于业务的,后续我们对API平台的推进策略是,继续增加场景化功能以支持更多业务类型的测试,比如清结算系统中日终、日间的跑批任务,对账文件的数据检验等,增加大并发能力并和性能测试工具相结合。

作者:孙鹰

来源:宜信技术学院

五大典型场景中的API自动化测试实践的更多相关文章

  1. 基于postman的api自动化测试实践

    测试的好处 每个人都同意测试很重要,但并不是所有人都会去做.每当你添加新的代码,测试可以保证你的api按照预期运行.通过postman,你可以为所有api编写和运行测试脚本. postman中的测试 ...

  2. SparkSQL中产生笛卡尔积的几种典型场景以及处理策略

    [前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机.那么都有哪些情况会产生笛卡尔积,以及如何事 ...

  3. Lego-美团点评接口自动化测试实践

    Lego-美团点评接口自动化测试实践 2018-02-07 转自:Lego-美团点评接口自动化测试实践 目录 一.概述  1.1 接口自动化概述  1.2 提高ROI    针对“减少投入成本”    ...

  4. HTTP API 自动化测试从手工测试到平台的演变

    不管是 Web 系统,还是移动 APP,前后端逻辑的分离设计已经是常态化,相互之间通过 API 调用进行数据交互.在基于 API 约定的开发模式下,如何加速请求 / 响应的 API 测试,让研发人员及 ...

  5. 基于图像识别框架Airtest的Windows项目自动化测试实践

    写在前面 上一篇分享了<基于Sikuli GUI图像识别框架的PC客户端自动化测试实践>,但sikuli看起来怎么都像是上个世纪的界面风格,且功能过于简陋.而同样基于图像识别框架的Airt ...

  6. Redis在WEB开发中的应用与实践

    Redis在WEB开发中的应用与实践 一.Redis概述: Redis是一个功能强大.性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL.但事实上Redis除了作为NoSQL数据库使用之 ...

  7. 谈谈微服务中的 API 网关(API Gateway)

    前言 又是很久没写博客了,最近一段时间换了新工作,比较忙,所以没有抽出来太多的时间写给关注我的粉丝写一些干货了,就有人问我怎么最近没有更新博客了,在这里给大家抱歉. 那么,在本篇文章中,我们就一起来探 ...

  8. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)

    前言: 在前进中去发现自己的不足,在学习中去丰富自己的能力,在放弃时想想自己最初的目的,在困难面前想想怎么踏过去.在不断成长中去磨炼自己. 正文: 时间轴 flask + Python3 实现的的AP ...

  9. <API自动化测试>Centos-Newman

    一.介绍: 在测试和开发中,有一款API测试工具一直占据着武林盟主的地位,那就是声名远播的Google公司的Postman. Postman原先是Chrome浏览器的一个插件,后面发展成了一个应用程序 ...

随机推荐

  1. codeforces 327 A Ciel and Dancing

    题目链接 给你一串只有0和1的数字,然后对某一区间的数翻转1次(0变1 1变0),只翻转一次而且不能不翻转,然后让你计算最多可能出现多少个1. 这里要注意很多细节 比如全为1,要求必须翻转,这时候我们 ...

  2. export,export default,module.exports,import,require之间的区别和关联

    module.exports Node 应用由模块组成,采用 CommonJS 模块规范.根据这个规范,每个文件就是一个模块,有自己的作用域.在这些文件里面定义的变量.函数.类,都是私有的,对外不可见 ...

  3. MySQL-5.7.21非图形化下载、安装、连接问题记录

    1.安装包下载链接:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-winx64.zip 官网:https://www.mysql.co ...

  4. LeetCode 85. 冗余连接 II

    题目: 在本问题中,有根树指满足以下条件的有向图.该树只有一个根节点,所有其他节点都是该根节点的后继.每一个节点只有一个父节点,除了根节点没有父节点. 输入一个有向图,该图由一个有着N个节点 (节点值 ...

  5. 洛谷 P5367 【模板】康托展开(数论,树状数组)

    题目链接 https://www.luogu.org/problem/P5367 什么是康托展开 百度百科上是这样说的:   “康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. ...

  6. Hibernate自动执行更新方法

    问题场景:在执行查询时,没有对对象A调用save或者update操作,控制台显示却执行过一次update 问题原因:在执行查询之前 对A中的某一个关联对象 one-one one-many 等 字段 ...

  7. J.U.C并发包(1)

    J.U.C并发包(1) AbstractQueuedSynchronizer AbstractQueuedSynchronizer是JUC并发包中锁的底层支持,AbstractQueuedSynchr ...

  8. net core Webapi基础工程搭建(三)——在线接口文档Swagger

    目录 前言 Swagger NuGet引用第三方类库 别急,还有 没错,注释 小结 前言 前后分离的好处,就是后端埋头做业务逻辑功能,不需要过多考虑用户体验,只专注于数据.性能开发,对于前端需要的数据 ...

  9. vue自定义组件中的v-model简单解释

    在使用iview框架的时候,经常会看到组件用v-model双向绑定数据,与传统步骤父组件通过props传值子组件,子组件发送$emit来修改值相比,这种方式避免操作子组件的同时再操作父组件,显得子组件 ...

  10. Hyper-V修改Docker for Windows存储设置

    自从Win10安装了Docker for Windows后,C盘容量爆炸,必须做一波迁移了.我的Docker使用的是Windows的Hyper-V虚拟机,于是google了一番找到以下一篇文章 doc ...