• Pytest的常用高级用法及示例


    Pytest是Python中一种流行的测试框架,它提供了丰富的功能和灵活性,可以帮助编写高效且可维护的测试代码。除了基本的测试功能外,Pytest还有许多高级用法可以帮助更好地组织、管理和扩展测试套件。

    pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0

     

    以下是一些Pytest的常用高级用法,以及相应的示例介绍:

    1、参数化测试(Parametrize)

    参数化测试允许在单个测试函数中运行多个测试用例,每个用例都使用不同的参数。这对于测试相似场景下的多组输入非常有用。

    1. import pytest
    2. @pytest.mark.parametrize("input,expected", [(1, 2), (2, 4), (3, 6)])
    3. def test_multiply_by_two(input, expected):
    4. assert input * 2 == expected

    2、自定义标记和筛选(Custom Marking and Filtering)

    可以使用自定义的标记来标识测试用例,然后使用标记来选择性地运行特定类型的测试。

    1. import pytest
    2. @pytest.mark.slow
    3. def test_slow_function():
    4. # test implementation
    5. @pytest.mark.skip
    6. def test_skipped_function():
    7. # test implementation

    运行只有特定标记(slow)的测试:pytest -m slow

    3、测试夹具(Fixtures)

    夹具是一种在多个测试函数之间共享资源和设置的方法,可以减少重复的代码和提高测试的效率。

    1. import pytest
    2. @pytest.fixture
    3. def setup_teardown_example():
    4. # setup code
    5. yield
    6. # teardown code
    7. def test_using_fixture(setup_teardown_example):
    8. # test implementation

    4、自定义断言(Custom Assertions)

    Pytest允许编写自定义的断言函数,以便在测试中更清晰地描述预期结果。

    1. def assert_custom_condition(result):
    2. assert result > 0, f"Expected result to be positive, but got {result}"
    3. def test_custom_assertion():
    4. result = some_function()
    5. assert_custom_condition(result)

    5、测试装饰器(Test Decorators)

    Pytest允许编写自定义的测试装饰器来扩展测试功能,比如在测试运行前后执行额外的代码。

    1. import pytest
    2. def my_test_decorator(func):
    3. def wrapper():
    4. print("Before test")
    5. func()
    6. print("After test")
    7. return wrapper
    8. @my_test_decorator
    9. def test_decorated_function():
    10. # test implementation

    6、测试参数化组合(Combining Parametrized Tests)

    可以将不同的参数化测试组合在一起,以测试多个输入组合的情况。

    1. import pytest
    2. @pytest.mark.parametrize("input", [1, 2])
    3. @pytest.mark.parametrize("factor", [2, 3])
    4. def test_parametrized_combinations(input, factor):
    5. result = input * factor
    6. assert result == input * factor

    7、 插件扩展(Plugin Extensions)

    Pytest具有丰富的插件生态系统,允许使用现有插件或编写自定义插件来扩展测试功能。

    1. # 使用插件:pytest-html生成测试报告
    2. # 安装插件:pip install pytest-html
    3. # 运行测试并生成HTML报告
    4. pytest --html=report.html

    8、命令行选项和配置文件(Command-Line Options and Configuration Files):

    通过命令行选项和配置文件,可以自定义Pytest的行为,包括测试运行、输出格式、覆盖率报告等。

    1. # 运行测试并显示详细输出
    2. pytest -v
    3. # 运行测试并生成覆盖率报告
    4. pytest --cov=my_module

    9、跳过测试(Skipping Tests)

    有时可能需要暂时跳过某些测试,可以使用“@pytest.mark.skip”来标记这些测试。

    1. import pytest
    2. @pytest.mark.skip(reason="Test not ready yet")
    3. def test_skipped_function():
    4. # test implementation

    10、 预期异常(Expecting Exceptions)

    可以使用“pytest.raises”上下文管理器来测试代码是否引发了预期的异常。

    1. import pytest
    2. def test_exception_handling():
    3. with pytest.raises(ValueError):
    4. # code that should raise ValueError

    11、测试参数定制(Customizing Test Discovery)

    通过在“pytest.ini”配置文件中定义 python_files、python_classes 和 python_functions 等,可以自定义测试文件、测试类和测试函数的命名规则。  

    1. # pytest.ini
    2. [pytest]
    3. python_files = test_*.py
    4. python_classes = Test*
    5. python_functions = test_*

    12、多进程和分布式测试(Parallel and Distributed Testing)

    Pytest支持通过插件进行多进程和分布式测试,以提高测试速度。

    1. # 运行测试并使用4个进程
    2. pytest -n 4
    3. # 使用pytest-xdist插件进行分布式测试
    4. # 安装插件:pip install pytest-xdist
    5. # 运行测试并在3台主机上分布式运行
    6. pytest -n 3 --dist=loadscope

    13、使用 pytest-xdist 进行分布式测试

    pytest-xdist插件支持在多个进程或多台机器上分布式运行测试,以加速测试过程。

    1. # 安装pytest-xdist插件
    2. pip install pytest-xdist
    3. # 在多个进程上分布式运行测试
    4. pytest -n NUM_PROCESSES
    5. # 在多台机器上分布式运行测试
    6. pytest -n NUM_MACHINES --dist=loadscope

     pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0

    14、标记依赖和顺序(Marking Dependencies and Ordering)

    有时,测试之间可能存在依赖关系,或者按照特定的顺序运行测试。Pytest允许使用“@pytest.mark.dependency”和“@pytest.mark.run”来实现这一点。 

    1. import pytest
    2. @pytest.mark.dependency()
    3. def test_dependency_1():
    4. # test implementation
    5. @pytest.mark.dependency(depends=["test_dependency_1"])
    6. def test_dependency_2():
    7. # test implementation
    8. @pytest.mark.run(order=1)
    9. def test_first():
    10. # test implementation
    11. @pytest.mark.run(order=2)
    12. def test_second():
    13. # test implementation

    15、预设参数(Fixture Parametrization)

    可以将夹具参数化,为夹具提供不同的配置,以便在不同测试用例中使用。

    1. import pytest
    2. @pytest.fixture(params=[(1, 2), (2, 4), (3, 6)])
    3. def input_output(request):
    4. return request.param
    5. def test_multiply(input_output):
    6. input, expected = input_output
    7. assert input * 2 == expected

    16、忽略特定Python版本(Ignoring Specific Python Versions)

    使用“@pytest.mark.skipif”可以在特定Python版本上跳过测试。

    1. import pytest
    2. import sys
    3. @pytest.mark.skipif(sys.version_info >= (3, 9), reason="Not supported in this version")
    4. def test_skip_for_version():
    5. # test implementation

    17、设置全局夹具(Global Fixtures)

    如果希望多个测试文件共享同一组夹具,可以在根目录下创建一个“conftest.py”文件,定义全局夹具。

    1. # conftest.py
    2. import pytest
    3. @pytest.fixture
    4. def global_fixture():
    5. # setup code
    6. yield
    7. # teardown code

    18、多阶段测试(Multi-Stage Testing)

    对于较复杂的应用,可能需要在不同阶段执行测试,比如集成测试、端到端测试等。可以使用 “-k” 命令行选项来指定运行特定阶段的测试。

    1. # 运行特定阶段的测试
    2. pytest -k "integration or endtoend"

    19、使用 pytest-mock 进行模拟

    `pytest-mock` 插件简化了对 Python 的模拟和测试桩的使用,使得编写测试用例更加容易。

    1. # 安装 pytest-mock 插件
    2. pip install pytest-mock
    3. import pytest
    4. from unittest.mock import MagicMock
    5. def test_using_mock(mocker):
    6. mock_obj = mocker.MagicMock()
    7. mock_obj.some_method.return_value = 42
    8. result = mock_obj.some_method()
    9. assert result == 42
    10. mock_obj.some_method.assert_called_once()

    20、测试失败自动重试

    有时测试失败可能是由于不稳定的因素导致的,可以使用 `pytest-rerunfailures` 插件来自动重试失败的测试。

    1. # 安装 pytest-rerunfailures 插件
    2. pip install pytest-rerunfailures
    3. # 运行测试并自动重试失败的测试
    4. pytest --reruns 3
    5. 21、使用 pytest-flake8 进行静态代码分析
    6. pytest-flake8 插件可以集成“flake8”静态代码分析工具,帮助在运行测试时进行代码质量检查。
    7. # 安装 pytest-flake8 插件
    8. pip install pytest-flake8
    9. # 运行测试并进行静态代码分析
    10. pytest --flake8

    这些是更多的 Pytest 高级用法,它们进一步扩展了在测试中的能力。无论是针对不同类型的应用,测试框架提供了丰富的工具和插件来帮助更有效地测试代码。

     pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0

  • 相关阅读:
    微服务架构改造案例
    全栈开发实战|Vue进阶——使用静态模块打包工具webpack
    【python】(十四)python内置库——json
    新款 锐科达 SV-2702VP SIP广播音频模块 RTP流音频广播
    泛微E-Mobile 6.0命令执行漏洞
    计算机毕业设计django基于python商品比价平台(源码+系统+mysql数据库+Lw文档)
    linux环境下安装jenkins(详细图文教程)
    第2-1-1章 FastDFS分布式文件服务背景及系统架构介绍
    一文学会MyBatis的使用~
    rosbag 详细使用
  • 原文地址:https://blog.csdn.net/MXB1220/article/details/133249080