繁体   English   中英

Flask 中 SQLAlchemy 的真实单元测试

[英]Real Unit Testing of SQLAlchemy in Flask

我正在网络和 SO 中搜索诸如“单元测试 sqlalchemy”之类的键,但所有答案都涉及创建真实的数据库(sqlite、postgres)来测试它。 当你创建真实的东西时,它不是单元测试。

创建 sqlite DB 与在磁盘上创建文件没有什么不同,但令人惊讶的是人们希望只模拟后者。 我已经尝试使用 setUp 和 sys.modules 来模拟 db 导入,它可以工作,但它模拟的太多,并且使用模型作为测试对象并非易事(模拟不支持所有需要的东西,例如next

是否有任何技术可以模拟数据库行为(创建数据库、提交、查询)但仍然可以访问模型以对它们进行基本检查? 也许有一些库可以模拟连接?

跟进我的“这个 Q 将被关闭”,我相信没有单一的权威方法可以做到这一点,您需要选择如何模拟事物。

基本上,SQLAlchemy 是数据库设计和查询的抽象。 这意味着,您可以将模型放置在抽象中的不同位置:

  1. 真实数据库,带有测试数据

你可以设置一个sqlite实例。 这个解决方案的优点是你不需要调整/猴子补丁python堆栈中的任何东西,因为你正在改变系统前沿的东西,缺点是需要更多的维护工作,因此风险更大。

  • 带有数据文件

并将这些数据文件作为资源存储在您的代码中。 然后为正在运行的测试加载正确的数据库。 您将需要一个tearDown()方法来在测试后将数据库恢复到其原始状态。 好的一面是它很容易用很少的代码实现,但如果你修改你的模型,这将是一项艰巨的工作。

  • 使用内存数据库

在那里你用setUp()方法填充你的数据,并且没有 db 可以存储在你的 git 中或处理你的代码之外。 尽管如此,您仍然需要维护大量的setUp()代码。

比照那个答案

该策略将是最常用和建议的策略。

  1. 模拟数据库访问

另一种方式,通常用于模拟 HTTP 连接,它是序列化 SA 和数据库之间通信的输出和输入。 我不知道有图书馆这样做,但这将是一件很棒的事情。

基本上,想象一个包含所有发送到数据库的请求和从数据库返回的数据的 JSON 文件。 每次播放测试时,您只是在重播该 JSON 记录。

当您进行更改时,您可以记录 I/O 交互并将它们序列化。 有点像betamax库。

该策略将是我最喜欢的实现方式,但必须有人为这样的工具编写实现!

  1. 模拟/猴子补丁 sqlalchemy 的各个元素

这将是痛苦的并且需要大量的工作,但仍然有很多人尝试这种方法。 但我想不出这样做的充分理由,因为您的目标不是测试 sqlalchemy,而是您自己的代码,并且您最终会模拟 SQLAlchemy 的大部分内容。

  1. 代码中所有数据库交互的抽象

如果所有数据库交互都由您自己代码中的接口抽象出来,您只需用模型替换该接口的实现并断言您获得了正确的参数。 好的一面是它很容易测试和维护。 不过,我不建议这样做,因为那样你就不会检查你是否正确使用了 SQLAlchemy 库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM