本篇章为pytest的学习过程,仅是个人的观点
1、unittest和pytest的介绍
核心对比内容如下:
1、安装与版本管理:
- unittest:作为 Python 的内置标准库,它无需额外安装,但无法灵活升级或降级
- pytest:是一个第三方库,需要手动安装,可以自由指定、升级或降级到任何需要的版本
2、代码风格与易用性:
- unittest:代码风格被描述为类似 Java 语言(需要创建类、继承、使用特定断言方法,代码稍显繁琐)
- pytest:代码风格更 "Pythonic",语法更简洁,可以用简单的 assert 语句进行断言,减少了大量的样板代码
3、插件生态与扩展性(核心优势):
- unittest:插件生态非常有限,扩展能力弱
- pytest:拥有一个极其强大的插件生态,覆盖了报告、异步、Web测试、性能等方方面面,扩展性极强
4、兼容性与维护:
- unittest:由 Python 官方直接维护,是官方标准
- pytest:一个关键优势是它完全兼容用 unittest 编写的测试用例,使得从 unittest 迁移到 pytest 的成本非常低
2、如何快速上手?
需要安装pytest:pip install pytest
升级到最新版:pip install pytest -u
对于pytest来说有三种启动方式:
1、命令:需要在终端上输入pytest【推荐使用】
2、代码:需要新建一个main.py的文件,在main里面启动【推荐使用】
import pytest
pytest .main()
3、鼠标【不推荐】:这种操作方式是由pycham提供的,不是pytest提供的
3、如何看懂结果?
1、执行环境:版本、根目录、用例数量
2、执行过程:文件名称、用例结果、执行速度
3、失败详情:用例内容、断言提示
4、整体摘要:结果情况、结果数量、花费时间
用例结果的缩写:
. : passed (通过)
F: failed (失败:用例执行时报错)
E: error (出错:fixture执行时报错)
s: skipped (跳过)
X: xpassed (预期外的通过:不符合预期)
x: xfailed (预期内的失败:符合预期)
4、用例规则
分为两部分:用例发现规则,用例内容规则
1、用例发现规则:测试框架在识别、加载用例的过程
pytest的用例发现步骤:
1、遍历所有的目录,例外:venv,.开头的目录
2、打开python文件,test_开头或者_test结尾
3、遍历所有的Test开头类
4、收集所有的test_开头的函数或者方法
2、用例内容规则:pytest 8.4增加了一个强制要求
pytest对用例的要求:
1、可调用的(函数、方法、类、对象)
2、名字test_开头
3、没有参数(参数有另外含义)
4、没有返回值(默认为None)
参数self:函数本身的变量
5、配置框架
配置可以改变pytest的默认规则:
- 命令参数
- ini配置文件
所有的配置方式,可以一键获取:pytest -h
配置文件可以使用pytest.ini来命名,一般介绍有哪些配置,分别使用什么方式等
常用的参数有:
- -v:增加详细程度
- -s:在用例中正常的使用输入输出
- -x:快速退出,当遇到失败的用例停止执行
- -m:用例筛选
6、标记mark
标记可以让用例与众不同,进而可以让用例被区别对待
1、用户自定义标记:用户自定义标记只能实现用例筛选
操作步骤:
- 先注册
- 再标记
- 后筛选
class TestAdd: @pytest.mark.api def test_int(self): res = add(2, 3) assert res == 5 @pytest.mark.web def test_str(self): res = add("hello", "world") assert res == "helloworld" @pytest.mark.ut def test_list(self): res = add([1, 2, 3], [4, 5, 6]) assert res == [1, 2, 3, 4, 5, 6]运行的时候可以使用:pytest -m ut来筛选特定的运行结果
2、框架内置标记
框架内置标记为用例增加特殊的执行效果
和用户自定义标记区别:
1、不需注册,可以直接使用
2、不仅可以筛选,还可以增加特殊效果
3、不同的标记,增加不同的特殊效果
- skip:无条件跳过
- skipif:有条件跳过
- xfail:预期失败
- parametrize:参数化
- ousefixtures:使用fixtures
7、数据驱动测试参数
数据文件,驱动用例执行数量,内容
data.csv文件:
a,b,c
1,1,2
2,3,5
3,3,6
4,4,7
@pytest.mark.ddt @pytest.mark.parametrize( "a,b,c", read_csv("../data.csv") ) def test_ddt(self, a, b, c): res = add(int(a), int(b)) assert res == int(c)8、夹具fixture
夹具:在用例执行之前、执行之后,自动运行代码
- 之前:加密参数/之后:解密结果
- 之前:启动浏览器/之后:关闭浏览器
- 之前:注册、登录账号/之后:删除账号
1、创建夹具fixture:
@pytest.fixture def f(): # 前置操作 yield # 后置操作
1、创建函数 2、添加装饰器 3、添加yield关键字
2、使用fixture:
- 在用例的参数列表中,加入fixture名字即可
- 给用例加上usefixtures标记
def test_1(f): pass @pytest.mark.usefixtures("f") def test_2(): pass从Python的角度来看,函数中可以有多个yield,但是pytest中只能有一个yield
3、高级用法:
1、自动使用
2、依赖使用:
- linux:使用linux进行编译
- git:使用git进行版本控制
- fixture:使用fixture进行前后置自动操作
3、返回内容:接口自动化封装:接口关联
4、范围共享:
- 默认范围:function
- 全局范围:session
- 使用conftest.py
9、插件管理
pytest插件生态是pytest特别的优势之处
插件分成两类:
- 不需要安装:内置插件
- 需要安装:第三方插件
插件的使用方式:
- 参数
- 配置文件
- fixture
- mark
10、常用的插件
1、pytest-html
用途:生成HTML测试报告
安装:pip install pytest-html
使用:--html=report.html --self-contained-html
2、pytest-xdist
用途:分布式执行
安装:pip install pytest-xdist
使用:-n N(N指的是次数)
只有在任务本身耗时较长,超出调用成本很多的时候,才有意义
3、pytest-rerunfailures
用途:用例失败之后,重新执行
安装:pip install pytest-rerunfailures
使用:-reruns 5 --reruns-delay 1
pytest 有140+插件:https://docs:pxtest.org/en/stable/reference/plugin_list.html
11、企业级测试报告
allure是一个测试报告框架
安装:pip install allure-pytest
配置:--alluredir=temps --clean-alluredir
生成报告:allure generate -0 report -c temps
allure支持对用例进行分组和关联(敏捷开发术语)
- @allure.epic :史诗 / 项目
- @allure.feature:主题 / 模块
- @allure.story:故事 / 功能
- @allure.title:标题 /用例
@allure.epic("自动化") @allure.feature("测试用例") @allure.story("测试用例1") @allure.title ("测试用例1标题") @pytest.mark.ut def test_a(): pass @allure.epic("自动化") @allure.feature("测试用例") @allure.story("测试用例2") @allure.title("测试用例2标题") @pytest.mark.ut def test_b(): pass12、Web自动化测试
pytest仅进行用例管理,不会控制浏览器,需要借助新的工具:Selenium
安装:pip install pytest-selenium
同时也提供不使用Selenium插件的方法:
@pytest.fixture() def selenium(): d = webdriver.chrome yield d d.quit()
13、测试框架要封装什么
封装:
- 隐藏细节
- 增加功能
- 优化功能
接口自动化封装:
- 使用yaml作为用例,降低自动化门槛
- 自动请求接口、断言接口
- 自动在日志记录HTTP报文
- 自动生成allure测试报告
14、yaml文件格式
一句话:YAML完全兼容ISON格式,并且支持Python相似写法
重点:
- YAML完全兼容ISON
- 是数据格式,不是变成语言
- 像Python一样容易编辑和阅读
编写yaml文件
1、#作为注释符号
2、缩进:使用2个空格
3.、成员表示
- - 表示列表成员
- :表示字典成员
4、完全兼容ISON
数字: -123 字符串: - "hello world" 空值: - null 列表: - [1, 2, 3] 字典: - {name: "Alice", age: 25}加载yaml文件
import yaml def read_yaml(file_path): f = open(file_path, encoding="utf-8") # 打開文件 s = f.read() # 读取文件内容 data = yaml.safe_load(s) return data
15、接口自动化测试
设计测试用例
1、名字:请求首页数据接口
2、标记【可选】
3、步骤
- 请求接口:GET https://www.baidu.com
- 响应断言:status_code ==200
- 提取变量:json() ['code']
1、请求接口
使用外部工具:requests
安装:pip install requests
从HTTP协议抓包角度,请求由三部分组成:
- 行:方法+地址(必填)
- 头:请求头(键值对)
- 体:参数内容
# 请求行 url='https://baidu.com' # GET方法 requests.get(url) # POST方法 requests.post(url) # 任意方法 requests.request('MOVE',url)2、断言相应
- 响应里有什么
- 响应如何断言
从HTTP协议抓包角度,响应由三部分组成:
- 行:状态码
- 头:响应头(键值对)
- 体:响应内容
3、变量提取
基本原则:
- JSON:JSONPATH
- HTML:XPATH
- 字符串:RE
进一步完善:
1、YAML用例测试文件上传?
2、YAML用例进行数据去掉测试?
3、YAML用例进行自定义的断言
4、YAML用例进行数据库查询?