unittest和pytest的设置级别

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

 

钩子函数的分类

引导挂钩要求足够早注册的插件(内部和setuptools插件),可以使用的钩子
pytest_load_initial_conftests(early_config,parser,args): 在命令行选项解析之前实现初始conftest文件的加载。
pytest_cmdline_preparse(config,args): (不建议使用)在选项解析之前修改命令行参数。
pytest_cmdline_parse(pluginmanager,args): 返回一个初始化的配置对象,解析指定的args。
pytest_cmdline_main(config): 当从命令行运行pytest时被调用,是pytest的主入口点。



初始化与配置阶段
pytest_addoption(parser):用于向pytest的命令行解析器添加自定义选项。
pytest_addhooks(pluginmanager): 在插件注册时调用,以允许通过调用来添加新的挂钩
pytest_configure(config): pytest配置阶段调用,用于设置测试环境。
pytest_unconfigure(config): 在退出测试过程之前调用。
pytest_sessionstart(session): 整个测试会话开始时调用。
pytest_sessionfinish(session,exitstatus): 整个测试会话结束时调用。
pytest_plugin_registered(plugin,manager): 当pytest插件注册时调用。
pytest_report_header: 用于生成测试报告时的自定义标题。



用例收集阶段(runtest)钩子
pytest_collection(session): 执行给定会话的收集协议。
pytest_collect_directory(path, parent): 收集目录作为测试模块时调用。
pytest_collect_file(path, parent) 收集单个文件作为测试模块时调用。
pytest_pycollect_makemodule(path: py._path.local.LocalPath, parent) 返回给定路径的模块收集器或无。
pytest_pycollect_makeitem(collector: PyCollector, name: str, obj: object) 返回模块中Python对象的自定义项目/收集器,或者返回None。在第一个非无结果处停止
pytest_generate_tests(metafunc: Metafunc) 生成测试用例时调用,常用于参数化。
pytest_make_parametrize_id(config: Config, val: object, argname: str) 为参数化测试生成ID时调用。
pytest_collection_modifyitems(session: Session, config: Config, items: List[Item]) 修改已收集的测试用例项时调用。
pytest_collection_finish(session: Session) 用例收集阶段结束时调用。
pytest_collect_module: 收集Python模块作为测试模块时调用。
pytest_collect_item: 收集单个测试项(如函数、方法或类)时调用。



用例准备与执行阶段(runtest)钩子
pytest_runtestloop(session: Session) 执行主运行测试循环(收集完成后)。
pytest_runtest_protocol(item: Item, nextitem: Optional[Item]) : 开始执行单个测试项之前调用,用于设置执行协议。
pytest_runtest_logstart(nodeid: str, location: Tuple[str, Optional[int], str]) 用于开始测试项的日志记录。
pytest_runtest_logfinish(nodeid: str, location: Tuple[str, Optional[int], str])用于结束测试项的日志记录。
pytest_runtest_setup(item: Item) : 在执行测试项之前设置fixture和其他准备工作时调用。
pytest_runtest_call(item: Item) : 实际执行测试项(如函数或方法)时调用。
pytest_runtest_teardown(item: Item, nextitem: Optional[Item]): 在测试项执行完毕后进行清理时调用。
pytest_runtest_makereport(item: Item, call: CallInfo[None]) 生成测试项的执行报告。
pytest_pyfunc_call(pyfuncitem: Function) 调用基础测试功能。



报告与总结阶段(runtest)钩子
pytest_collectstart(collector: Collector): 收集器开始收集。
pytest_make_collect_report(collector: Collector): 生成收集阶段的测试报告。
pytest_itemcollected(item: Item) :我们刚刚收集了一个测试项目
pytest_collectreport(report: CollectReport): 生成收集阶段的测试报告。
pytest_deselected(items: Sequence[Item]) :要求取消选择的测试项目,例如按关键字。
pytest_report_header(config: Config, startdir: py._path.local.LocalPath) :返回要显示为标题信息的字符串或字符串列表,以进行终端报告。
pytest_report_collectionfinish(config: Config, startdir: py._path.local.LocalPath, items: Sequence[Item]) :返回成功完成收集后将显示的字符串或字符串列表。
pytest_report_teststatus(report: Union[CollectReport, TestReport], config: Config) :报告单个测试项的状态时调用。
pytest_terminal_summary(terminalreporter: TerminalReporter, exitstatus: ExitCode, config: Config): 在终端显示测试总结信息时调用。
pytest_fixture_setup(fixturedef: FixtureDef[Any], request: SubRequest) :执行夹具设置执行。
pytest_fixture_post_finalizer(fixturedef: FixtureDef[Any], request: SubRequest) :在夹具拆除之后但在清除缓存之前调用,因此夹具结果fixturedef.cached_result仍然可用(不是 None)
pytest_warning_captured(warning_message: warnings.WarningMessage, when: Literal[‘config’, ‘collect’, ‘runtest’], item: Optional[Item], location: Optional[Tuple[str, int, str]]) :(已弃用)处理内部pytest警告插件捕获的警告。
pytest_warning_recorded(warning_message: warnings.WarningMessage, when: Literal[‘config’, ‘collect’, ‘runtest’], nodeid: str, location: Optional[Tuple[str, int, str]]) :处理内部pytest警告插件捕获的警告。
pytest_runtest_logreport(report: TestReport) :处理项目的_pytest.reports.TestReport每个设置,调用和拆卸运行测试阶段产生的结果。
pytest_assertrepr_compare(config: Config, op: str, left: object, right: object) :返回失败断言表达式中的比较的说明。
pytest_assertion_pass(item: Item, lineno: int, orig: str, expl: str) :(实验性的)在断言通过时调用。
pytest_runtest_makereport(item: Item, call: CallInfo[None]) : 生成测试项的执行报告。
pytest_make_test_report: 生成测试项的执行报告



异常与调试阶段
pytest_exception_interact(node: Union[Item, Collector], call: CallInfo[Any], report: Union[CollectReport, TestReport]): 当未捕获的异常导致测试失败时,允许用户交互地调试。
pytest_internalerror(excrepr: ExceptionRepr, excinfo: ExceptionInfo[BaseException]) : 当pytest遇到内部错误时调用。
pytest_keyboard_interrupt(excinfo: ExceptionInfo[Union[KeyboardInterrupt, Exit]]) 要求键盘中断。
pytest_enter_pdb(config: Config, pdb: pdb.Pdb) 调用了pdb.set_trace()



清理与卸载阶段
pytest_unconfigure: 在pytest配置清理阶段调用,用于清理测试环境。

 

 

 

  

posted @ 2025-05-21 15:37  北京测试菜鸟  阅读(16)  评论(0)    收藏  举报