gpt4 book ai didi

python - Flask 中 SQLAlchemy 的真实单元测试

转载 作者:行者123 更新时间:2023-11-28 22:26:46 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

  • 带有数据文件

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

  • 使用内存数据库

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

比照that answer

That strategy would be the most commonly used and advised one.

  1. 模拟数据库访问

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

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

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

That strategy would be my favourite way of implementing it, but someone has to write the implementation for such a tool!

  1. mock/monkey 修补 sqlalchemy 的各个元素

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

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

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

关于python - Flask 中 SQLAlchemy 的真实单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44539816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com