主页

索引

模块索引

搜索页面

插件

插件加载顺序(Plugin discovery order at tool startup):

1. by scanning the command line for the `-p no:name` option
2. by loading all builtin plugins.
3. by scanning the command line for the `-p name` option
4. by loading all plugins registered through installed third-party package `entry points`
5. by loading all plugins specified through the `PYTEST_PLUGINS` environment variable
6. by loading all “initial “conftest.py files
    a. determine the test paths
        a.1 specified on the command line(ex: pytest <path1> <path2>)
        a.2 `testpaths` if defined in conftest.py and running from the rootdir
            [pytest]
            testpaths = <path1> <path2>
        a.3 current dir
    b. for each test path
        b.1 load conftest.py and test*/conftest.py relative to the directory part of the test path
        b.2 Before a conftest.py file is loaded, load conftest.py files in all of its parent directories.
        b.3 After a conftest.py file is loaded, recursively load all plugins specified in its pytest_plugins variable if present



1. 内置插件:从pytest的内部_pytest目录加载
2. 外部插件:通过 setuptools入口点发现的模块
3. conftest.py plugins:在测试目录中自动发现的模块
    pytest_plugins = ("myapp.testsupport.myplugin",)

8 Popular Pytest Plugins:

1. pytest-cov
2. pytest-mock
3. pytest-xdist
4. pytest-timeout
5. pytest-asyncio
6. pytest-sugar
7. pytest-html
8. pytest-profiling

安装:

%pip install pytest

# 通过插件 pytest-html 可以生成 HTML 格式的测试报告:
%pip install pytest-html

# 为 Python 项目提供代码覆盖率报告
# 可以轻松集成到持续集成(CI)管道中
%pip install pytest-cov

# 提供简单但强大的模拟功能
# 用模拟对象替换部分代码,从而允许在受控环境中隔离和测试各个组件
%pip install pytest-mock

# 对 Python 项目进行并行测试
# 可以在多个 CPU 甚至多台机器上运行测试套件,从而大大减少运行大型测试套件所需的时间
%pip install pytest-xdist

# 为测试函数设置超时的简单方法
# 为每个测试指定最大时间限制,之后测试将终止并标记为失败
%pip install pytest-timeout

# 允许您轻松测试异步代码
# 它包括一个事件循环固定装置,允许您在测试中运行异步任务和协程
%pip install pytest-asyncio

# Pytest 插件,它通过提供更详细、更具视觉吸引力的测试结果表示来增强 Pytest 测试执行进度的输出
# 用丰富多彩且信息丰富的输出格式替换了 Pytest 的默认输出格式,具有进度条、详细错误消息以及测试运行结束时的测试结果摘要等功能
%pip install pytest-sugar

# 在测试执行期间轻松分析代码
# 在测试运行时收集分析数据,并生成一份报告,显示哪些函数或代码行执行时间最长
%pip install pytest-profiling

插件-pytest-mock

  • 一个用于集成 pytest 和 unittest.mock 的插件,它使得在 pytest 测试中进行 mock 操作变得更加方便和直观。

  • 提供 mocker fixture:使得在测试中可以轻松地使用 unittest.mock 模块的功能:

    # 可以直接使用 mocker 这个 fixture
    def test_fetch_data_success(mocker):
        ...
    
  • 安装:

    pip install pytest pytest-mock
    

常用功能(pytest-mock):

1. patch
    mocker.patch 是最常用的功能,用于替换某个对象或函数。
    可以使用 return_value 参数指定替换后的返回值,或使用 side_effect 指定一个函数来动态返回值。
    示例:
    def test_patch_example(mocker):
        # 替换函数,并指定返回值
        mocker.patch('path.to.module.function_name', return_value=42)
        assert module.function_name() == 42

        # 使用 side_effect 动态返回值
        def side_effect(arg):
            return arg * 2

        mocker.patch('path.to.module.function_name', side_effect=side_effect)
        assert module.function_name(21) == 42

2. spy
    mocker.spy 用于监视某个函数的调用情况,比如调用次数、传递的参数等,但不改变其原有行为
    示例:
    def test_spy_example(mocker):
        spy = mocker.spy(module, 'function_name')
        result = module.function_name(5)
        spy.assert_called_once_with(5)
        assert result == 10  # 假设函数行为为返回参数的2倍

3. stub
    mocker.stub 用于创建一个简单的 mock 对象,它没有任何行为,除非你显式地设置
    def test_stub_example(mocker):
        stub = mocker.stub(name='example_stub')
        stub.return_value = 'stubbed value'

        assert stub() == 'stubbed value'
        stub.assert_called_once()

示例:

import requests

def fetch_data(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    return None

def test_fetch_data_success(mocker):
    mock_response = mocker.Mock()
    mock_response.status_code = 200
    mock_response.json.return_value = {'key': 'value'}

    mocker.patch('requests.get', return_value=mock_response)

    url = 'http://example.com/api/data'
    result = fetch_data(url)
    assert result == {'key': 'value'}

插件-pytest-asyncio

  • 一个用于异步代码测试的 pytest 插件,允许在测试函数中使用 async/await 语法。

  • 这个插件特别适合测试需要异步处理的代码,例如基于 asyncio 的异步函数和协程。

基本使用:

# 使用 @pytest.mark.asyncio 装饰器来标记异步测试函数
import asyncio
import pytest

@pytest.mark.asyncio
async def test_example():
    await asyncio.sleep(1)
    assert 1 == 1

使用异步夹具:

import pytest

@pytest.fixture
async def async_fixture():
    await asyncio.sleep(1)
    return "async result"

@pytest.mark.asyncio
async def test_with_async_fixture(async_fixture):
    assert async_fixture == "async result"

参考

主页

索引

模块索引

搜索页面