关系数据库回归测试中的数据质量


9

我一直在研究开源的博物馆收藏管理Web应用程序,该应用程序将用于跟踪博物馆的加入,捐赠,借出或以其他方式获得的文物。

这涉及到设计和创建一个相当大的数据库(相对于我以前的经验),该数据库存储各种变化的信息(艺术品信息,更改的位置信息,个人联系信息,图片等),这些信息需要灵活且易于扩展。

我刚刚完成我的大学学位,并且我不是数据库设计方面的专业人士,所以我真的很想创建一个全面的测试套件,以确保我拥有的一切都可以正常使用。

我已阅读了有关数据库测试的内容,并遇到了几篇有关数据库的回归测试的文章,但我不完全了解这一切。通过阅读Dobbs博士的这篇文章,我了解到,我需要做的一种测试是验证数据库中的逻辑是否正确。因此,我将创建将某些数据插入数据库的测试,然后通过查询进行跟踪以确保我从数据库中获取了正确的数据(确保所有适当的触发器或视图都在工作)。

提到测试“数据质量”会引起混乱。在上面的文章中,作者提到您想通过测试验证以下内容:

  • 列域值规则
  • 列默认值规则
  • 价值存在规则
  • 行值规则
  • 尺寸规则

这将涉及哪些类型的测试以及如何实施?这也是我第一次编写数据库测试套件,是否有关于如何/从何开始的良好指导,或者可以遵循的指导测试开发的任何流程?

Answers:


3

对这个问题的完整答案将很长。我会尽力提及要点。

为了分开关注点,您可能正在考虑以下方面的测试:

A-验证数据库设计。

B-验证程序是否与数据库正确交互。

数据库设计验证应由设计数据库的人员执行。开发人员(在进行单元测试时)应更加关注(B)部分。我看到的两种测试之间的主要区别是所使用的工具。对于(A),您将使用与项目代码无关的环境,而对于(B),您当然将使用项目的代码。在下文中,我将两者混合使用。

要回答您的特殊问题:

列域值规则

每列都有一个关联的数据类型。必须根据业务规则验证每一列,以证明它代表正确的数据类型。如果列数据类型与业务需求不兼容,或者代码使用的数据类型与数据库中定义的数据类型不同,则可能会出现问题。

例如:

  • 如果该列定义为small int,则您将无法在其中存储文本。特别是在列为可选列时,这是一项重要的测试,因为在有人实际输入一些数据之前它可能不会被注意到。

  • 您能否在业务需要发生此情况的列中存储负值?

列默认值规则

某些列与DDL(数据定义语言)中的默认值规范相关联,如果在插入过程中插入不提供值,则数据库将采用默认值。可以通过不传递值并观察数据库存储的结果值来进行测试。此测试还可能包括检查可空列。这很少需要测试,因为可以从DDL进行验证,除非在该列上建立了唯一索引。

价值存在规则

据我了解,您可以验证插入或更新的数据是否按预期显示在数据库中。

行值规则

我不清楚这到底是什么意思。

尺寸规则

数据库中每列的大小取决于DDL中的定义。您想确保所有符合要求的值(从GUI输入或作为计算结果输出)都将正确存储在该列中。例如,小整数数据类型不允许您存储50亿的值。此外,定义为VARCHAR2(30)的名称将不能容纳40个字符,因此,业务规则在这里必须非常清楚,尤其是当该列用于汇总数据时。您想测试在这种情况下会发生什么。

有关如何/从哪里开始的指南

一种方法是提出一个测试计划。您要确保使用的是正确版本的规范(例如需求文档和用例)和软件。您还需要使这些测试与单元测试(如果有)进行的测试相协调。您可能会发现不需要再次执行的重复测试。您想要在测试之前制作数据库的副本,以便在需要时可以重复特定的测试。DBA可能会帮助您。您还需要与团队联系,他们如何记录这些测试并与他们一起验证测试范围。您可以将数据库分为逻辑部分,然后分别开始测试每个逻辑部分。测试过程可以通过研究数据库的DDL并验证列是否按照业务要求正确定义而开始。您应该使用该应用程序的软件而不是任何其他工具来执行大多数测试。例如,对以下问题提出疑问:

  • 该列是否应为已定义的类型(将Name命名为Int毫无意义)。

  • 尺寸是否符合业务要求?

  • 是否在数据库中找到业务需求中的所有列?

  • 空列真的是可选的吗?

  • 等等

接下来,您可以设计测试用例来测试上述内容。您可以使用GUI进行大多数测试。

您还没有提到其他重要的数据库测试。这些处理:

1-从业务角度测试主键确实是唯一的。

2-从业务角度测试唯一索引(除了PK之外)确实是唯一的。

3-测试外键约束工作。

4-测试删除行时发生的情况及其对相关行的影响。

5-有关特殊数据库结构(如CHEKC),触发器(如果存在)的其他测试。

6-正确的表规范化,并且规范化的列包含正确的值。

上面的列表并不完整,但可以帮助您入门。


感谢您提供详细的答案,您对测试开发的建议似乎是一个不错的起点。谢谢你的帮助。
克里斯汀·D。12年

克里斯汀·D。@Songo非常感谢您的反馈。
NoChance 2012年

1

我认为您正在以错误的方式进行处理。

我知道的任何数据库都会在将数据插入表之前先对其进行验证-它将根据每一列的定义对其进行验证。您不能在SMALLINT(3)列中输入80字符串-数据库将失败该尝试,并让您知道您犯了一个错误。您无需通过插入数据然后检索数据来进行测试。

您想要拥有的是在将数据发送到数据库之前对数据进行验证/过滤的规则。

  • 确保数据适合每一列的可接受类型和范围,并过滤不需要的内容
  • 确保正确地对其进行转义以避免错误(如果有公共接口,还可能进行SQL注入)

这些验证/过滤规则应在实际应用程序中的数据上运行。然后,您可以通过向测试提供正确和不正确的数据来确保它们正确或正确地通过验证,从而设置测试以确保它们正确。

就数据库设计而言,您无法真正通过测试来验证它-因为许多设计即使不理想也可以工作(理想的定义在不同的人之间发生了变化)。正确的数据库设计需要经验和知识,而不能进行自动测试。


我看到了您来自哪里,我完全打算创建和测试过滤器,以在数据未到达数据库之前就对数据进行验证,但是在这个问题上,我的主要目的是尝试验证数据库的设计(在实际操作之前,我会尽可能地多使用它),并验证实际存在的功能是否按预期工作(例如,确保未破坏外键约束,如他的答案中提到的@EmmadKareem。感谢您提出数据验证,尽管它是非常必要的)使用数据库的任何应用程序的一部分
Kristen D.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.