Automatically wrap / decorate all pytest unit tests(自动包装/修饰所有最热的单元测试)
本文介绍了自动包装/修饰所有最热的单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个非常简单的日志装饰器:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"{func.__name__} ran with args: {args}, and kwargs: {kwargs}")
result = func(*args, **kwargs)
return result
return wrapper
我可以将此修饰器单独添加到每个pytest单元测试中:
@my_decorator
def test_one():
assert True
@my_decorator
def test_two():
assert 1
如何将此修饰器自动添加到每个pytest单元测试中,这样我就不必手动添加它了?如果我想要将其添加到文件中的每个单元测试中,该怎么办?还是在模块中?
我的用例是用SQL分析器包装每个测试函数,因此低效的ORM代码会引发错误。使用pytest fixture应该可以工作,但是我有数千个测试,所以自动应用包装器而不是将fixture添加到每个测试中会更好。此外,可能有一两个模块我不想评测,因此能够选择加入或选择退出整个文件或模块会很有帮助。
推荐答案
如果您可以将逻辑移动到装置中(如问题所述),则只能使用在顶层conftest.py
中定义的自动使用装置。
若要添加选择退出某些测试的可能性,您可以定义一个标记,该标记将添加到不应使用该装置的测试中,然后在该装置中检查该标记,例如:
conftest.py
import pytest
def pytest_configure(config):
config.addinivalue_line(
"markers",
"no_profiling: mark test to not use sql profiling"
)
@pytest.fixture(autouse=True)
def sql_profiling(request):
if not request.node.get_closest_marker("no_profiling"):
# do the profiling
yield
test.py
import pytest
def test1():
pass # will use profiling
@pytest.mark.no_profiling
def test2():
pass # will not use profiling
正如@Hoefling所指出的,您还可以通过添加:
来禁用整个模块的灯具pytestmark = pytest.mark.no_profiling
在模块中。这会将标记添加到所有包含的测试。
这篇关于自动包装/修饰所有最热的单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:自动包装/修饰所有最热的单元测试


基础教程推荐
猜你喜欢
- Kivy 使用 opencv.调整图像大小 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01