gpt4 book ai didi

java - SQL 断言 - 在单元测试中比较两个 SQL 查询

转载 作者:行者123 更新时间:2023-11-29 01:39:04 25 4
gpt4 key购买 nike

我正在寻找一种在单元测试中比较两个 MySQL 查询的方法。你知道任何允许这样做的库吗(所有这些断言都应该通过):

SQLAssert.assertEquals("select id, name from users", "select id,     name from users") 
SQLAssert.assertEquals("select id, name from users", "select `id`,`name` from `users`")

最佳答案

虽然针对内存数据库运行查询并比较结果是最好的答案,但我认为还有一些不太全面且更脆弱的选项仍然有用。

在实践中,您很可能可以对查询的语法施加额外的限制。在您的示例中,只有 select 语句,一个表,没有 where 子句,唯一的查询差异是反引号和空格,因此编写一个使用这些约束规范化查询的方法可能是可行的。像这样的东西:

private String normalize(String str) {
return str.replaceAll(" +", " ").replaceAll("`", "");
}

然后可以比较这些规范化的字符串。这种做事方式非常脆弱(因此不是 future 的证明),但这并不意味着它在某些情况下不能提供值(value)。当然,有很多有效的 sql 语句会导致它中断,但您不必处理有效 sql 需要的完整字符串集。您只需处理您的查询使用的任何 sql 子集。

如果您的查询不同到足以使此代码不合理,使用像 JSqlParser 这样的解析器库可能会更容易。解析出各个部分,然后导航结构以进行比较。同样,您不必支持所有 SQL,只需支持您的查询使用的任何子集。此外,测试不必测试完整的逻辑等价性才有用。测试可能只是确保两个查询中提到的所有表都是相同的,而不管连接和排序如何。这并不能使它们等同,但它确实可以防止特定类型的错误并且总比没有有用。

这可能有用的情况示例是,如果您正在对查询构建器进行大量重构,并且您希望确保最终查询是等效的。在这种情况下,您不是在测试查询本身,而是在测试查询构建。

我不建议将此作为单元测试中的常规做法,但我认为它在非常特殊的情况下很有用。

关于java - SQL 断言 - 在单元测试中比较两个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30861433/

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