Pytest是Python中一种流行的测试框架,它提供了丰富的功能和灵活性,可以帮助编写高效且可维护的测试代码。除了基本的测试功能外,Pytest还有许多高级用法可以帮助更好地组织、管理和扩展测试套件。
pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0
以下是一些Pytest的常用高级用法,以及相应的示例介绍:
1、参数化测试(Parametrize)
参数化测试允许在单个测试函数中运行多个测试用例,每个用例都使用不同的参数。这对于测试相似场景下的多组输入非常有用。
- import pytest
-
- @pytest.mark.parametrize("input,expected", [(1, 2), (2, 4), (3, 6)])
- def test_multiply_by_two(input, expected):
- assert input * 2 == expected
2、自定义标记和筛选(Custom Marking and Filtering)
可以使用自定义的标记来标识测试用例,然后使用标记来选择性地运行特定类型的测试。
- import pytest
-
- @pytest.mark.slow
- def test_slow_function():
- # test implementation
-
- @pytest.mark.skip
- def test_skipped_function():
- # test implementation
运行只有特定标记(slow)的测试:pytest -m slow
3、测试夹具(Fixtures)
夹具是一种在多个测试函数之间共享资源和设置的方法,可以减少重复的代码和提高测试的效率。
- import pytest
-
- @pytest.fixture
- def setup_teardown_example():
- # setup code
- yield
- # teardown code
-
- def test_using_fixture(setup_teardown_example):
- # test implementation
4、自定义断言(Custom Assertions)
Pytest允许编写自定义的断言函数,以便在测试中更清晰地描述预期结果。
- def assert_custom_condition(result):
- assert result > 0, f"Expected result to be positive, but got {result}"
-
- def test_custom_assertion():
- result = some_function()
- assert_custom_condition(result)
5、测试装饰器(Test Decorators)
Pytest允许编写自定义的测试装饰器来扩展测试功能,比如在测试运行前后执行额外的代码。
- import pytest
-
- def my_test_decorator(func):
- def wrapper():
- print("Before test")
- func()
- print("After test")
- return wrapper
-
- @my_test_decorator
- def test_decorated_function():
- # test implementation
6、测试参数化组合(Combining Parametrized Tests)
可以将不同的参数化测试组合在一起,以测试多个输入组合的情况。
- import pytest
-
- @pytest.mark.parametrize("input", [1, 2])
- @pytest.mark.parametrize("factor", [2, 3])
- def test_parametrized_combinations(input, factor):
- result = input * factor
- assert result == input * factor
7、 插件扩展(Plugin Extensions)
Pytest具有丰富的插件生态系统,允许使用现有插件或编写自定义插件来扩展测试功能。
- # 使用插件:pytest-html生成测试报告
- # 安装插件:pip install pytest-html
- # 运行测试并生成HTML报告
-
- pytest --html=report.html
8、命令行选项和配置文件(Command-Line Options and Configuration Files):
通过命令行选项和配置文件,可以自定义Pytest的行为,包括测试运行、输出格式、覆盖率报告等。
- # 运行测试并显示详细输出
- pytest -v
-
- # 运行测试并生成覆盖率报告
- pytest --cov=my_module
9、跳过测试(Skipping Tests)
有时可能需要暂时跳过某些测试,可以使用“@pytest.mark.skip”来标记这些测试。
- import pytest
-
- @pytest.mark.skip(reason="Test not ready yet")
- def test_skipped_function():
- # test implementation
10、 预期异常(Expecting Exceptions)
可以使用“pytest.raises”上下文管理器来测试代码是否引发了预期的异常。
- import pytest
-
- def test_exception_handling():
- with pytest.raises(ValueError):
- # code that should raise ValueError
11、测试参数定制(Customizing Test Discovery)
通过在“pytest.ini”配置文件中定义 python_files、python_classes 和 python_functions 等,可以自定义测试文件、测试类和测试函数的命名规则。
- # pytest.ini
- [pytest]
- python_files = test_*.py
- python_classes = Test*
- python_functions = test_*
12、多进程和分布式测试(Parallel and Distributed Testing)
Pytest支持通过插件进行多进程和分布式测试,以提高测试速度。
- # 运行测试并使用4个进程
- pytest -n 4
-
- # 使用pytest-xdist插件进行分布式测试
- # 安装插件:pip install pytest-xdist
-
- # 运行测试并在3台主机上分布式运行
- pytest -n 3 --dist=loadscope
13、使用 pytest-xdist 进行分布式测试
pytest-xdist插件支持在多个进程或多台机器上分布式运行测试,以加速测试过程。
- # 安装pytest-xdist插件
- pip install pytest-xdist
-
- # 在多个进程上分布式运行测试
- pytest -n NUM_PROCESSES
-
- # 在多台机器上分布式运行测试
- pytest -n NUM_MACHINES --dist=loadscope
pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0
14、标记依赖和顺序(Marking Dependencies and Ordering)
有时,测试之间可能存在依赖关系,或者按照特定的顺序运行测试。Pytest允许使用“@pytest.mark.dependency”和“@pytest.mark.run”来实现这一点。
- import pytest
-
- @pytest.mark.dependency()
- def test_dependency_1():
- # test implementation
-
- @pytest.mark.dependency(depends=["test_dependency_1"])
- def test_dependency_2():
- # test implementation
-
- @pytest.mark.run(order=1)
- def test_first():
- # test implementation
-
- @pytest.mark.run(order=2)
- def test_second():
- # test implementation
15、预设参数(Fixture Parametrization)
可以将夹具参数化,为夹具提供不同的配置,以便在不同测试用例中使用。
- import pytest
-
- @pytest.fixture(params=[(1, 2), (2, 4), (3, 6)])
- def input_output(request):
- return request.param
-
- def test_multiply(input_output):
- input, expected = input_output
- assert input * 2 == expected
16、忽略特定Python版本(Ignoring Specific Python Versions)
使用“@pytest.mark.skipif”可以在特定Python版本上跳过测试。
- import pytest
- import sys
-
- @pytest.mark.skipif(sys.version_info >= (3, 9), reason="Not supported in this version")
- def test_skip_for_version():
- # test implementation
17、设置全局夹具(Global Fixtures)
如果希望多个测试文件共享同一组夹具,可以在根目录下创建一个“conftest.py”文件,定义全局夹具。
- # conftest.py
- import pytest
-
- @pytest.fixture
- def global_fixture():
- # setup code
- yield
- # teardown code
18、多阶段测试(Multi-Stage Testing)
对于较复杂的应用,可能需要在不同阶段执行测试,比如集成测试、端到端测试等。可以使用 “-k” 命令行选项来指定运行特定阶段的测试。
- # 运行特定阶段的测试
- pytest -k "integration or endtoend"
19、使用 pytest-mock 进行模拟
`pytest-mock` 插件简化了对 Python 的模拟和测试桩的使用,使得编写测试用例更加容易。
- # 安装 pytest-mock 插件
- pip install pytest-mock
- import pytest
- from unittest.mock import MagicMock
-
- def test_using_mock(mocker):
- mock_obj = mocker.MagicMock()
- mock_obj.some_method.return_value = 42
- result = mock_obj.some_method()
- assert result == 42
- mock_obj.some_method.assert_called_once()
20、测试失败自动重试
有时测试失败可能是由于不稳定的因素导致的,可以使用 `pytest-rerunfailures` 插件来自动重试失败的测试。
- # 安装 pytest-rerunfailures 插件
- pip install pytest-rerunfailures
-
- # 运行测试并自动重试失败的测试
- pytest --reruns 3
- 21、使用 pytest-flake8 进行静态代码分析
-
- pytest-flake8 插件可以集成“flake8”静态代码分析工具,帮助在运行测试时进行代码质量检查。
-
- # 安装 pytest-flake8 插件
- pip install pytest-flake8
-
- # 运行测试并进行静态代码分析
- pytest --flake8
这些是更多的 Pytest 高级用法,它们进一步扩展了在测试中的能力。无论是针对不同类型的应用,测试框架提供了丰富的工具和插件来帮助更有效地测试代码。
pytest自动化测试框架详解:pytest自动化测试框架从基础到精通企业级项目实战详解,看完不涨薪来打我_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1jc411G7bw/?spm_id_from=333.999.0.0