pytest中的关联、参数化、日志及测试报告
一、关联
利用Python提供的fixture可以实现关联
1、实现步骤:
1.1、在case目录下,新建conftest.py文件,比如我们需要token,就在这个文件下定义一个公共的方法,调用登录接口并返回需要的token值(注:公共的方法一般不传入参数,返回值其实也是看情况可要可不要的)
@pytest.fixture(scope='function') #使用pytest的fixture把下面的方法变成公共方法
1.2、在需要使用的测试案例中,传入方法名,在需要用到关联的参数时,直接使用
2、面试题:接口与接口之间的关联是怎么处理的?
答:框架使用的是Python的fixture,定义一个公共的方法,通过去引用这个人方法名字的方式,来自动调用这个公共的方法,并且获得需要的返回值,例如token,以此来解决关联的问题
二、pytest中数据和脚本分离(即实现参数化过程)
1、什么时候需要参数化
实际项目中,接口地址,请求头,请求参数等,这些都称为数据,一般来说,需要将数据单独存放,例如放在数据文件里
参数化一般用于相同接口不同参数的使用,比如登录接口,有登录成功和登录失败
2、pytest参数化:
pytest的参数化主要有两种方式,第一种是使用pytest的parametrize实现参数化;第二种是使用数据文件
2.2.1、使用parametrize实现参数化
pytest参数化----parametrize理解:第一个参数是字符串,表示要给test_data()方法哪一个参数,即他俩是一样的,第二个参数给一个可序列的数据类型(即元组和数组),最后test_data()方法分别取序列的值执行
运行结果如下:
由此可以发现,现在的测试用例变成了四条,即可序列化元组(1,2,3,4)的长度,并且这时候的datas就是元组中的每个数据
2.2.1.1、使用parametrize编写第一个接口:
以此类推,可以编写多个接口
2.2.1.2、使用parametrize编写6个接口:
2.2.1.3、优化
优化,还可以在每个测试案例前,加上接口名称,如下:
2.2.2、使用数据文件实现参数化
2.2.2.1、数据文件准备
可以用txt、excle、yaml等文件,存放数据,初学者推荐excle,比较直观
以下以excle文件为例:一般会有id、title、url、headers、method、data、http_code、msg几栏,注意sheet页
2.2.2.2、在data文件夹里存放数据文件
选中data文件夹,右键----在文件资源管理器中显示,将刚才的excle文件粘贴到data目录下
由此,在vscode中,data文件夹下,就有个测试数据文件
在vscode中安装office viewer,就可以直接在vscode查看excle文件(注意安装后需要重启vscode),后续也可以直接在vscode里进行编辑
2.2.2.3、取数据
这就会涉及到Python中读取excle的知识,需要用到Python中的第三方包xlrd
①安装xlrd包:pip3 install xlrd==1.2.0(指定版本)
②在vscode的utils中导入含文件读写方法的py文件
注:vscode中复制绝对路径和相对路径:
Python读取excle代码:
import xlrd def read_excel(excel_path, sheet_name, skip_first=True): results = [] datas = xlrd.open_workbook(excel_path) # 打开excel获取excel的操作对象 table = datas.sheet_by_name(sheet_name) # 根据sheetname打开具体的页面 # start_row = 1 if skip_first is True else 0 if skip_first is True: # skip_first为true:从第二行取 start_row = 1 else: start_row = 0 # 循环读取excel for row in range(start_row, table.nrows): # [1,2,3,4,5,6] results.append(table.row_values(row)) return results # [ # [行1], # [行2], # [行3]... # ] # 防止其他文件导入exceltools时执行这些代码,测试代码 if __name__ == "__main__": a = read_excel(r'D:\小可爱\code\RCtest\data\人才管理系统.xlsx', "首页") print(len(a), type(a)) for i in a : print(i)
2.2.2.4、在编写测试用例的py文件中里导入exceltools
代码如下:
import os,sys sys.path.append(os.getcwd()) from utils.exceltools import read_excel
2.2.2.5、编写测试用例
首先,要特别注意读取excle返回的结果如下,是字符串类型的数据,需要eval一下,尤其注意token的值:'{"token":"user_login"}',可以发现,如果在excle数据文件中,如果直接写成{"token":user_login},那Python读取出来后,就会变成'{"token":user_login}',直接eval以下就能变成需要的字典格式,所以这里直接在vscode里修改一下
vscode中修改数据文件:
再次打印Python读取的excle文件,返回如下:
编写测试用例:
至此,实现了参数化的测试案例编写。
2.2.2.6、优化
观察可以发现,目前我们写的所有的测试案例,都是post方法的,一旦在excle表格中填写了其他类型的方法,那测试案例就会报错,因此,二次封装request方法很有必要(放在utils中)。
①封装代码如下:
import requests def http_request(url="", method="post", headers={}, json={}): if method == "post": return requests.post(url=url, headers=headers, json=json) elif method == "get": return requests.get(url=url, headers=headers, json=json) else: return False
②在测试案例中导入封装的方法:
import os,sys sys.path.append(os.getcwd()) from utils.httprequest import http_request
③修改原测试案例(method参数之前就传了-----先见之明):
三、pytest框架中的日志(用于记录完整的执行流程)
1、新建log文件夹
一个日志应该包含当前运行的所有的信息,例如在请求一个方法之后,我们需要看到请求地址是什么,参数是什么,返回是什么等等
2、在哪里记录日志?
一般在请求的方法那记录,即封装的request方法那
3、怎么记录日志?
引入Python的第三方包loguru :pip3 install loguru -i https://pypi.tuna.tsinghua.edu.cn/simple
4、具体使用
3.4.1、导入loguru包中的logger方法:
from loguru import logger
注:日志主要分为普通日志,报警日志和报错日志,如下所示:
3.4.2、将请求地址、参数和返回结果记录在日志里:
#接口地址及请求参数 logger.info("接口地址:{}".format((url))) logger.info("接口方法:{}".format((method))) logger.info("接口参数:{}".format((headers))) logger.info("接口请求头:{}".format((json))) #接口返回 logger.info("返回值:{}".format(res.text))
3.4.3、将日志保存在log文件夹下
代码如下:
logger.add("./log/lin.out",encoding="utf-8") #将日志记录在当前文件夹下的log文件加下的lin.out文件中,再次运行后log文件夹下会自动生成一个这样的日志文件
四、测试报告
进行自动化测试后,需要网页自动产生测试结果,可以用Python的第三方包allure
1、环境配置:
①java环境
②安装allure-commandline工具并配置环境变量
安装包安装,解压allure-commandline到任意文件夹下
复制该工具的bin目录,并添加到系统及用户变量的path下(保险起见系统及用户变量都添加)
③验证环境
验证allure-commandline是否安装成功:新建cmd,输入命令:allure
2、安装allure-pytest的第三方包:pip3 install allure-pytest -i https://pypi.tuna.tsinghua.edu.cn/simple
3、重启vscode,让allure-pytest生效
4、所有的测试用例开发完成后,在vscode终端执行pytest命令:pytest --alluredir=result(会自动创建一个result的文件夹)
5、将测试结果编译成测试报告
在vscode终端输入命令:allure generate result -o report --clean(含义:将result中的测试结果编译并生成测试报告且存放于report文件夹下,并且清除刚才的测试结果,report文件夹也会自动生成)
6、打开测试报告,在VSCOder终端中输入命令:allure open report(输入命令并执行成功后,会自动跳转网页)
自动跳转网页(可修改为中文显示):
注意:如果没有自动跳转网页,可以复制尖括号内的网址用谷歌浏览器打开,可能会存在兼容性的问题