这些天我正在处理一些商业情报报告。数据由普通的SQL SELECT语句提取。这些陈述变得越来越复杂。
我要报告的数据部分是关键业务。如果我能做些什么来证明SQL语句的正确性和质量,我会感觉更好。
我知道有一些方法可以为应用程序代码执行此操作。但是,如何在SQL级别实现这些目标呢?
提前致谢。
答案 0 :(得分:7)
我不知道你可以做的任何SQL级别的QA证明,因为你正在寻找查询的意图(语义)而不是语法正确性。
我会编写一个小测试工具,它接受SQL语句并在已知的测试数据库上运行它,然后将结果与一组excetd参考数据(电子表格,简单的CSV文件等)进行比较。
奖励积分将其包含在单元测试中,并使其成为持续构建过程的一部分。
如果您使用电子表格或CSV作为参考数据,则可以与业务用户一起浏览它,以便在编写SQL之前捕获他们的需求(即测试驱动开发)。
答案 1 :(得分:1)
测试语句的正确性需要详细描述生成报告要求的逻辑,然后独立于您的SQL创建适当的测试数据集,根据要求构建以确保正确的数据,并且只有为每个测试用例选择了正确的数据。
在越来越复杂的条件下构建这些案例将变得非常困难 - 报告因不断变化的要求而臭名昭着。
答案 2 :(得分:1)
您还可以考虑捕获指标,例如运行每个语句的持续时间。您可以在应用程序级别执行此操作,也可以在每个SQL语句的开头和结尾写入审计表。如果您的语句封装在存储过程中,这将变得更容易,并且还可以用于监视调用过程的人员,在一天中的什么时间以及从哪里开始。
答案 3 :(得分:1)
期待阅读这篇文章的答案。检查语句是否有效很简单,无论是运行还是不运行。您还可以检查需求,是否按指定的顺序返回这14列。
很难检查结果集是否正确答案。当您有数百万行的表连接到具有数百万行的其他表时,您无法在物理上检查所有内容以了解结果应该是什么。我喜欢在具有已知条件的情况下运行测试数据库的理论,但是构建这个,并考虑可能影响生产中数据的边缘情况,我认为很难解决这个问题。
您有时可以通过某种方式查看事物,告诉您事情是否正确。有时我会在报表查询中添加一个小的限制where子句来获取我可以手动检查的结果集。 (只说几天的记录)。然后我分别进入数据库表,看看它们是否与我的相符。例如,如果我知道在那个时间段内客户有12次会议,我得到的结果是什么?哦,我有14,嗯必须是其中一个连接需要更多的限制数据(有两个记录,我只想要最新的一个)或者我得到10,然后我弄清楚什么是消除其他两个(通常是一个连接应该是一个左连接还是一个条件)这两个是否应该与我已经给出的业务规则一起丢失。
通常在构建时,我会返回比实际需要更多的列,以便我可以看到其他数据,这可能会让您意识到您忘记过滤掉需要在意外值出现时进行过滤的内容。< / p>
我仔细查看结果的数量,并添加联接和条件。它们是上升还是下降,如果是我想要的话。
如果我有一个当前正在返回数据的地方,我可以期待我的用户将此报告与之比较,我会看到那里。例如,如果他们可以在网站上搜索可用的扬声器,并且我正在向扬声器数据的客户端进行导出,则两者之间的总数可以更好地匹配,或者可以通过不同的业务规则进行解释。
在进行报告时,报告的用户通常比开发人员更了解数据的内容。我总是要求其中一个人查看qa数据并确认reort是否正确。他们经常会说出XYZ项目发生的事情,应该在这份报告上。然后你知道看看那个特别的情况。
您需要测试的另一件事,不仅仅是数据的正确性,还有性能。如果您只针对一个小型测试数据库进行测试,那么您可能有一个查询可以获取正确的数据,但每次尝试使用较大的数据集在prod上运行时都会超时。所以永远不要只针对有限的数据集进行测试。并且如果可能的话也运行负载测试。您不希望错误的查询删除您的prod系统并使其成为存在问题的第一个指标。
答案 4 :(得分:0)
测试SQL是否正确是相当困难的。我的一个想法是编写一个将半随机数据插入数据库的程序。由于程序生成数据,程序也可以从内部进行计算并产生预期结果。运行SQL并比较程序是否产生与SQL相同的结果。
如果程序和SQL的结果不同,那么这个测试会引发一个标志,表明在SQL,测试程序或两者中都可能存在逻辑问题。
编写单元测试程序来计算结果可能非常耗时,但至少你有程序可以进行验证。
答案 5 :(得分:0)
添加有关此主题的一些新闻,我发现这个项目https://querycert.github.io/index.html用他们自己的话说:
Q * cert是一个查询编译器:它接受一些输入查询并生成要执行的代码。它可以编译几种源查询语言,例如SQL和OQL(的子集)。它可以为多个目标后端生成代码,例如Java,JavaScript,Cloudant和Spark。
使用Coq可以证明这些语言的属性,验证从一种语言到另一种语言的翻译的正确性,并检查优化是否正确
此外,您还应该看看珂赛特http://cosette.cs.washington.edu/
Cosette是用于检查SQL查询是否等效的自动证明程序。它在Coq Proof Assistant和Rosette符号虚拟机中正式化了SQL的实质片段。对于一对给定的查询,它返回等效的形式证明或反例。
如果您对要在Coq中构建的内容有了正式定义,那么Q * cert似乎会更好,但是如果您尝试重写某些查询但确保获得相同的结果,则Cosette会更好。 >