如何计算单元测试中的sqlalchemy查询

如何计算单元测试中的sqlalchemy查询,sqlalchemy,Sqlalchemy,在Django中,我经常断言应该进行的查询的数量,以便单元测试捕获新的N+1查询问题 from django import db from django.conf import settings settings.DEBUG=True class SendData(TestCase): def test_send(self): db.connection.queries = [] event = Events.objects.all()[1:]

在Django中,我经常断言应该进行的查询的数量,以便单元测试捕获新的N+1查询问题

from django import db
from django.conf import settings
settings.DEBUG=True

class SendData(TestCase):
    def test_send(self):
        db.connection.queries = []
        event = Events.objects.all()[1:]
        s = str(event) # QuerySet is lazy, force retrieval
        self.assertEquals(len(db.connection.queries), 2)
在SQLAlchemy中,通过在上设置echo标志来启用对标准输出的跟踪 引擎

编写计算SQLAlchemy查询数量的测试的最佳方法是什么

class SendData(TestCase):
    def test_send(self):
        event = session.query(Events).first()
        s = str(event)
        self.assertEquals( ... , 2)
使用SQLAlchemy记录/跟踪执行的查询您可以从单元测试中附加查询,这样它们就不会影响实际应用程序的性能:

event.listen(engine, "before_cursor_execute", catch_queries)
现在编写函数catch_querys,方法取决于测试方式。例如,您可以在测试语句中定义此函数:

def test_something(self):
    stmts = []
    def catch_queries(conn, cursor, statement, ...):
        stmts.append(statement)
    # Now attach it as a listener and work with the collected events after running your test

上述方法只是一个启示。对于扩展情况,您可能希望在每次测试后清空事件的全局缓存。原因是,在当前的开发版本0.9之前,没有用于删除事件侦听器的API。因此,创建一个访问全局列表的全局侦听器。

我为此创建了一个上下文管理器类:

类DBStatementCounterobject: 用作上下文管理器来计算执行的执行次数 针对给定的sqlalchemy连接。 用法: DBStatementCounterconn作为ctr: 连接执行器选择1 连接执行器选择1 断言ctr.get_计数==2 定义初始自我,康涅狄格州: self.conn=conn self.count=0 将不得不依赖于此,因为sqlalchemy 0.8不支持 删除事件侦听器 self.do_count=False sqlalchemy.event.listencon,'after_execute',self.callback 定义u_输入_self: self.do_count=真 回归自我 定义退出自我*: self.do_count=False def get_countself: 返回自计数 def callbackself,*.\ux: 如果self.do_计数: self.count+=1
使用btw的方法如何?这是its内部检查使用的方法

从flask\u sqlalchemy导入获取\u调试\u查询 def test_list_与确保查询_countapp,客户端: 使用app.app_上下文: 这里生成一些测试数据 对于范围10中的uu: 笔记本=基于笔记本文件创建测试计划笔记本 db.session,所有者=“测试用户”, 计划={种类:计划\频率\每日} 对于100范围内的uu: 创建\u测试\u计划的\u notebook\u rundb.session,notebook\u id=notebook.id 使用app.app_上下文: 重置上下文调用实际视图后,我们需要asserNumOfQueries “笔记本电脑.个人笔记本电脑”的client.geturl assert lenget_debug_查询==3
请记住,要重置上下文和计数,您必须先使用app.app_context调用,然后才能确定要测量的内容。

我是否可以监听在db.session.query/add等层上执行的内容?这应该是例外答案:简单工作解决方案
def test_something(self):
    stmts = []
    def catch_queries(conn, cursor, statement, ...):
        stmts.append(statement)
    # Now attach it as a listener and work with the collected events after running your test