[英]flask_sqlalchemy create_all() fails silently in unit testing
[英]Real Unit Testing of SQLAlchemy in Flask
我正在网络和 SO 中搜索诸如“单元测试 sqlalchemy”之类的键,但所有答案都涉及创建真实的数据库(sqlite、postgres)来测试它。 当你创建真实的东西时,它不是单元测试。
创建 sqlite DB 与在磁盘上创建文件没有什么不同,但令人惊讶的是人们希望只模拟后者。 我已经尝试使用 setUp 和 sys.modules 来模拟 db 导入,它可以工作,但它模拟的太多,并且使用模型作为测试对象并非易事(模拟不支持所有需要的东西,例如next )
是否有任何技术可以模拟数据库行为(创建数据库、提交、查询)但仍然可以访问模型以对它们进行基本检查? 也许有一些库可以模拟连接?
跟进我的“这个 Q 将被关闭”,我相信没有单一的权威方法可以做到这一点,您需要选择如何模拟事物。
基本上,SQLAlchemy 是数据库设计和查询的抽象。 这意味着,您可以将模型放置在抽象中的不同位置:
你可以设置一个sqlite实例。 这个解决方案的优点是你不需要调整/猴子补丁python堆栈中的任何东西,因为你正在改变系统前沿的东西,缺点是需要更多的维护工作,因此风险更大。
并将这些数据文件作为资源存储在您的代码中。 然后为正在运行的测试加载正确的数据库。 您将需要一个tearDown()
方法来在测试后将数据库恢复到其原始状态。 好的一面是它很容易用很少的代码实现,但如果你修改你的模型,这将是一项艰巨的工作。
在那里你用setUp()
方法填充你的数据,并且没有 db 可以存储在你的 git 中或处理你的代码之外。 尽管如此,您仍然需要维护大量的setUp()
代码。
比照那个答案
该策略将是最常用和建议的策略。
另一种方式,通常用于模拟 HTTP 连接,它是序列化 SA 和数据库之间通信的输出和输入。 我不知道有图书馆这样做,但这将是一件很棒的事情。
基本上,想象一个包含所有发送到数据库的请求和从数据库返回的数据的 JSON 文件。 每次播放测试时,您只是在重播该 JSON 记录。
当您进行更改时,您可以记录 I/O 交互并将它们序列化。 有点像betamax库。
该策略将是我最喜欢的实现方式,但必须有人为这样的工具编写实现!
这将是痛苦的并且需要大量的工作,但仍然有很多人尝试这种方法。 但我想不出这样做的充分理由,因为您的目标不是测试 sqlalchemy,而是您自己的代码,并且您最终会模拟 SQLAlchemy 的大部分内容。
如果所有数据库交互都由您自己代码中的接口抽象出来,您只需用模型替换该接口的实现并断言您获得了正确的参数。 好的一面是它很容易测试和维护。 不过,我不建议这样做,因为那样你就不会检查你是否正确使用了 SQLAlchemy 库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.