pytest
常用的辅助函数和工具函数示例
python
# @File: my_module.py
def fetch_data():
return 'process data'
def process_data():
data = fetch_data()
return data.upper()
python
import logging
import sys
import pytest
#01-------------------------------@pytest.fixture,sample_data 在测试函数中被调用,以提供必要的测试准备工作或资源
@pytest.fixture
def sample_data():
arr = [1,2,3]
return arr
def 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 time
time.sleep(2)
#07-------------------------------@pytest.mark.filterwarnings 用于过滤警告信息,控制哪些警告被显示或忽略
@pytest.mark.filterwarnings("ignore::UserWarning")
def test_ignore_warning():
import warnings
warnings.warn("This is a warning", UserWarning)
#08------------------------------ pytest.config 用于获取或修改 pytest 配置,虽然在较新版本中通常使用 pytest 插件系统替代
def test_config():
config = pytest.config
assert 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_data
def 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 == 2
test_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%]