跳转到主要内容

pytest参数化范围修复程序

项目描述

pytest-param-scope

pytest参数化范围修复程序。


pytest-param-scope提供了一个param_scope标记,可以将设置和清理函数传递给参数化函数。

还有一个param_scope修复程序,允许将设置函数的返回值传递给测试。

安装

从PyPI

$ pip install pytest-param-scope

示例

import pytest


def param_setup():
    print('\nparam setup')
    return 'some data from setup'


def param_teardown():
    print('\nparam teardown')


@pytest.mark.param_scope(param_setup, param_teardown)
@pytest.mark.parametrize('x', ['a', 'b', 'c'])
def test_param(x, param_scope):
    """
    mark.param_scope is used to pass
    setup and teardown functions to fixture

    param_scope fixture is necessary if you
    want to use the value from setup
    """
    assert param_scope == 'some data from setup'

让我们看看它是如何运行的

(venv) $ pytest -s -v test_param_scope.py::test_param
================== test session starts ===================
collected 3 items                                        

test_param_scope.py::test_param[a] 
param setup
PASSED
test_param_scope.py::test_param[b] PASSED
test_param_scope.py::test_param[c] PASSED
param teardown

=================== 3 passed in 0.01s ====================

我们看到什么?

  1. 设置在参数集中的第一个参数之前运行。
  2. 清理在最后一个参数之后运行。
  3. param_scope修复程序持有设置函数的返回值。

与修复程序的相似之处

  • 如果设置失败,则不会运行清理。
  • 设置只运行一次,尽管所有参数化测试用例都可以检索其值。
  • 如果设置中发生异常,则测试将报告错误而不会运行。清理也不会运行。
  • 如果清理中发生异常,则最后运行的参数化测试用例将导致同时通过和错误。这很奇怪,但与pytest修复程序一致。

您可以将设置和清理组合在一个函数中

您可以通过yield分隔的函数提供函数,将设置和清理放在一个函数中。

但是,这里有一个技巧

  • 或者,将None作为清理传递。
  • 或者使用with_args,例如@pytest.mark.param_scope.with_args(my_func)

这是一个组合设置/清理函数

def setup_and_teardown():
    print('\nsetup')
    yield 42
    print('\nteardown')

使用None作为清理来调用它

import pytest

@pytest.mark.param_scope(setup_and_teardown, None)
@pytest.mark.parametrize('x', ['a', 'b', 'c'])
def test_yield(x, param_scope):
    assert param_scope == 42

或使用with_args

@pytest.mark.param_scope.with_args(setup_and_teardown)
@pytest.mark.parametrize('x', ['a', 'b', 'c'])
def test_just_one_func(x, param_scope):
    assert param_scope == 42

这两个示例都在examples/test_yield.py中。

更多示例

请参阅仓库中的examples目录。

限制

该实现是一个彻底的 hacks,依赖于全局变量,并查找下一个测试以确定何时运行拆卸。毫无疑问,有改进的空间。

  • 使用 pytest-xdist:我还没有找到失败的案例,但看起来在并行运行测试时这会很脆弱。

  • 使用 pytest-repeat:实际上与 pytest-repeat 工作得很好,因为重复是通过生成参数化测试来实现的。

常见问题解答 (FAQ)

为什么不直接使用现有的 fixture 范围?

没有完全适合的范围。

  • 函数:在每个参数化测试案例之前和之后运行设置。
  • 类:如果你只在一个测试类中放一个函数,那么它有点作用。
  • 模块:太宽了。
  • 会话:太宽了。

我想设置在所有参数化测试案例之前运行,并在最后一个之后清理。

为什么实现为插件而不是将其功能添加到 pytest 核心中?

有几个原因。

  1. 我不确定我们是否想在核心 pytest 中使用这个功能。将其作为插件进行尝试将告诉我们它是否对人们重要。
  2. 将其作为插件实现可以更快地推出并投入使用。

贡献

欢迎贡献。可以使用 tox 运行测试。

许可协议

MIT 许可证的条款下分发,"pytest-param-scope" 是免费的开放源代码软件

问题

如果您遇到任何问题,请提交问题,并附上详细描述。

变更日志

查看 changelog.md

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

pytest_param_scope-0.1.1.tar.gz (10.2 kB 查看散列)

上传时间:

构建分布

pytest_param_scope-0.1.1-py3-none-any.whl (5.3 kB 查看散列)

上传时间: Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面