当前位置:   article > 正文

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/739905
推荐阅读
相关标签
  

闽ICP备14008679号