张云 魏强 何永江 付征
(1.中国民航信息网络股份有限公司 北京市 100000 2.北京市民航大数据工程技术研究中心 北京市 100000)
(3.沈阳民航东北凯亚有限公司 辽宁省沈阳市 110000)
根据研发中心“松耦合,强管理”的技术原则,系统内各软件越来越多,各软件之间通过接口进行交互。自2020年开始,研发中心着力打造PSS 对外服务接口体系。因此,接口测试的需求近期明显井喷。如何校验字段繁多结构复杂的接口功能、如何设计规范化的测试用例、如何实现回归测试是接口测试中的三大难点。
在2018年对Service API(简称SAT)接口的测试过程中,我们发现,手工测试存在报文拼接出错率高、字段覆盖不全等诸多风险。经研究,可以通过报文自动化拼接的方式来实现接口的自动化测试。
自动化测试能大大减少人工投入、显著提高工作效率。但是,由于自动化测试的学习成本比较高,所以接口测试的自动化目前还没有大规模推广和普及。本文通过读取接口文档、自动生成字段结构测试用例和字段校验用例等技术手段,使接口的自动化测试流程化、工具化,从而达到减少学习成本、提高工作效率的目的。
接口,Application Programming Interface(API),在软件领域泛指不同功能之间的交互通信部分。接口测试,一般与页面测试进行区分,是直接测试接口功能的一种测试类型。通过软件测试的理论和方法去测试接口,找出接口的功能缺陷,从而验证服务端是否满足了它所提供的服务。
接口测试流程根据软件项目所采用的开发模式而略有不同,通常的测试流程如下:
(1)接口文档分析;
(2)接口用例设计;
(3)用例评审;
(4)接口测试环境搭建;
(5)接口用例执行;
(6)缺陷提交;
(7)回归测试;
(8)测试报告和交付物提交。
图1:Jenkins 自动部署设置
图2:自动执行时间设置
接口测试总体分为功能和非功能的测试。非功能方面一般需要测试接口的性能、安全方面,功能测试需求根据软件测试的理论方法进行用例的设计。常见的测试设计如下:
3.3.1 性能测试
(1)响应时间;
(2)吞吐量;
(3)并发数;
(4)服务器资源使用率(CPU、内存、IO、网络等)。
3.3.2 安全测试
(1)敏感信息是否加密;
(2)传输过程是否加密;
(3)日志系统;
(4)恶意请求测试;
(5)SQL 注入测试。
3.3.3 功能测试
(1)业务功能测试(正向场景、反向场景、错误场景);
(2)边界分析测试(业务规则边界、参数边界);
(3)参数组合测试;
(4)异常情况测试(系统异常、网络异常、重复请求、分布式测试、事务测试等)。
图3:自动执行脚本设置
图4:自动发送结果邮件
图5:查看结果
图6:重点标红失败的接口
对于接口用例的执行,可以根据测试人员的能力选择适合的测试方式,不同的测试方式会有效率、质量上的差异。本文列举了业界应用最广泛的3 种方式:
3.4.1 工具测试
常见的工具有SoapUI、Postman、Jmeter,采用工具测试对测试人员的能力要求较低,但是测试过程会由于测试工具的局限性而受到影响,如果测试工具不支持则不能满足测试的特殊要求。
3.4.2 代码测试
对测试人员有较高的代码能力要求,测试通过编写程序代码来构造自己的测试框架,并且可以根据自身的需求随意的扩展代码,可以打造出完全符合需求的测试程序。
3.4.3 平台测试
适用于较大型的软件项目,项目组有测试开发人员专门编写统一的、适合本项目或者本公司需求的接口测试平台。如此打造的接口平台可以不断迭代功能,从而满足层出不穷的需求,且对执行测试的人员没有较高的代码能力要求。
图7:抓取接口页面的接口信息
3.5.1 测试工具
由于项目组初期人员较少,测试人员没有较强代码能力,经项目组研究选择了SoapUI 作为测试工具。SoapUI 本身有着强大的接口测试功能和良好的用例管理功能,并且可以通过脚步插入的方式进行功能扩展,可以满足SAT 的绝大部分测试需求。
图8:生成SoapUI 格式的全字段请求
3.5.2 测试用例生成
使用Python 编写工具从网页版的API 文档中抓取信息、生成请求并整合成SoapUI 的Test Suite 文件,根据接口逐一生成Test Suite 文件作为测试用例。技术细节请见第4 章。
图9:生成SoapUI Test Suit
3.5.3 测试执行
使用soapUI 工具导入生成的Test Suite,再在工具中进行点击、执行。
3.5.4 回归测试
将测试过的Test Suite 放在Git 仓库中,使用Jenkins 集成测试环境、测试脚本,并在Jenkins 中设置每天早上自动执行Test Suite中的用例,自动生成报告发送给相关人员。如图1 至图6 所示。
(1)SoapUI(开源接口测试工具);
(2)Python(测试程序开发工具),按照如下模块:
1.bs4
2.Paramiko
3.ElementTree
程序分为如下四部分:
(1)按照接口的url 地址,抓取页面,返回接口信息;
(2)根据抓取接口,生成SoapUI 格式的全字段请求;
(3)步骤(1)和(2)的内容,生成包含接口全部必填校验和字段内容校验的Test Suit,供导入SoapUI 后自动执行:
1.根据接口信息,生成必填字段校验,和字段内容校验的正、反用例测试点和对应的断言;
2.必填字段测试请求和断言:如是普通字段,则从全字段请求中移除此字段,如是数组中的一个元素,则清空此数组;
3.字段内容校验测试请求和断言:生成此字段的参数化soapUI请求,自动为参数化字段分配此字段校验规则对应的测试数据,根据数据,生成此soapUI 请求的断言;
4.全部请求按照soapUI 的Test Suit 格式生成为一个xml 文件,供SoapUI 导入使用。
4.3.1 抓取接口页面的接口信息
实现思路:
(1)Python 中著名的第三方库BeautifulSoup 可以用于解析网页;
(2)Confluence 页面的授权,可以通过http 访问登录页面后保存cookie,使用cookie 验证以减少认证时间;
(3)通过标题名称,控制访问的页面区间,通过输入参数["req","res"],确定返回页面的请求信息还是返回信息;
(4)把搜索到的信息,按照字典格式返回,共后续程序使用。
抓取接口页面的接口信息如图7 所示。
4.3.2 生成SoapUI 格式的全字段请求
实现思路:
(1)获取到接口信息后,使用ElementTree,逐级构造XML请求。
(2)若JSON 请求格式不能直接通过XML 转换,需要按照如下步骤转换:
1.读取接口字典;
2.遍历XML 请求,结合接口字段,判断当前节点类型:是普通接口,直接转换,同时需要注意值类型的转换;该节点下包含其他节点,则此节点创建为数组结构,如A 字段,转换为A:[],此节点下的结节,不填写名称,而向此数组中添加值即可。
生成SoapUI 格式的全字段请求如图8 所示。
4.3.3 生成SoapUI Test Suit
实现思路:
(1)使用此接口的全报文字段,作为后续请求生成的基础;
(2)解析全报文信息,可以把报文按照TestSuit,TestCase,Json 请求,XML 请求,参数设置、断言这几部分;
(3)通过Confluence 上的接口文档,可以获取每个请求字段的属性,是否必填,类型,父节点等信息;
(4)对于属性的校验,可以通过程序自动生成有效,无效等价类或者文件的方法,生成对应的用例和断言;
(5)对于M 字段的校验,可以通过程序,自动从全字段报文中,去除此字段,然后添加对应的用例和断言;
(6)这个脚本,其实是要给文本处理脚本,使用Python 抓取接口请求信息后,使用请求信息中内容,生成符合SoapUI 接口要求的XML 文档。
生成SoapUI Test Suit 如图9 所示。
通过对接口测试全流程、用例设计以及接口自动化技术等的梳理,SAT 测试人员对相关的流程、范围和方法等都有了全面深入的了解,能设计出更完善的测试用例,提高了测试质量。此外,关键技术的研究,使得测试流程自动化正逐步取代手工操作,大大提高了测试效率。同时,随着研究的深入和技术的不断加强,测试人员已经有能力优化测试流程,从而形成了双向拉动的良性循环。经过一年的不断实践和改进,测试用例的平均设计时间已从3 天缩至1天,测试执行效率提高了30%,接口的回归测试周期也大大缩短。
接下来,将在工作中做更加全面的改进和提升,使接口测试流程更加顺畅、用例设计更加完善、自动化程度更加提高,以进一步提高接口测试的质量和效率。