固件(Fixture)是一些函数,pytest 会在执行测试函数之前(或之后)加载运行它们。我们可以利用固件做任何事情,其中最常见的可能就是数据库的初始连接和最后关闭操作。Pytest 使用文件 conftest.py
集中管理固件。不要自己显式调用 conftest.py
,pytest 会自动调用,可以把 conftest 当做插件来理解。
固件的作用是为了抽离出重复的工作和方便复用,为了更精细化控制固件(比如只想对数据库访问测试脚本使用自动连接关闭的固件),pytest 使用作用域来进行指定固件的使用范围。
在定义固件时,通过 scope
参数声明作用域,可选项有:
function
: 函数级,每个测试函数都会执行一次固件;class
: 类级别,每个测试类执行一次,所有方法都可以使用;module
: 模块级,每个模块执行一次,模块内函数和方法都可使用;session
: 会话级,一次测试只执行一次,所有被找到的函数和方法都可用。#conftest.py import pytest @pytest.fixture(scope='function') def func_scope(): pass @pytest.fixture(scope='module') def mod_scope(): pass @pytest.fixture(scope='session') def sess_scope(): pass
-
#test_scope.py def test_multi_scope(class_scope,sess_scope, mod_scope, func_scope): pass def test_multi_scope1(class_scope,sess_scope, mod_scope, func_scope): pass
执行pytest --setup-show test_scope,可以看到 sess_scope mod_scope只执行了一次,class_scope func_scope 在每个函数调用的时候都会被执行,引申作用,比如登录的 就可以写到func_scope中,保证每次脚本执行前都登录 数据库的链接 数据的初始化,可以放到sess_scope中,只需要做一次就可以。
对于类的作用域,就要用到pytest.mark.userfixtures,例子如下:
import pytest
@pytest.mark.usefixtures('class_scope')
class TestClassScope:
def test_1(self):
pass
def test_2(self):
pass
输出为:
此时我们改为func_scope,输出变为:
这种结果,和unitest中的setupclass 和setup 的用法就类似了。