pytest
requests只是针对脚本(随便写,随便放的feel),即怎么用python去做接口请求
1、pytest
简介:python的第三方包,他的作用主要是用来做自动化测试框架的,测试框架的作用就是组织测试用例,生成测试报告(最终会以一个网页的形式展现出来)
环境搭建:以管理员身份运行cmd,输入命令:pip3 install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple
2、pytest搭建接口自动化框架
2.1、建立根目录
新建一个文件夹,直接到之前的项目同级下新建一个文件夹,取名pytesta(注意:和requests一样,这个名字一定不能叫pytest)
右键--->在文件资源管理器中显示--->新建一个文件夹
2.2、打开这个文件夹
这文件夹就放入接口自动化的全部东西
2.3、搭建pytest框架
搭建框架,肯定就绕不开一个观念:分层——按照用途的不同,把代码按文件夹区分开来
常见的分层:
case层:存放测试用例
utils层:工具代码层,存放工具的,比如说存放pymsql
report层:测试报告层
conf层:配置文件层
data层:数据层
了解了分层的概念之后,就需要建立分层了,在VScode中新建文件夹(注意点外边)
2.4、编写测试用例
接下来就开始了第一个测试用例的编写了(即接口自动化测试用例的编写)
接口测试用例的编写以py文件为模块,管理单个模块的所有case,他的py文件的命名规则是:test_数字_项目模块名.py(其中test是固定开头,数字是代表运行顺序)
例如:test_01_index.py,表示首页下边的所有接口,都放到这个文件里边
选中case,新建文件:
3、测谈网首页为例:一个测试case的编写离不开以下几个步骤:
3.1、首页的第一个case
① 抓包:
打开测谈网开发者工具,刷新首页,抓取接口
② 查找接口文档
然后查找接口文档,发现是首页获取轮播图的接口:
③ 按照接口文档中的数据在VScode中编写case:
#用方法来表示每个测试用例,这里需要注意方法名的命名,还是以test开头_数字_方法名 #例如获取首页轮播图的测试用例 def test_01_lbt(): u = "http://118.24.105.78:2333/get_title_img?num=3" #注意这个地址是抓包获取的,这块要参考接口文档,但是不能全看接口文档 h = {"Content-Type":"application/json"} res = requests.get(url=u,headers=h) #2、判断结果 assert res.status_code == 200 assert res.json()["status"] == 200 #第三步本来是应该判断数据库,但是这块不用判断,一般只有增加、修改、查询类的接口才需要判断 #写完之后,不能向之前那样运行,必须点上边导航栏终端——新终端,这样新建一个终端来运行,在终端下边输入pytest命令即可
用方法来表示每个测试用例,方法名的书写规则:test_数字_方法名,例如test_01_lbt():
方法里需要写对应的requests代码,所以需要在开头导入requests包:import requests,当然pytest也是需要导入的:import pytest
注意运行的时候,记得先保存
三个注意事项:文件的命名,方法的命名,文件记得保存,只有这些东西写对了,才能找到测试用例,怎样才能判断是否找到呢,运行界面上会有一个collected 数字 items
如果测试用例执行失败,会标记为红色的F,如下图所示:
如果结果报错,断言失败了,应该怎样去找原因呢?在该断言前面去打印:print(res.text),在运行时,有的时候打印店结果不会显示完全,那就在终端输入命令:pytest -s
3.2、首页第二个case:
也是这样分为三个步骤
① 抓取接口
② 在接口文档中查出是获取教程的接口:
③ 按照接口文档,在VScode中编写case(即将之前学的脚本整理到一个方法中去)
注意注意,这里一定要小心,和性能测试一样,我们通过抓包获取到的接口有的可能有传参数,这个时候一定要抓包的为准,而不是接口文档上的数据
#获取推荐教程的测试用例 def test_02_getcourse(): u = "http://118.24.105.78:2333/getcoures" h = {"Content-Type":"application/json"} res = requests.get(url=u,headers=h) assert res.status_code == 200 assert res.json()["status"] == 200
3.3、首页第三个case:
① 首先还是抓取接口:
② 在接口文档上找到对应的接口:
③ 在VScode里编写case:
#获取热门讨论的测试用例 def test_03_getquestions(): u = "http://118.24.105.78:2333/getquestions?num=3" h = {"Content-Type":"application/json"} res = requests.get(url=u,headers=h) assert res.status_code == 200 assert res.json()["status"] == 200
3.4、登录模块:
前面的抓包和查询接口文档这里就省略了,直接写测试用例:
由于登录会涉及到数据库查询的问题,所以会涉及到运用之前封装好的查询数据库的方法,即这里还会涉及到一个导包的问题:
如果是在同一级文件目录下:
如果要导入的包和自己处于平级的情况:
如果要导入的包和自己所在的包处于平级:
万精油方法:将整个根目录添加到环境变量里边去:
import os,sys sys.path.append(os.getcwd())
然后在以from 包名.文件名 import 方法/变量
注意:以后可以在每个test下边都添加一次,因为指不定哪一次就要用到它
3.4.1、关联:
有了登录之后,就会涉及到关联的问题
由于这里用到了管理测试用例的方法,不能像之前学requests的时候直接获取token值,因为会有作用域的问题,如果想要跨方法,跨文件引用,做好的方法就是把这个变量公共化,即将这个变量保存起来,可以保存到excel,也可以保存为txt文件,这里保存在文本文档中
3.4.1.1、封装Python读取文件的方法
接下来就涉及到了python的文件读写内容:在utils里封装一个文件:
#此处的file_path变量表示保存到哪个文件中,content为内容 def save_file(file_path='./conf/user_token.txt', content=''): """ 保存字符串到文件 """ #打开一个文件(刚才保存的那个目录),以w形式打开:文件写入,如果该目录下没有东西,就自动写入,有东西就替换掉 with open(file_path, 'w') as f: f.writelines(content) def read_file(file_path='./conf/user_token.txt'): """ 读取txt文件 """ #r:只读模式 with open(file_path, "r") as f: content = f.read() return content
3.4.1.2、导入封装好的读取文件的方法
这个只能使用万精油方法
使用:一定要在系统变量后边添加
3.4.1.3、获取登录后的token
在登录下边保存token值并运行,就会在conf中自动生成在filetools写的目录:
#保存token save_file(content=res.json()["data"]["token"])
3.4.1.4、使用获取到的token
以新增文章为例(会用到token值),直接在头文件里使用read_file()方法就可以读取出获取到的token值了
#新增文章case def test_01_new_article(): u = "http://118.24.105.78:2333/article/new" h = {"Content-Type":"application/json","token":read_file()} d = {"title":"接口自动化基础","content":"这就是接口自动化的小基础","tags":"这是测试哟","brief":"这篇文章不需要简介","ximg":"dsfsdf.jpg"} res = requests.post(url=u,headers=h,json=d) # print(read_file()) assert res.status_code == 200 assert res.json()["status"] == 200 # #3、数据库查询 # print(res.text) #不知道数据库该如何查询就可以先把结果打印出来,然后再判断 aid = res.json()["data"]["articleid"] sql = "select * from t_article where id = {}".format(aid) assert len(query(sql)) != 0