<< 返回目录
1 pytest自动化测试 - pytest夹具的基本概念
夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件
,夹具可以是函数、类或模块,使用@pytest.fixture
装饰器进行标记。
1.1 夹具的作用范围
夹具的作用范围:
- 函数范围:夹具默认范围是函数级,即,每个测试函数执行时,都会执行一遍夹具的前置和
后置条件
- 类范围:夹具的
前置条件
在类的第一个测试函数执行前执行,在类的最后一个测试函数执行后执行。 - 模块范围:夹具的
前置条件
在模块的第一个测试函数执行前执行,在模块的最后一个测试函数执行后执行。 - 会话范围:夹具的
前置条件
在测试会话开始时执行一次,后置条件
在测试会话结束时执行一次。
1.1.1 函数范围的夹具
默认(未指定参数)时是函数级的范围。
import pytest
@pytest.fixture
def setup_resource():
# 准备资源
resource = "This is a test resource"
print("\n" + "="*65)
print("BEGIN: 用例预置条件.")
yield resource
# 清理资源
print("END: 用例`后置条件`.")
def test_with_fixture(setup_resource):
print("第一个用例开始".center(70))
assert "test resource" in setup_resource
print("第一个用例结束".center(70))
def test_another_with_fixture(setup_resource):
print("第二个用例开始".center(70))
assert len(setup_resource) > 10
print("第二个用例结束".center(70))
yield
前的语句是前置条件
,yield
后的语句是后置条件
。夹具中的前置条件
和后置条件
,在每个测试用例中都会执行。
输出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 items
test_ft_subf_fixture_001.py
=================================================================
BEGIN: 用例预置条件.
第一个用例开始
第一个用例结束
.END: 用例`后置条件`.
=================================================================
BEGIN: 用例预置条件.
第二个用例开始
第二个用例结束
.END: 用例`后置条件`.
============================== 2 passed in 0.01s ==============================
从报文可以看到,夹具中的前置条件
在用例开始前执行,后置条件
,在用例执行结束时执行。
1.1.2 类范围的夹具
通过参数@pytest.fixture(scope="class")
可以指定夹具的类范围
import pytest
@pytest.fixture(scope="class")
def setup_class_resource():
resource = "Class resource"
print("\n" + "=" * 65)
print("【预置条件】")
yield resource
print("【`后置条件`】.")
class TestClassWithFixture:
def test_class_fixture(self, setup_class_resource):
print("第1个测试用例开始.")
assert "Class" in setup_class_resource
print("第1个测试用例结束.\n")
def test_another_class_fixture(self, setup_class_resource):
print("第2个测试用例开始.")
assert len(setup_class_resource) > 10
print("第2个测试用例结束.")
输出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 items
test_ft_fixture_class_001.py
=================================================================
【预置条件】
第1个测试用例开始.
第1个测试用例结束.
.第2个测试用例开始.
第2个测试用例结束.
.【`后置条件`】.
============================== 2 passed in 0.01s ==============================
1.1.3 模块范围的夹具
前置条件
在模块第一个测试函数执行前执行,后置条件
在最后一个函数执行后执行。
import pytest
@pytest.fixture(scope="module")
def setup_module_resource():
resource = "Module resource"
print("\n" + "=" * 65)
print("【预置条件】")
yield resource
print("【`后置条件`】")
def test_module_fixture1(setup_module_resource):
print("第1个用例开始")
assert "Module" in setup_module_resource
print("第1个用例结束\n")
def test_module_fixture2(setup_module_resource):
print("第2个用例开始")
assert len(setup_module_resource) > 10
print("第2个用例结束\n")
#这个函数函数没有使用夹具
def test_module_fixture3():
print("第3个用例开始")
assert len("测试不用夹具的函数是否会干扰") > 10
print("第3个用例结束")
输出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 3 items
test_ft_fixture_module_001.py
=================================================================
【预置条件】
第1个用例开始
第1个用例结束
.第2个用例开始
第2个用例结束
.第3个用例开始
第3个用例结束
.【`后置条件`】
============================== 3 passed in 0.01s ==============================
说明:模块中即使存在测试函数没有使用夹具,也不会干扰夹具中的预置条件和后置条件
,预置条件始终保存在模块开始执行前执行,后续条件在模块的所有函数执行完时执行。
1.1.4 会话范围的夹具
下面的示例探索模块范围和会话范围的区别,其中test_ft_fixture_module_001
是上一个示例中的模块范围的测试代码,使用from test_ft_fixture_module_001 import *
将模块的所有夹具和用例导入到本用例。
import pytest
from test_ft_fixture_module_001 import *
@pytest.fixture(scope="session")
def setup_session_resource():
resource = "Session resource"
print("\n" + "=" * 65)
print("【会话-`前置条件`】")
yield resource
print("【会话-`后置条件`】")
def test_session_fixture1(setup_session_resource):
print("会话-第1个用例开始")
assert "Session" in setup_session_resource
print("会话-第1个用例结束\n")
def test_session_fixture2(setup_session_resource):
print("会话-第2个用例开始")
assert len(setup_session_resource) > 10
print("会话-第2个用例结束\n")
def test_session_fixture3():
print("会话-第3个用例开始")
assert len("测试没有使用夹具的第3个用例对`后置条件`的影响") > 10
print("会话-第3个用例结束")
输出:
============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 6 items
test_ft_fixture_session_001.py
=================================================================
【模块-预置条件】
模块-第1个用例开始
模块-第1个用例结束
.模块-第2个用例开始
模块-第2个用例结束
.模块-第3个用例开始
模块-第3个用例结束
.
=================================================================
【会话-`前置条件`】
会话-第1个用例开始
会话-第1个用例结束
.会话-第2个用例开始
会话-第2个用例结束
.会话-第3个用例开始
会话-第3个用例结束
.【模块-`后置条件`】
【会话-`后置条件`】
============================== 6 passed in 0.02s ==============================
从执行结果来看,模块的预置条件在最开始执行,紧随其后的是导入的模块中的测试函数,而会话的前置条件
只在当前模块执行前才执行,后置条件
是先执行了模块的后置条件
,再执行会话的后置条件
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.
<< 返回目录