写在总结前的话,自动化用例脚本是根据你手工的用例脚本,用代码代替手工执行的,不是说随便给你个接口,啥都不知道,就瞎JB开始写脚本了。
写之前先抛出几个问题:
1:接口自动化测试框架分为几层?
2:如何解决接口数据依赖问题,请举例说明?
3:如何做到数据和代码分离?
4:如何实现用例可配置(可配置指的是实现运行全部用例和只运行部分用例)?
5:在接口自动化中有遇到过什么样的问题?
6:如何实现参数化,请举一些实例?
7:requests中,传递参数params,data,json的区别是?
8:项目中有没有加入日志信息,怎么实现的?
9:有没有做过接口加密之类的接口?
10:什么时候需要对数据库进行效验?
11:接口测试发现哪些bug?
12:接口用例运行多长时间?
13:jenkins持续集成如何使用的?
1框架分层:
自动化测试框架分为5层(配置层,脚本层,数据层,测试报告层,驱动层)接口项目工程规划大致可分为几类,首先是测试结果类,比如说叫test_rusult,里面存放一些比如说,日志文件,测试报告。然后是测试用例testcase,里面分模块存放测试用例。接下来是公共方法类,比如说叫public,或者是tools。里面比如说存放一些,读取excel数据的方法,发送http请求的方法,收集log日志的方法,发送邮件,操作数据库等方法。还有就是配置文件类,比如说叫config,里面存放一些比如说,指定运行部分用例的配置文件,连接数据库的配置文件。最后是写一个run方法,运行所有的用例。
2数据依赖:
数据依赖有这几种解决方式:
第一种,global全部变量的方式解决,将你需要用到的依赖数据提取出来,升他为全局变量。比如说在APP接口测试里面常用到token做鉴权效验,用一个全局变量来处理依赖的数据,比如登录后返回token,其它接口都需要这个token,那就用全局变量来传token参数。全局变量有其局限性,不能夸.py文件调用。
具体参考我这篇博客:https://www.cnblogs.com/xiamaojjie/p/12031265.html
第二种,放setUp里面,将接口有依赖的数据提取出来,放到setUp里面,每次运行用例前,都会首先自动运行setUp函数。
具体参考我这篇博客:https://www.cnblogs.com/xiamaojjie/p/12034422.html
第三种,反射实现。首先定义一个类,比如说获取cookie,定义一个GetCookie,里面的类属性给他一个初始值,比如说cookie=None。然后用python里面的setattr函数给刚才定义cookie值为空的属性赋值。最后再用getattr函数取出里面的cookie。个人感觉这种方式实现比较好,也不用担心cookie有效期的问题。
具体参考我这篇博客:https://www.cnblogs.com/xiamaojjie/p/12032199.html
3数据和代码分离问题:
这个问题,在我看来是仁者见仁,智者见智吧。只要不答写在脚本里面就没啥问题。为什么要做数据和脚本分离,无非就是可维护性高,可拓展性,减少依赖。这里说4种解决方案。
第一种:写在excel表格里,像这种主要是读取excel数据有点麻烦,常用的用来读取excel的第三方库有openpyxl,xlrd等。当然读取excel数据最好用的还是用来做数据分析的pandas模块,不用写那么多for循环。大家可以了解一下,链接如下:
https://www.cnblogs.com/liulinghua90/p/9935642.html
第二种:数据存放到yaml文件里,一个模块或者是一个功能写一个yaml文件,最后写个读取yaml文件的公共方法就行了。yaml格式的文件比较简单,大家可以学下。
第三种:存放在数据库里面。听同事说的,具体以哪种形式存还没了解过。
最后种:数据存放在json文件里。
4用例可配置问题:
首先为什么要做用例可配置:举个场景,你要吧你写的脚本给你同事运行,假设你同事不懂代码,或者是刚来没多久,还没看懂你的代码。这个时候你要叫人家帮你执行下用例,人家肯定2眼一懵逼啊!这个时候配置文件的作用就来了,你只需要将你的配置文件简单说下,人家就能执行,比如说你的配置文件是这样写的,写了一个按钮的变量,给的默认参数是all执行全部,但是还可以传列表,假设你设计时是根据你的用例编号,或者模块名,判断用例编号,或者模块名是否在这传的列表里面,从而执行选定的用例。达到用例可配置的效果。
具体参考我这篇博客:https://www.cnblogs.com/xiamaojjie/p/12068540.html
5接口测试中遇到的问题:
问题一:
我在接口测试中遇到最多的问题就是,接口测试数据类型变化的问题,首先我最开始写在pycharm里面的数据是字典格式,写好之后把他copy拿到excel里面去,读取出来就变成字符串了,刚开始还没发现这个问题,还以为是我数据没写对,后面type了一下,才发现是字符串。最后解决主要是用eval函数给他进行强转一下就好了。这里在补一个读取excel数据遇到的奇葩问题吧,最开始用的是xlrd模块,读取int整数到pycharm里面变成float小数了,后面百度了一下发现是这个模块的问题,记得当时解决是在整数的前面加上一个英文引号就好了。
问题二:
接口测试中断言精确度的问题,这个问题我认为很重要,关系到用例是否正确与否,是否出现BUG。断言我主要是用的unittest里面的assertEqual判断预期和实际是否相等,assertIn,判断返回数据是否包含。但是有时候返回数据并没有一个太精确的唯一值,像这种就不好用assertEqual判断是否相等。 只能用assertIn,判断返回数据是否包含,像这种只能是多写几个断言,断言响应文本里面的值。如果要举例,可以举个搜索商品的例子,返回的商品数据比较多,而且商品本身也会有上架下架之类的变动,确实不好做断言。
问题三:
有一次开发人员那边改了某个接口字段,没通知到测试这边,导致用例报错。这里要举个实际的例子
6实现参数化:
测试每天测试东西,除开页面而言,其本质就是数据驱动测试,无论是正常的场景也好,异常的场景也好,其实就是数据在发生变化。众所周之,使用unittest框架编写测试用例不能定义形参在方法里面,在我使用unittest做接口测试过程中,参数化主要是用的ddt这个模块实现的。ddt模块最常用的有3个常用函数ddt,data,unpack。ddt用来装饰类,data用来接收数据,uppack用来拆包。调用公共方法,读取到excel数据,将数据赋值给一个变量给data装饰器使用,在方法里面用一个参数接收装饰器里面的数据,data装饰器会自动对这个函数进行拆包,比如说,从excel里面读取是一个列表嵌套字典的数据类型,经过data拆解后就会变成字典,最后根据key取值,发起http请求。
7params,data,json的区别
在get请求中使用params参数,会自动把参数添加到url后面
data传递的是content-type:application/x-www-from-urlencoded,表单形式的数据
json传递的是content-type:application/json,json格式的数据
8日志信息收集
给用例添加加日志信息,主要是用的logging这个python自带模块,根据日志的不同级别,info,debug,warning,error,critical针对性的写了一个日志类,设置好日志输出格式,将日志指定保存到.txt结尾的文本文件里面,像一些常见的打印信息,就用info收集,在可能会出现错误的try-except结构中就用error收集错误信息,方便定位问题。
9接口加密
参考我之前写的sign签名,主要说下加密的大致规则,实现逻辑就行了。链接如下:
https://www.cnblogs.com/xiamaojjie/p/11749968.html
10数据库效验
比如说充值,提现,金额有无相应的增加和减少,都需要对数据库进行效验。
11接口测试发现哪些bug
用了一个淘宝授权过期的账号,去请求购买商品的接口,通过接口正常购买成功,但是订单归属却丢失了,说明接口未对淘宝授权过期的过期的用户做效验
12接口用例运行多长时间
7条用例的运行时间约为1.79秒,70条就是18秒,490条就是2分06秒,依此类推。
13jenkins持续集成如何使用的
Jenkins我是部署到tomcat里面的。主要是把jenkins的.war包放到了tomcat的webapps目录下。Jenkins我主要用来跑测试用例和搭建环境。一般把用例部署到了Jenkins上,你可以选择手动构建和轮询构建。轮询构建一般在新版本刚发布或者刚上线,项目不太稳定就让他每天10点跑一次,跑完之后去看Jenkins发送的邮件报告。项目稳定后,或者在回归测试的时候,就选择自己手动构建。Jenkins搭建环境主要用到git插件去代码仓库拉取最新的代码,然后自己打包。Jenkins常用的插件有,git插件,发送邮件的插件。