unittest:
import unittest
# 整个模块开始前执行
def setUpModule():
print('模块级别(setUpModule)开始')
# 整个模块结束后执行
def tearDownModule():
print('模块级别(tearDownModule)结束')
class Testcase(unittest.TestCase):
# 每个测试用例类开始前执行
@classmethod
def setUpClass(cls):
print('类级别(setUpClass)开始')
# 每个测试用例类结束后执行
@classmethod
def tearDownClass(cls):
print('类级别(tearDownClass)结束')
# 每条测试用例前执行
def setUp(self) -> None:
print('测试用例开始')
# 每条测试用例后执行
def tearDown(self) -> None:
print('测试用例结束')
# 编写测试用例
def test_01(self):
print('测试用例01执行')
def test_02(self):
print('测试用例02执行')
if __name__ == '__main__':
unittest.main()
pytest:
import pytest
# 模块级(setup_module/teardown_module): 作用域于模块的开始与结束,不包含在类中
def setup_module():
print("1.模块级别(setUpModule)开始")
def teardown_module():
print("1.模块级别(tearDownModule)结束")
# 函数级(setup_function/teardown_function):作用域于函数的开始与结束,不包含在类中
def setup_function():
print("2.类外面函数级别(setup_function)开始")
def teardown_function():
print("2.类外面函数级别(teardown_function)结束")
def test_one():
print('test_one')
# ======================================================================================================================
class Testcase:
# 类级(setup_class/teardown_class):作用域类的开始与结束,仅在类中运行一次,包含在类中
def setup_class(self):
print("1.类里面,类级别(setup_class)开始")
def teardown_class(self):
print("1.类里面,类级别(teardown_class)开始")
# 方法级(setup_method/teardown_method): 作用域方法的开始与结束,包含在类中
def setup_method(self):
""" 和下面的 setup 方法一样,二选一用"""
print("2-1.类里面,方法级别(setup_method)开始")
def teardown_method(self):
""" 和下面的 teardown 方法一样,二选一用"""
print('2-1.类里面,方法级别(teardown_method)开始')
# 方法细化级别【兼容类里面的层级(setup/teardown):在每个调用方法前后运行】
def setup(self):
print("2-2.类里面,方法级别(setup)开始")
# 方法细化级别
def teardown(self):
print("2-2.类里面,方法级别(teardown)开始")
def test_01(self):
print('测试用例01执行')
# ======================================================================================================================
# 方法级别
@pytest.fixture(scope="function")
def test_1():
pass
# 类级别
@pytest.fixture(scope="class")
def test_2():
pass
# 模块级别
@pytest.fixture(scope="module")
def test_3():
pass
# 包级别
@pytest.fixture(scope="package")
def test_4():
pass
# 会话级别
@pytest.fixture(scope="session")
def test_5():
pass
# ======================================================================================================================
# 钩子函数
# conftest.py 作用范围:在整个测试会话开始之前和结束之后执行。
def pytest_sessionstart(session):
print("\n会话开始前的全局设置(pytest_sessionstart)")
def pytest_sessionfinish(session, exitstatus):
print("\n会话结束后的全局清理(pytest_sessionfinish)")
# conftest.py 作用范围:在测试收集完成之后和插件卸载(unconfigure)时执行。
def pytest_collection_finish(session):
print("\n测试收集完成后执行(pytest_collection_finish)")
def pytest_unconfigure(config):
print("\n插件卸载时执行(pytest_unconfigure)")
# conftest.py 作用范围:在每个测试项(通常是一个测试函数或测试方法)执行前和执行后执行。
def pytest_runtest_setup(item):
print("\n每个测试项执行前的设置(pytest_runtest_setup)")
def pytest_runtest_teardown(item):
print("\n每个测试项执行后的清理(pytest_runtest_teardown)")
if __name__ == '__main__':
pytest.main(['-q', '-s', '-ra'])
使用钩子函数:pytest_sessionstart / pytest_sessionfinish
conftest.py
import pytest
def pytest_sessionstart(session):
tl = Tools()
session.tl = tl
def pytest_sessionfinish(session, exitstatus):
if exitstatus == pytest.ExitCode.OK:
print("所有测试用例都通过了!")
elif exitstatus == pytest.ExitCode.TESTS_FAILED:
print("有测试用例失败了。")
elif exitstatus == pytest.ExitCode.INTERRUPTED:
print("测试会话被用户中断。")
elif exitstatus == pytest.ExitCode.INTERNAL_ERROR:
print("pytest 内部错误。")
elif exitstatus == pytest.ExitCode.USAGE_ERROR:
print("pytest 命令行使用错误。")
elif exitstatus == pytest.ExitCode.NO_TESTS_COLLECTED:
print("没有收集到任何测试用例。")
# 执行清理操作
session.tl.close()
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
使用钩子函数:pytest_runtest_setup/ pytest_runtest_teardown
写法一:
conftest.py
def pytest_sessionstart(session):
tl = Tools()
session.tl = tl
def pytest_runtest_setup(item):
tl = item.session.tl
item.tl = tl
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl # 或者 tl = request.item.tl
写法二:
conftest.py
def pytest_runtest_setup(item):
tl = Tools()
item.session.tl = tl
item.tl = tl
def pytest_runtest_teardown(item):
item.tl.close()
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
使用钩子函数:pytest_collection_finish
conftest.py
def pytest_collection_finish(session):
tl = Tools()
session.tl = tl
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
钩子函数的分类
初始化与配置阶段
pytest_cmdline_main: 当从命令行运行pytest时被调用,是pytest的主入口点。
pytest_configure: pytest配置阶段调用,用于设置测试环境。
pytest_plugin_registered: 当pytest插件注册时调用。
pytest_report_header: 用于生成测试报告时的自定义标题。
pytest_addoption:用于向pytest的命令行解析器添加自定义选项。
pytest_sessionstart: 整个测试会话开始时调用。
用例收集阶段
pytest_collect_file: 收集单个文件作为测试模块时调用。
pytest_collect_directory: 收集目录作为测试模块时调用。
pytest_collect_module: 收集Python模块作为测试模块时调用。
pytest_collect_item: 收集单个测试项(如函数、方法或类)时调用。
pytest_generate_tests: 生成测试用例时调用,常用于参数化。
pytest_make_parametrize_id: 为参数化测试生成ID时调用。
pytest_collection_modifyitems: 修改已收集的测试用例项时调用。
pytest_collection_finish: 用例收集阶段结束时调用。
用例准备与执行阶段
pytest_runtest_protocol: 开始执行单个测试项之前调用,用于设置执行协议。
pytest_runtest_setup: 在执行测试项之前设置fixture和其他准备工作时调用。
pytest_runtest_call: 实际执行测试项(如函数或方法)时调用。
pytest_runtest_teardown: 在测试项执行完毕后进行清理时调用。
pytest_runtest_logstart: 用于开始测试项的日志记录。
pytest_runtest_logfinish: 用于结束测试项的日志记录。
报告与总结阶段
pytest_make_collect_report: 生成收集阶段的测试报告。
pytest_collectreport: 生成收集阶段的测试报告。
pytest_make_test_report: 生成测试项的执行报告.
pytest_runtest_makereport: 生成测试项的执行报告。
pytest_report_teststatus: 报告单个测试项的状态时调用。
pytest_terminal_summary: 在终端显示测试总结信息时调用。
pytest_sessionfinish: 整个测试会话结束时调用。
异常与调试阶段
pytest_exception_interact: 当未捕获的异常导致测试失败时,允许用户交互地调试。
pytest_internalerror: 当pytest遇到内部错误时调用。
清理与卸载阶段
pytest_unconfigure: 在pytest配置清理阶段调用,用于清理测试环境。