接口测试-工作心得记录十(目前测试框架总结基于unittest)
背景:明天有面试,今天想写个帖子总结一个我目前接口框架整体架构和想法,算是一个总结帖吧。
这次我想基于unittest四大组件:testfixture,testcase,testsuite和testload.
testfixture
翻译过来应该叫做“测试资源准备”吧,对应方法setUp()和tearDowm()(后面我统称为testfixture了)。这个可以说xunit单测框架系中很核心的功能。因为它可以帮你每一个case(就是test开头的方法)准备初始环境比如说初始化接口域名,header(我司在头文件中有一个key为accesstoken主要验证是身份表示来自我们合法的客户端),cookie(一般登录后再cookie中包含userid用来保持登录态),从配置类获取配置常量(比如说mobile等),二次封装库实例化(封装requests.post和requests.get),初始化orm链接数据库获取的userid和postid等(我测试商户端要帖子的状态会出发不同的流程,帖子的类型也会有不同的逻辑)和把枚举类型赋给变量。testfixture在每一个case执行的时候都会被自动运行一次这也是为什么要继承unittest.testcase类而不是直接写一个普通类。testfixture代码如下:
这里面我写了一个base_testcase类基础测试类(这里面我没有继承unit.testcase)写了setUp()和tearDown()两个方法。原因是我写case的时候是按照模块分开写的没有写到一个类里面去,如图:
这样呢每一个测试类只需要继承我的base_testcase基类就可以了。需要加什么直接在这里面添加修改就ok了。说道统一配置还书写一个配置类需要用于存放3个环境接口域名,各种账号密码等,基类从配置类里面去数据。因为数据敏感就不粘贴了。
testcase
case正常些一些校验逻辑。做接口测试整体就是三要素。构建http(https)请求,校验response和查询数据库验证。这个也就是一个整体的case闭环。举一个case例子如图:
简单说一下:构建请求:[url(域名+接口名称),参数key,构建post请求(这里面二次封装)]。校验返回:[response调用json解析,和期望hope_response进行check校验(主要校验key),断言response['code']和response['msg'](因为客户端会根据code值不同有不同的页面展示,msg主要客户端弹得toast)]和数据库校验。对应上面接口3要素。思路其实很简单但是根据实际使用要有各种封装方法调用才方便,比如说请求二次封装,代码如图:
主要目的丰富框架,让case层书写起来更加简洁,思路就是:构建一个post请求,并记录日志,如果状态码非200就出发发送微信push,也可以发送短信等等。这样case层实例化二次封装,我们有什么想加功能都可以加载这里面,这样在所有case都可以生效。之所以有日志功能,其实保证框架完整性,老实说用的logging模块(挺难用的),走的配置文件,配置文件还是想说一下,配置很方便我们有什么想存的全局变量都可以放到里面,也不用考虑作用域什么的,一放什么时候用就取,过期就更新一下值很方便,代码如图:
书写配置文件一定用congfigParser()书写,不要自己写要不然读的时候就会有问题,read代码如下:
配置文件展示如下:
在params中用到一个时间方法,我觉得这个很普遍的,根据请求的时间动态获取,如图:
一个获取string类型本地时间,另一个是获取时间戳。
上面就是构建请求,接下来就是校验response,因为response返回都是json格式,我一直理解为字典(其实有点区别对于测试来说可以忽略),就可以校验key如果key不同就报警(目前也支持校验value,根据传参控制),之前的文章有写。
校验数据库这个对于post来说很重要,因为接口返回正常,如果没有写表跟假接口其实没啥区别,思路呢就是:先查库,发起请求,在查库,如果主键id变大了就认为是正确。这里面还有别的坑后面再说吧。
最后就是断言,封装目的也是捕获aseerterror异常,发送监控信息,这里面虽然继承unitest.testcase,但是使用是assertpy库的断言方法,之前文章写过了就不说了,
还就是code和msg枚举类型的使用,使用枚举也是为了不让case出现常量,如果code写死了,万一开发修改了,每一个脚本都要改,格式就是这种字典存放。
testsuit
中文名称测试套件,主要用于容器用于放置case,两个方法一个addtest()和makesuit(类名),一个是一个个运行,一个是整个测试类运行。如图:
testload
主要用于运行suite,上图中texttestrunner()方法就是,verbosity参数用于控制打印日志的等级,
入口函数用discover发现case,然后使用htmltestrunner运行suite来生成报告
大体就这些,还有其他逻辑方法就不写了,后面在说吧,写了3个小时了,也饿了,准备明天好好发挥面试。