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(输入命令并执行成功后,会自动跳转网页)
自动跳转网页(可修改为中文显示):
注意:如果没有自动跳转网页,可以复制尖括号内的网址用谷歌浏览器打开,可能会存在兼容性的问题
原文地址:https://www.cnblogs.com/bzbz/p/17218935.html
- Asp.Net无刷新上传并裁剪头像
- 用泛型的IEqualityComparer<T>接口去重复项
- python与office(一)
- Asp.net 后台添加CSS、JS、Meta标签(帮助类)
- 分享一下cookies操作(增、删、改、查)小经验
- [Silverlight 4 RC]WebBrowserBrush概览
- 一个例子理解C#位移
- WCF后续之旅(3): WCF Service Mode Layer 的中枢—Dispatcher
- silverlight 2 Random 随机数解决方案
- 开发中巧用Enum枚举类型
- Jquery 事件冒泡
- Vue2的单元测试与调试技术
- silverlight beta 2 将在本周末发布.
- [Silverlight 4 RC]WebBrowser概览
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 有赞 GO 项目单测、集成、增量覆盖率统计与分析
- RSA--通过模和指数加密模板--无填充
- 有赞发号器多机房方案
- python爬虫以及后端开发--实用加密模板整理
- APP脱壳方法三
- Flink Checkpoint 原理流程以及常见失败原因分析
- Docker原理之 - OverlayFS设计与实现
- 有赞零售跨平台打印库方案
- [Go] Golang练习项目-GO语言实现快速排序-第一个数作为基准更容易理解
- 有赞移动基础设施建设的实践和思考
- 大数据理论篇HDFS的基石——Google File System
- 6. 二十不惑,ObjectMapper使用也不再迷惑
- 接口自动化对比工具实践
- 什么?Java9这些史诗级更新你都不知道?Java9特性一文打尽!
- 利用 Arthas 精准定位 Java 应用 CPU 负载过高问题