我有一个大型Django应用程序,需要大量需要SQL查询优化的测试。
我用pytest-django做测试。
我不想单独为每个测试添加assertNumQueries
或django-assert-num-queries
,而是对每个测试中触发多少个SQL查询进行概述,以了解哪些代码最需要优化,如下所示:
test | number of queries
------------------------------------------------
test_a.py::test_my_function1 | 5
test_a.py::test_my_function3 | 2
test_a.py::test_my_function5 | 7
是否有可能在conftest.py中配置一个pytest钩子,它计算每个(DB)测试的SQL查询数并显示结果--而不需要修改我测试的源代码(比如添加修饰器)?
我的天真方法是使用这些钩子,并在每次测试前后以某种方式访问数据库连接:
def pytest_runtest_call(item):
pass
def pytest_runtest_teardown(item, nextitem):
return True
发布于 2020-04-25 16:21:50
对于记录查询计数,一个自动安装工具就足够了。在下面的示例中,我将计数存储在queries_count
对象下的一个dict中:
@pytest.fixture(autouse=True)
def record_query_count(request):
from django.test.utils import CaptureQueriesContext
from django.db import connection
with CaptureQueriesContext(connection) as context:
yield
num_performed = len(context)
if not hasattr(request.config, "query_counts"):
request.config.query_counts = dict()
request.config.query_counts[request.node.nodeid] = num_performed
为了输出结果,我在pytest_terminal_summary
钩子的自定义驱动中添加了一个自定义部分。将以下代码放入项目或测试根dir中名为conftest.py
的文件中:
import os
def pytest_terminal_summary(terminalreporter, exitstatus, config):
content = os.linesep.join(
f'{nodeid:40} | {num_queries}'
for nodeid, num_queries in config.query_counts.items()
)
terminalreporter.ensure_newline()
terminalreporter.section('number of queries', sep='-', bold=True)
terminalreporter.line(content)
现在运行测试将产生如下结果:
tests/test_db.py ... [100%]
----------------------------------- number of queries ------------------------------------
tests/test_db.py::test_add_entry | 2
tests/test_db.py::test_remove_entry | 2
tests/test_db.py::test_no_entries | 1
=================================== 3 passed in 0.26s ====================================
https://stackoverflow.com/questions/61405921
复制相似问题