【一套搞定接口自动化-01】从新建工程开始,小白直接上手

从这里开始介绍:接口自动化测试的封装代码

使用的语言:python

兼容性:yaml文件、json数据格式


开始

在这里插入图片描述

一、封装接口

首先我们先建个包目录放测试用例
然后写个简单的用例,比如:登录
在这里插入图片描述
从返回结果来看,我们成功请求了登录接口,服务器返回了token信息
这就是一个简单的正向接口用例了
至于自动化,不过是把重复的东西给它封装起来,方便用,也方便改


现在想一下,我们测试接口肯定不是只测试一个吧?不只是post这一种请求吧?
OK,我们现在再请求一个接口,比如:获取用户信息
在这里插入图片描述
请求是发送成功了,也收到响应了,但是返回的结果提示请重新登录
这种错误在这里就表示,你没有权限去获取用户的信息
那我们想一想为什么会这样?
其实很好理解,下面的只是请求了获取用户信息的接口,但是没有给服务器说明要获取哪一个用户的信息

在这里的身份识别,其实是用的令牌,也就是token
上面的接口登录成功了,服务器会返回一个token,用来识别你的身份
如果你要获取用户信息,你就需要把token也传过去,服务器才知道你的身份,才能给你返回对应用户的信息
OK,我们试一下
在这里插入图片描述
你看,这次返回就对了吧,里面还有用户昵称这些信息,你不给服务器亮出令牌
它肯定:你谁啊?你要干嘛?对不起,再见。
要是不给令牌,它就给你信息,那不是随便一个人都能获取你在这个服务器上面的用户信息了?


OK,现在回想一下这个获取用户信息的接口,就会发现两个问题
1、请求方式不只有post,还有get,当然还有put、delete之类的,那我们可不可以通过调用一个方法
统一就请求了呢?
2、下面的接口,需要用到登录接口返回的token信息,那能不能让这个自动执行呢?

下面我们先解决第一个问题:封装接口
我们先来看看get请求,它是怎么实现的
在这里插入图片描述
在这里插入图片描述
现在我们看到,它返回的其实是 request 方法,那我们再看看request这个方法是怎么实现的
在这里插入图片描述
OK,最后我们看到原来是通过session.request,这个方法实现的
get方法最终是通过session.request来实现,那我们再看看其他方法呢?
在这里插入图片描述
原来所有的请求都是通过request方法实现,那request方法又是通过session.request方法实现
那我们在发送请求的时候直接调用session.request方法不就好了?
OK,我们试一下


首先在项目下,新建包目录common,用来存放公用的方法
在这里插入图片描述
现在我们在用例里边就调用这个方法了
在这里插入图片描述
OK,现在想一下,这个url前面是不是内容都一样啊?我们可不可以将url前面的部分作为一个全局变量之类的配置信息存起来,然后在发送请求前去读取配置信息啊?
这样就不用每次写url路径的时候写一大串了


那我们在目录下,新建config.yml文件,用来存放配置信息,这里我们就存一个基础路径吧
在这里插入图片描述
现在配置信息有了,我们是放在其他文件的,这里呢,是一个yaml文件。
我们需要把yaml文件的内容读取出来
因此,在上面的common公用方法里面新增加一个读取yaml文件的方法
在这里插入图片描述
我们现在把配置信息读出来了,可以看出来是个字典,那字典用key取值就OK了
现在想一下,配置信息肯定不只url这样一个
所以我们要获取某个值的时候,可以指定键
在这里插入图片描述
这里默认是取测试环境的基础路径,暂时先这样
值取出来了,我们就需要在发送请求之前处理好
在这里插入图片描述
简简单单搞定,甚至连请求方法和请求头都考虑了一下
在这里插入图片描述
这里我们把方法也提出来,然后运行
在这里插入图片描述
然后就报错了,说找不到config.yml文件的位置
根据提示我们当然能看出来,路径错了,但是我们读取yaml文件的路径是对的啊,这里报错了
我想是时候搞个程序执行的入口了,项目下新建一个run.py文件,以后执行用例就运行它了
在这里插入图片描述
运行出来倒是没报错了,但是看不到具体的信息啊,就说运行了一个文件
在这里插入图片描述
这样当然不太好
我们还是想分开运行用例,然后查看成功还是失败
所以,就需要写一下pytest运行配置了
项目下新建pytest.ini 文件
在这里插入图片描述
然后再运行 run.py文件
在这里插入图片描述
接下来,我们可以处理个小东西,让请求方法,大小写都能成功
在这里插入图片描述
简简单单
在这里插入图片描述
好,那么到这里,貌似封装请求就有点像那么回事了,实际上呢,才刚刚开始
接口关联还没做呢?怎么关联啊?

我想收到第一个接口的数据后,我们还是给它搞个yaml文件,存进去
然后后面的接口我们再取出来

