pytest中conftest的使用
pytest的conftest.py文件是一个特殊文件,用于定义测试夹具(fixtures)和其他配置,以便在整个测试套件中共享。conftest.py 文件可以放在任何目录下,pytest 会自动发现并加载它们。
主要用途
- 定义夹具(fixtures)
- 自定义测试钩子(hooks)
- 修改测试行为
示例:使用 conftest.py 假设项目结构如下
project/
│
├── tests/
│ ├── conftest.py
│ ├── test_example.py
│ └── test_another.py
│
└── app.py
定义夹具(fixtures)
在conftest.py文件中定义夹具,以便在整个测试套件中共享.
# conftest.py
import pytest
# 定义一个简单的夹具
@pytest.fixture
def example_fixture():
print("Setting up example fixture")
yield
print("Tearing down example fixture")
# 定义一个数据库连接夹具
@pytest.fixture
def db_connection():
print("Connecting to database")
yield
print("Disconnecting from database")
# test_example.py
def test_example_function(example_fixture):
print("Running example test")
assert True
def test_another_function(db_connection):
print("Running another test")
assert True
# test_another.py
def test_third_function(db_connection):
print("Running third test")
assert True
自定义测试钩子(hooks)
pytest_addoption
用途:向命令行界面添加自定义选项。 参数:parser - OptionParser实例。
def pytest_addoption(parser):
parser.addoption("--myoption", action="store", default="default_value", help="my option description")
pytest_configure
用途:在测试会话开始前配置pytest. 参数:config - 当前配置对象.
def pytest_configure(config):
print("Configuring pytest")
pytest_sessionstart
用途:在测试会话开始时调用。 参数:session - 当前测试会话对象。
def pytest_sessionstart(session):
print("Starting test session")
pytest_collection
用途:在测试收集开始时调用。 参数:session - 当前测试会话对象
def pytest_collection(session):
print("Collecting tests")
pytest_collection_modifyitems
用途:在测试收集完成后修改测试项。 参数:session, config, items - 当前测试会话对象、当前配置对象和测试项列表。
def pytest_collection_modifyitems(session, config, items):
print("Modifying test items")
pytest_runtest_protocol
用途:在测试项开始执行前调用。 参数:item, nextitem - 当前测试项和下一个测试项。
def pytest_runtest_protocol(item, nextitem):
print("Running test protocol")
pytest_runtest_setup
用途:在每个测试项开始前调用。 参数:item - 当前测试项。
def pytest_runtest_setup(item):
print(f"Setting up test item: {item.name}")
pytest_runtest_call
用途:在每个测试项的实际执行期间调用。 参数:item - 当前测试项。
def pytest_runtest_call(item):
print(f"Executing test item: {item.name}")
pytest_runtest_teardown
用途:在每个测试项结束后调用。 参数:item, nextitem - 当前测试项和下一个测试项。 def pytest_runtest_teardown(item, nextitem): print(f”Tearing down test item: {item.name}”)
pytest_runtest_makereport
用途:在每个测试项执行后生成报告。 参数:item, call - 当前测试项和调用信息。
def pytest_runtest_makereport(item, call):
print(f"Making report for test item: {item.name}")
pytest_runtest_logreport
用途:在每个测试项的日志报告生成后调用。 参数:report - 报告对象。
def pytest_runtest_logreport(report):
print(f"Logging report for test item: {report.nodeid}")
pytest_runtestloop
用途:在所有测试项执行完毕后调用。 参数:无。
def pytest_runtestloop():
print("Running test loop")
pytest_keyboard_interrupt
用途:在测试过程中发生键盘中断时调用。 参数:excinfo - 异常信息。
def pytest_keyboard_interrupt(excinfo):
print("Keyboard interrupt detected")
pytest_internalerror
用途:在测试过程中发生内部错误时调用。 参数:excinfo - 异常信息
def pytest_internalerror(excinfo):
print("Internal error detected")
pytest_sessionfinish
用途:在测试会话结束时调用。 参数:session, exitstatus - 当前测试会话对象和退出状态
def pytest_sessionfinish(session, exitstatus):
print("Finishing test session")
pytest_unconfigure
用途:在测试会话结束前调用。 参数:config - 当前配置对象。
def pytest_unconfigure(config):
print("Unconfiguring pytest")
pytest_terminal_summary
用途:在测试结束时打印终端总结。 参数:terminalreporter, exitstatus, config - 终端报告对象、退出状态和当前配置对象
def pytest_terminal_summary(terminalreporter, exitstatus, config):
print("Terminal summary")
修改测试行为
略