如何为 SQL 语句创建单元测试?

Posted

技术标签:

【中文标题】如何为 SQL 语句创建单元测试?【英文标题】:How can I create a unit test for SQL statements? 【发布时间】:2019-11-21 20:30:23 【问题描述】:

我有几个 SQL 语句存储为由 Python 脚本执行的文件。该数据库托管在 Snowflake 中,我使用 Snowflake SQLAlchemy 连接到它。

如何测试这些语句?我不想执行它们,我只想检查它们是否可以执行。

检查它是否是有效的标准 SQL 是一件非常基本的事情。更好的答案是考虑雪花特有的东西,比如

copy into s3://example from table ...

最好的答案是同时检查权限,例如如果表可见/可读,则用于 SELECT 语句。

【问题讨论】:

典型的 Python(和其他语言)unit 测试只会模拟数据库并专注于软件。如果您真的希望您的单元测试能够命中数据库,那么它就不再是单元测试,而是集成测试。如果 Python 有一个内存数据库,你也许可以将它用于严格的单元测试。 啊,好的。所以你建议使用 sqlite 创建一个假数据库进行本地测试? 内存数据库是一种选择。除此之外,Python 也无能为力,比如编写 SQL 解析器等。 【参考方案1】:

内存中的 sqlite 数据库是一种选择。但是,如果您在代码中对雪花执行原始 SQL 查询,如果相同的语法对 sqlite 无效,您的测试可能会失败。针对测试雪花数据库记录您的 HTTP 请求,然后为您的单元测试重放它们更适合此目的。有两个非常好的库可以做到这一点,请查看:

    vcrpy betamax

【讨论】:

【参考方案2】:

我们确实在我们的 Snowflake 数据库上运行集成测试。我们维护生产数据库的克隆,例如,我们的一个生产数据库称为data_lake,我们维护一个每晚克隆的克隆,称为data_lake_test,用于运行我们的集成测试。

就像 Tim Biegeleisen 提到的,“真正的”单元测试会模拟响应,但我们的集成测试会在我们的 test 克隆数据库上运行真正的 Snowflake 查询。测试可能会极大地改变 test 数据库,但我们仅在 CI/CD 过程中运行集成测试,因此很少会在两个测试之间发生冲突。

【讨论】:

【参考方案3】:

我非常喜欢这个想法,但是我可以建议一种解决方法,因为我经常需要检查我的语法并需要帮助。如果您计划使用 Snowflake 接口,我建议您确保在需要验证的 SELECT 语句上使用 LIMIT 10 或 LIMIT 1。

如果您刚刚开始,我建议的另一个提示是与 Snowflake 代表讨论试用。他们还将为您寻求验证的更具体的查询提供很多提示。

最后,基于一些 cmets,确保它使用 SQL: ANSI 和 https://docs.snowflake.net/manuals/index.html 中的 live 以供参考。

【讨论】:

【参考方案4】:

至于 sql 语句的有效性是一个问题,您可以运行该语句的解释,如果语法不正确或您没有访问对象/数据库的权限,它应该会给您错误。仍然存在一些您无法运行解释的异常,例如我认为不需要验证的“使用”命令。

希望这会有所帮助。

【讨论】:

以上是关于如何为 SQL 语句创建单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 iPhone 应用程序运行和调试单元测试

如何为 Xamarin 库项目(iOS 和 Android)运行单元测试?

Spring Boot:如何为删除其余模板编写单元测试用例

如何为具有 Spring Security 配置的 Spring Boot API 编写单元测试

如何为 UserDefaults 编写单元测试

如何为@KafkaListener 编写单元测试?