目录
- 3.1 通过 conftest.py 共享 fixture
- 3.2 使用 fixture 执行配置及销毁逻辑
- 3.3 使用 --setup-show 回溯 fixture 的执行过程
- 3.4 使用 fixture 传递测试数据
- 3.5 使用多个 fixture
- 3.6 指定 fixture 作用范围
- 3.7 使用 usefixtures 指定 fixture
- 3.8 为常用 fixture 添加 autouse 选项
- 3.9 为 fixture 重命名
- 3.10 Fixture 的参数化
- 3.11 参数化 Tasks 项目中的 fixture
fixture 是在测试函数运行前后,由 pytest 执行的外壳函数,其中代码可定制,主要包括:
- 定义传入测试中的数据集
- 配置测试前系统的初始状态
- 为批量测试提供数据源
3.1 通过 conftest.py 共享 fixture
fixture 可放在单独的测试文件中,也可在放在某公共目录下的 conftest.py 文件中供所在及其子目录下的多个测试文件共享
3.2 使用 fixture 执行配置及销毁逻辑
fixture 函数会在测试函数之前运行,但若含 yield
,就会在 yield
处停止,转而运行测试函数,测试函数执行完毕后再回到 fixture,继续执行 yield
后面的代码
fixture 中 yield 之前的代码 --> 测试函数 --> fixture 中 yield 之后的代码
- 即:fixture 中 yield 之前的代码 = setup;fixture 中 yield 之后的代码 = teardown
- 注意:无论测试过程中发生什么,yield 之后的代码都会被执行
3.3 使用 --setup-show 回溯 fixture 的执行过程
使用 --setup-show
选项可展示测试过程中执行的是什么,以及先后顺序
3.4 使用 fixture 传递测试数据
除了堆栈跟踪的内容,pytest 还给出了具体引起 assert 异常的函数参数值
- fixture 作为测试函数的参数,也会被堆栈跟踪并纳入测试报告
若 assert 异常(或任何类型的异常)就发生在fixture,仍可正确定位到,且报告为 ERROR(而不是 FAIL)
3.5 使用多个 fixture
使用 fixture 的优势在于:用户在编写函数时可以只考虑核心测试逻辑,而无需考虑测试前的准备工作
- 注释中写 GIVEN/WHEN/ThHEN,fixture 中多写 GIVEN,可增加测试的可读性和可维护性
3.6 指定 fixture 作用范围
- fixture 包含一个叫
scope
的可选参数,用于控制执行配置和销毁逻辑的频率,有4个待选值:- function(默认):每个测试函数运行一次
- class:每个测试类运行一次
- module:每个模块运行一次
- session:每次会话运行一次
scope
参数是在定义而非调用 fixture 时定义的,即:使用 fixture 的测试函数无法改变其作用范围- fixture 只能使用同级别即以上的 fixture,如:类级别的 fixture 可使用类、模块和会话级别的 fixture,但不能使用函数级别的 fixture
3.7 使用 usefixtures 指定 fixture
使用 fixture,除了以上在测试函数参数列表中指定 fixture 外,也可以用 pytest.mark.usefixtures('fixture1', 'fixture2')
标记测试函数或类
- usefixtures 参数列表中的 fixture 为字符串,即需要加引号
- usefixtures 对测试函数来讲意义不大,但非常适合测试类
- usefixtures 不能使用 fixture 的返回值,但在测试方法中添加 fixture 参数的方式可以
3.8 为常用 fixture 添加 autouse 选项
autouse=True
可使作用域内的测试函数都运行该 fixture,而不需要指名调用
3.9 为 fixture 重命名
可以使用 @pytest.fixture()
的 name
参数对 fixture 重命名
- 重命名后原名不可用
pytest 的--fixtures
选项可列举所有可供测试使用的 fixture,包括重命名的
3.10 Fixture 的参数化
使用参数化 fixture,每个使用该 fixture 的测试函数都可以被运行多次
- 未指定 id
- 以列表指定 id
- ids 参数也可以被指定为一个函数,供 pytest 生成 task 标识
3.11 参数化 Tasks 项目中的 fixture
之前 Tasks 项目用的数据库都是 TinyDB,现改为既可使用 TinyDB,也可使用 MongoDB
- fixture 装饰器中添加
params=['tiny', 'mongo']
- 将
request
添加到 temp_db 参数列表中 - 将 db_type 的值设定为
request.param
,避免直接使用 ‘tiny’ 或 ‘mongo’