首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取测试套件中每个测试的SQL查询计数的概述。

获取测试套件中每个测试的SQL查询计数的概述。
EN

Stack Overflow用户
提问于 2020-04-24 10:08:18
回答 1查看 1K关注 0票数 5

我有一个大型Django应用程序,需要大量需要SQL查询优化的测试。

我用pytest-django做测试。

我不想单独为每个测试添加assertNumQueriesdjango-assert-num-queries,而是对每个测试中触发多少个SQL查询进行概述,以了解哪些代码最需要优化,如下所示:

代码语言:javascript
运行
复制
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查询数并显示结果--而不需要修改我测试的源代码(比如添加修饰器)?

我的天真方法是使用这些钩子,并在每次测试前后以某种方式访问数据库连接:

代码语言:javascript
运行
复制
def pytest_runtest_call(item):
    pass

def pytest_runtest_teardown(item, nextitem):
    return True
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-25 16:21:50

对于记录查询计数,一个自动安装工具就足够了。在下面的示例中,我将计数存储在queries_count对象下的一个dict中:

代码语言:javascript
运行
复制
@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的文件中:

代码语言:javascript
运行
复制
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)

现在运行测试将产生如下结果:

代码语言:javascript
运行
复制
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 ====================================
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61405921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档