OK,我们试一下
在这里插入图片描述
又是yaml文件,所以我们在处理yaml的公用方法里面增加方法
在这里插入图片描述
写入yaml文件的方法,我们倒是OK了,但是问题来了
怎么判断这个用例它要不要提取数据呢?
并不是所有的用例都需要提取数据的吧?
那怎么区分呢?
OK,我们可以先单独处理一下
在这里插入图片描述
运行看看效果
在这里插入图片描述
存进来了,但是我们下一个接口还是要读取,所以我们又需要一个读取数据的方法
跟我们读取config.yml这个方法差不多,只不过这次我们读extract.yml这个文件
在这里插入图片描述
在用例调用这个方法,运行看看效果
在这里插入图片描述
貌似我们可以做到接口关联了,但是问题随之而来
首先,我们存入数据的时候,是不是自己取的名字,然后就存了,不可能每个需要提取变量的用例,我们都自己手写吧?
多麻烦,一点儿都不自动化
然后,我们读数据的时候,是不是也是手动去调用方法的,也没有自己判断是不是要读取数据
最最最重要的是,我们的数据是不是都写在用例里面的,那接口测试,一个接口有时候几十个用例,你得写多少数据啊?

所以我们可不可以借鉴HTTP runner的思想,把用例的数据都放在yaml文件中,然后我们只需要读取数据就OK了,到时候我们就改改数据文件就OK了,其他的都让它自动判断,要不要提取,要不要读出来啥的

OK,那接下来我们试试把测试用例数据放在yaml文件中
在这里插入图片描述
接下来我们肯定要有个方法来读取用例中的数据
在这里插入图片描述


数据有了,读取数据的方法也有了,那我们就还需要把读取的数据进一步处理,然后发送请求就OK了
所以我们在封装请求的方法中,新增一个处理数据的方法,我们需要把数据处理好才能发送请求
所以,不能用例里面也不能直接调用send_request方法了
让数据处理完毕后,自己调用发送请求的方法
在这里插入图片描述
用例里面也需要调整一下调用的方法
在这里插入图片描述
这里的步骤稍微有点复杂:
总的来说是这样的5步:
1、把测试用例的数据写在yaml文件中——test_user_login.yml
2、定义一个读取测试用例数据的方法——yaml_util.py文件新增read_testcase_yaml方法
3、将读取的数据作为参数传递给分析用例数据的方法——使用装饰器@pytest.mark.parametrize(‘case_info’, read_testcase_yaml(‘/testcases/test_user.yml’))
4、分析数据后调用处理数据的方法——request_util.py文件新增analysis_yaml方法
5、处理数据后发送请求——analysis_yaml方法调用以前的send_request方法
6、修改用例中的调用——将直接调用send_request方法改为调用analysis_yaml方法


接下来还有事没做,我们只是把用例的数据换成yaml文件来存储了,然后读取出来,发送请求
我们还没做接口关联呢?
我们先考虑提取数据:
思路是这样的:
我们在用例数据也就是那个yaml文件中,用一个关键字来表示提取数据,我们读用例数据时,判断有这个关键字就表示需要提取数据

我们试一下:
在这里插入图片描述
OK,要提取的关键字有了,提取的数据名也有了,就差值了
接下来我们判断有这个关键字,就进行提取,而提取操作是需要收到响应再进行
而这个关键字也是包含在yaml数据信息里面,传递给analysis_yaml这个方法的
我们就可以在analysis_yaml这个方法里面,收到数据后去判断是否需要提取变量

OK,我们试一下
在这里插入图片描述
在这里使用了正则提取和json提取,看yaml用例文件里面是怎么写的
在这里插入图片描述
那我们打开存放变量的yaml文件看一下子,存入是没问题了
在这里插入图片描述
OK,我们可以看到,这个文件并不会清掉上一次存的变量,那我们肯定是希望存最新的啊
token有时效的,虽然它用还是用最近存的,但这看着也太复杂了
接下来我们在处理yaml的公用方法里面,新增一个清空的方法
在这里插入图片描述
so easy,问题是我们怎么让他在合适的时候自动执行呢?
不知你们是否听过一个叫 conftest 的文件,它可以帮我们做这个事情
我们在项目下,新建这个文件,然后我们这样…
在这里插入图片描述
这里呢,这个文件会在每次调用session后自动执行,捋一捋就是这样:
我们调用 session.request 发送请求》》清空数据》》获得响应》》存入数据
嘿,那不是每次都存入新的数据了
奈斯,我们运行试一下
在这里插入图片描述
好了,到这里,我们接口关联存数据,算是差不多能存了
接下来我们还要取数据
那取数据,我们肯定也是要在用例里面取原数据,然后判断是否需要读接口提取变量的数据


分割一下,接下来我们取数据
思路是这样:我们在用例里面用符号标志一下需要读接口数据的数据,听起来有点绕
在这里插入图片描述
先发布了吧,明天有时间再继续更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值