假设我有一个非常简单的日志装饰器:
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
Run Code Online (Sandbox Code Playgroud)
我可以将此装饰器单独添加到每个 pytest 单元测试中:
@my_decorator
def test_one():
assert True
@my_decorator
def test_two():
assert 1
Run Code Online (Sandbox Code Playgroud)
如何自动将此装饰器添加到每个 pytest 单元测试中,这样我就不必手动添加它?如果我想将它添加到文件中的每个单元测试怎么办?或者在一个模块中?
我的用例是使用 SQL 分析器包装每个测试函数,因此低效的 ORM 代码会引发错误。使用 pytest 固定装置应该可行,但我有数千个测试,因此最好自动应用包装器,而不是将固定装置添加到每个测试中。此外,可能有一两个模块我不想分析,因此能够选择加入或选择退出整个文件或模块会很有帮助。
如果您可以将逻辑移动到固定装置中,如问题中所述,您可以只使用顶层conftest.py.
要添加选择退出某些测试的可能性,您可以定义一个标记,将其添加到不应使用夹具的测试中,并检查夹具中的该标记,例如:
测试.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
Run Code Online (Sandbox Code Playgroud)
测试.py
import pytest
def test1():
pass # will use profiling
@pytest.mark.no_profiling
def test2():
pass # will not use profiling
Run Code Online (Sandbox Code Playgroud)
正如@hoefling 所指出的,您还可以通过添加以下内容来禁用整个模块的固定装置:
pytestmark = pytest.mark.no_profiling
Run Code Online (Sandbox Code Playgroud)
在模块中。这会将标记添加到所有包含的测试中。
| 归档时间: |
|
| 查看次数: |
3825 次 |
| 最近记录: |