pytest
常用的辅助函数和工具函数示例
# @File: my_module.pydef fetch_data():return 'process data'def process_data():data = fetch_data()return data.upper()
import logging
import sys
import pytest#01-------------------------------@pytest.fixture,sample_data 在测试函数中被调用,以提供必要的测试准备工作或资源
@pytest.fixture
def sample_data():arr = [1,2,3]return arrdef test_data(sample_data):res = sample_data[0]assert res == 1#02-------------------------------pytest.raises 测试代码是否引发了预期的异常
def test_raise_divide():with pytest.raises(ZeroDivisionError):1 / 0#03-------------------------------@pytest.mark.xfail 用于标记预期会失败的测试,测试失败不会影响整体测试结果
@pytest.mark.xfail
def test_expect_fail():assert 1 == 2
'''
#04-------------------------------import pdb; pdb.set_trace() 用于在测试中插入断点,方便调试
def test_debug():## import pdb; pdb.set_trace()assert 1 == 1
'''#05-------------------------------@pytest.mark.usefixtures("setup_1", "setup_2") 在测试函数中应用多个夹具
@pytest.fixture
def setup_1():print('fixture 1')@pytest.fixture
def setup_2():print('fixture 2')@pytest.mark.usefixtures("setup_1", "setup_2")
def test_with_mul_fixtures():assert 1== 1#06-------------------------------@pytest.mark.timeout 设置测试的超时时间,避免测试运行过长时间
@pytest.mark.timeout(1)
def test_long_running():import timetime.sleep(2)#07-------------------------------@pytest.mark.filterwarnings 用于过滤警告信息,控制哪些警告被显示或忽略
@pytest.mark.filterwarnings("ignore::UserWarning")
def test_ignore_warning():import warningswarnings.warn("This is a warning", UserWarning)#08------------------------------ pytest.config 用于获取或修改 pytest 配置,虽然在较新版本中通常使用 pytest 插件系统替代
def test_config():config = pytest.configassert config.option.verbose#09------------------------------@pytest.mark.order()控制测试的执行顺序(需要 pytest-order 插件)
@pytest.mark.order(1)
def test_first():assert 1==1@pytest.mark.order(2)
def test_second():assert 1==1#10------------------------------pytest.capture 的 caplog 用于捕获日志输出并进行断言
def test_logging(caplog):logger = logging.getLogger('test_logger')logger.warning('this is a warning')assert 'this is a warning' in caplog.text#11------------------------------pytest.fixture 的 autouse, 自动使用夹具,而无需在测试函数中显式声明
@pytest.fixture(autouse=True)
def auto_fixture():print('this runs before each test')def test_example():assert True#12------------------------------pytest.mark.skipif 在特定条件下跳过测试
@pytest.mark.skipif(sys.platform=='win64', reason='Requires Unix-like OS')
def test_unix_only_feature():assert True#13------------------------------pytest 的 monkeypatch 用于在测试运行时动态地修改或模拟对象、方法、类等。这可以帮助你隔离测试环境、模拟依赖项,或者控制外部依赖的行为from TestCases.ModelG.my_module import process_datadef mock_fetch_data():return 'mock data'def test_process_data(monkeypatch):# 使用 monkeypatch 来模拟 fetch_data 函数monkeypatch.setattr("TestCases.ModelG.my_module.fetch_data",mock_fetch_data)res = process_data()assert res == 'MOCK DATA'
test_data.py::test_data
test_data.py::test_raise_divide
test_data.py::test_expect_fail
test_data.py::test_with_mul_fixtures
test_data.py::test_long_running
test_data.py::test_ignore_warning
test_data.py::test_config
======= Global initialization =======
this runs before each test
PASSED [ 7%]this runs before each test
PASSED [ 15%]this runs before each test
XFAIL [ 23%]
@pytest.mark.xfail
def test_expect_fail():
> assert 1 == 2
E assert 1 == 2test_data.py:35: AssertionError
this runs before each test
fixture 1
fixture 2
PASSED [ 30%]this runs before each test
PASSED [ 38%]this runs before each test
PASSED [ 46%]this runs before each test
FAILED [ 53%]
TestCases\ModelG\test_data.py:69 (test_config)
def test_config():
> config = pytest.config
E AttributeError: module 'pytest' has no attribute 'config'test_data.py:71: AttributeError
this runs before each test
PASSED [ 61%]this runs before each test
PASSED [ 69%]this runs before each test
PASSED [ 76%]this runs before each test
PASSED [ 84%]this runs before each test
PASSED [ 92%]this runs before each test
PASSED [100%]