供应商管理系统openAPI接口自动化测试的实现

猪小花1号2018-08-27 09:47

一,背景

openAPI的简要逻辑如下:用户在严选下单购买商品后,订单信息经一系列系统处理后流入供应商管理系统,供应商管理系统通过openAPI的推单功能将订单信息发送给对应的供应商的系统,供应商为用户发货后需要把物流信息通过openAPI回传给供应商管理系统,如果用户在购买后取消订单,取消信息由供应商管理系统openAPI推给供应商的系统,告诉供应商此单已取消。具体业务逻辑在此不赘述。


二,分析

openAPI1.0版本主要有三个接口:1,推送订单接口;2,供应商回传物流信息接口;3,推送取消信息接口。

以推送订单接口为例,从数据来源和数据去向来讲,数据来源于用户下单,供应商管理系统处理后将订单信息发给货品供应商的系统。从用户下单到订单信息传入供应商管理系统中间还要经过不少其他系统的处理,而我们此次要测试的主体是供应商管理系统的openAPI,使用从源头下单的数据虽然完全没有问题,但是需要上游各系统的配合,这在测试初期是不合适的,应当是在各系统都测试完成后再进行系统间的联测。所以,针对于数据来源这一块,我决定采用mock数据的方法,使用上游传数据给我们系统的接口,将数据传入供应商管理系统。对于数据去向,供应商管理系统需要将订单信息以post方法传给供应商的系统,在实际测试阶段去找一个供应商来一起联测是不现实的,这里采用的方法依然是mock数据。


三,实现

1mock数据源:

拿到上游系统推订单给供应商管理系统的API文档,按照文档说明用pythonrequests库来实现发送订单信息给供应商管理系统。

2mock供应商系统:

先分析这个供应商系统需要满足哪些需求。首先,它需要有一个以url形式暴露的服务,让管理系统可以向这个url发送请求。其次,考虑这个供应商系统对于本次测试而言最重要的是什么功能?真实的供应商系统里可能包含了供应商对自己的库存以及发货状态等信息的管理,但这些对我们的测试而言都是不重要的东西,对我们来说重要的是它的返回。针对供应商系统的各种正常以及不正常的返回,我们的管理系统都应该做到正确地处理,本次测试也是要检验在各种不同返回值的情况下,系统是否做到了预定的符合逻辑的处理。

针对以上分析出的两点需求,我采用了flask框架来mock供应商系统,flask的基本使用方法如下图:

先成功运行这个脚本,然后当我们访问http://127.0.0.1/时,就会得到“Hello World"这个返回。

随后我们面临的一个问题是:如何做到当管理系统每次推送订单时都返回不同的返回值,来达到自动化测试每种情况的目的。一个普遍的做法是让开发帮忙在供应商管理系统发出的请求中加一个参数,用来告诉mock的系统这次该返回什么了。但本着测试尽量不侵入开发代码的原则,我没有采用这个方法。观察整个推单接口的数据组成,我发现body中有一个字段叫outNumber,是由数字和字母组成的字符串,可以借用它的后三位数字来代表各种不同的返回值。outNumber是在mock数据源的时候产生的,那么我在mock数据源的时候可以指定outNumber后三位数是什么来决定得到的返回的什么。

3,组织用例:

使用python来做测试,通常可选用的框架有doctestunittestpytestnose,这些测试框架有哪些异同大家可以自行查阅。我选取的是nose框架,代码的结构如下:

logic文件夹中主要mock推单和mock返回值的代码,test文件夹中是测试用例,我将测试用例分为两类,一类是针对单个接口本身的输入输出设计的测试用例,一类是跟业务逻辑相关,多个接口之间组合的测试用例。

nose是自动收集测试用例的,推荐的项目结构也是如上图的结构,单独建一个test文件夹来放置测试用例,里面按模块来分子包,测试用例的文件名以”test_"开头。

和其他测试框架一样,nose也有各种类级别、函数级别的setupteardown,可以视具体的用例执行需求来进行编写。

执行结果的验证使用了asserts库,主要根据不同返回结果来验证数据库中对应字段是否符合预期,以及日志中是否有对应记录。

4,生成测试报告:

采用了nose_html_reporting库,使用方法如下:

生成的测试报告如图所示:

生成测试报告之后多做了一个邮件发送功能,可以把测试报告发送到指定邮箱。在发送测试报告时如果采用发送邮箱是我们的163,126以及yeah.net邮箱,要注意设置的password必须是客户端授权码,而不是平时使用的邮箱登录密码。客户端授权码的设置如下:


在安装nose_html_reporting库时曾发生了一点小插曲,本机测试调通后把测试代码放到测试服的时候就一直报错,发现是html插件一直无法安装成功,换了其他的生成测试报告的库也依然无效,因网上没有找到有效的解决办法,最后只能尝试更换python版本,(我本机是2.7的版本,测试服是2.6),给测试服新装2.7版本的python后问题解决了。


四,思考

暂时还没有接入持续集成,后续会考虑。

关于mock供应商系统,采用outNumber后三位数来代表不同返回值这种方法,相对于将各种不同返回情况存储于文件中来说工作量相对小,但如果后续接口格式有修改的话调整会比较大,还需要再考虑一下。


网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者荆晶授权发布。