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 ====================
我们看到什么?
- 设置在参数集中的第一个参数之前运行。
- 清理在最后一个参数之后运行。
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 核心中?
有几个原因。
- 我不确定我们是否想在核心 pytest 中使用这个功能。将其作为插件进行尝试将告诉我们它是否对人们重要。
- 将其作为插件实现可以更快地推出并投入使用。
贡献
欢迎贡献。可以使用 tox 运行测试。
许可协议
在 MIT 许可证的条款下分发,"pytest-param-scope" 是免费的开放源代码软件
问题
如果您遇到任何问题,请提交问题,并附上详细描述。
变更日志
查看 changelog.md
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源分布
pytest_param_scope-0.1.1.tar.gz (10.2 kB 查看散列)