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

 

钩子函数的分类

初始化与配置阶段

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配置清理阶段调用,用于清理测试环境。

  

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