1.初识fixture
fixture 的功能 主要包括以下三点:
- 传入测试中的数据集
- 配置测试前系统的初始状态,
- 为批量测试提供数据源
如何声明函数是一个fixture?
答: 用 @pytest.fixture() 装饰器
fixture 函数 在执行顺序上有什么不同?
答: pytest 首先会检测到 fixture 函数, 并在运行测试函数之前先执行fixture
,fixture既可以完成一些测试之前的工作(初始化数据),也可以返回数据
(测试数据集)给测试函数.
为了证明是否在测试函数之前执行,我们编写简单的代码看看
import pytestdef test_fixture(return_data):assert return_data==2
#@pytest.fixture()
def return_data():return 2
报错如下;
test setup failed
file D:\tasks_proj\tests\func\test_add.py, line 4def test_fixture(return_data):
E fixture 'return_data' not found
报 return _data not found , 我们 再 把fixture 装饰器注销删除掉,试试 结果
打印结果;
============================= test session starts =============================
platform win32 -- Python 3.6.6, pytest-4.0.0, py-1.7.0, pluggy-0.8.0
rootdir: D:\tasks_proj\tests, inifile: pytest.inicollected 1 itemtest_add.py . [100%]========================== 1 passed in 0.02 seconds ===========================
2.通过conftest.py 共享fixture
1.如果你的fixture 只是针对a.py 这个文件,你就需要把fixture 放在文件里
2.假如 A 文件夹 有 a.py,b.py,c.py 三个文件,如果三个文件共享fixture
就需要把 conftest.py (里面包含fixture)放在 A文件夹
原理是: confest.py 的作用域 是它同级的文件或者文件夹,以及同级文件夹里面的文件或者目录.
3.使用fixture 执行配置及销毁逻辑
我们下边利用fixture 进行 数据库的连接,并断开与数据库的连接.
代码如下:
import pytest,tasks
from tasks import Task@pytest.fixture() #fixture 装饰器
def tasks_db(tmpdir): # 这里用到了tmpdir 装饰器tasks.start_tasks_db(str(tmpdir),"tiny") #建立连接 yield #运行测试代码tasks.stop_tasks_db() #断开连接
测试代码如下:
import pytest,tasks
from tasks import Taskdef test_fixture(tasks_db): #一定要把fixture 放在参数里面,这个是对fixture的调用 new_task=Task("") #new 一个Task 对象task_id=tasks.add(new_task) # 获取对象的id assert isinstance(task_id,int)
运行结果如下:
如果想看 fixture 的执行过程,可以用 --setup-show 选项 ,我们试试
可以看出分为三部分,
1.SETUP , yield 之前的代码
2.测试函数
3.TEARDOWN yield 之后的代码