fixture功能
fixture作用
在unittest中我们可以使用setup和teardown进行初始化操作,但是在pytest中我们一般不会去使用setup和teardown进行初始化操作,而是使用fixture进行被测对象的初始化1,fixture在使用过程中我们主要关注它的作用域和参数化的作用,下面就讲解这两种使用规则
fixture基本使用
import pytest
@pytest.fixture()
def some_data():
return 42
def test_some_data(some_data):
assert some_data ==42
#运行结果
"""
plugins: allure-pytest-2.9.45, Faker-13.15.1, json-report-1.5.0, metadata-2.0.2
collected 1 item
test_tttttpython.py
SETUP S _session_faker
SETUP F some_data
test_tttttpython.py::test_some_data (fixtures used: _session_faker, request, some_data).
TEARDOWN F some_data
TEARDOWN S _session_faker
================ 1 passed in 0.12s ===============
"""
解释:
- 被测函数执行前后运行的操作,使用@pytest.fixture()装饰器进行修饰,标识这个函数是被测函数的初始化操作
- 被测函数中参数传递fixture修饰的函数的函数名,可以在pytest框架中自动执行返回函数的返回值
- 使用pytest --setup-show 运行文件,可以打印出详情,也就是被测函数的运行详情信息
fixture的作用域
fixture函数作用域为funciton、class、module、session、package下面一一说明,直接运行函数可以看出结果
#scope="funciton"
@pytest.fixture(scope="function")
def some_data():
return 42
def test_some_data1(some_data):
assert some_data ==42
def test_some_data2(some_data):
assert some_data ==42
#scope="class"
@pytest.fixture(scope="class")
def some_data():
return 42
class Test_1():
def test_some_data1(self,some_data):
assert some_data ==42
def test_some_data2(self,some_data):
assert some_data ==42
#scope="module"
@pytest.fixture(scope="module")
def some_data():
return 42
def test_some_data3(some_data):
assert some_data ==42
class Test_1():
def test_some_data1(self,some_data):
assert some_data ==42
def test_some_data2(self,some_data):
assert some_data ==42
#scope="session"
#conftest.py(同级目录新建)
@pytest.fixture(scope="session")
def some_data():
return 42
#test_demo.py
class Test_1():
def test_some_data1(self,some_data):
assert some_data ==42
def test_some_data2(self,some_data):
assert some_data ==42
#test_demo2.py
class Test_2():
def test_some_data3(self,some_data):
assert some_data ==42
def test_some_data4(self,some_data):
assert some_data ==42
function<class<module<package<session;其中function指的是函数,class指的是类,module对应我们的py文件,package指的是包,session指的是我们运行一次的这个会话;在package和session层我们就要在同级目录下进行新建conftest.py存储我们的fixture了,其中conftest文件pytest内部会自动识别
fixture的参数化request
request在官方中的说明是pytest中的fixture内置函数,为请求对象提供请求测试上下文访问权限
para =[{"A":1,"B":2}]
@pytest.fixture(params=para)
def some_data(request):
return request.param
def test_some_data3(some_data):
assert some_data ==42
class Test_1():
def test_some_data1(self,some_data):
assert some_data["A"] ==42
def test_some_data2(self,some_data):
assert some_data["B"] ==42
===== short test summary info =====
FAILED test_tttttpython.py::test_some_data3[some_data0] - AssertionError: assert {'A': 1, 'B': 2} == 42
FAILED test_tttttpython.py::Test_1::test_some_data1[some_data0] - assert 1 == 42
FAILED test_tttttpython.py::Test_1::test_some_data2[some_data0] - assert 2 == 42
=== 3 failed in 0.22s ===
解释:
- fixture中允许传入参数params类型可以为列表字典
- request.param为被测对象提供上(获取param中的值)、下(调用fixture函数)管理
初始化我们也可以成为夹具,在被测对象执行前后,像汉堡包一样,这种被测对象执行前后的模式,我们也可以称之为上下文管理 ↩︎