gpt4 book ai didi

python - 自动包装/装饰所有 pytest 单元测试

转载 作者:行者123 更新时间:2023-12-04 16:44:39 24 4
gpt4 key购买 nike

假设我有一个非常简单的日志装饰器:

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 中,如问题中所述,您可以只使用在顶级 conftest.py 中定义的自动使用 fixture .
要添加选择退出某些测试的可能性,您可以定义一个标记,该标记将添加到不应使用该 fixture 的测试中,并在 fixture 中检查该标记,例如像这样:
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
测试文件
import pytest

def test1():
pass # will use profiling

@pytest.mark.no_profiling
def test2():
pass # will not use profiling
正如@hoefling 所指出的,您还可以通过添加以下内容来禁用整个模块的 fixture :
pytestmark = pytest.mark.no_profiling
在模块中。这会将标记添加到所有包含的测试中。

关于python - 自动包装/装饰所有 pytest 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65557740/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com