使用人工数据设置数据库和种子以进行集成测试的正确方法是什么

2022-09-04 23:00:03

假设我在一个数据库中有 2 个表,一个称为 ,另一个称为 。 如下所示:studentsdepartmentsstudents

department_id, student_id, class, name, age, gender, rank

看起来像这样:departments

department_id, department_name, campus_id, number_of_faculty

我有一个API,可以查询数据库并从2个表中检索各种信息。例如,我有一个端点,可以通过加入2个表来获得每个校园的学生数量。

我想对我的 API 端点进行集成测试。为此,我启动了一个本地数据库,运行数据库架构的迁移以创建表,然后用人工记录填充每个表,以便我确切地知道数据库中的内容。但是,事实证明,提出一个好的播种过程绝非易事。对于我上面描述的简单示例,我目前的方法涉及为每个列生成多个不同的记录。例如,我至少需要 2 个校区(比如 and)和 3 个部门(比如和校园和校园)。然后,每个部门至少需要2名学生或总共6名学生。如果我混合使用 和 ,你可以很容易地看到人工记录的数量呈指数级增长。提出所有这些人工记录是手动的,因此维护起来很乏味。mainsatelliteElectrical EngineeringMathematicsmainEnglishsatellitegenderagerank

所以我的问题是:一般来说,为集成测试设置和种子数据库的正确方法是什么?


答案 1

首先,我不知道有任何公共工具可以自动执行为任意场景生成测试数据的任务。

实际上,这通常是一项艰巨的任务。您可以寻找有关该主题的科学论文和书籍。有可能。不幸的是,我对一组“好”的建议没有建议。

一种非常简单的方法是从每个字段(数据库情况下的列)的一组潜在值中生成随机数据。(这是你已经做过的。对于较小的集合,您甚至可以生成完整的潜在组合集。例如,您可以查看以下测试数据生成器,以获取应用此类方法的变体的示例。

但是,这可能不合适,原因如下:

  • 由此产生的数据将表现出明显的冗余,而它可能仍然不能涵盖所有有趣的情况。
  • 它可能会创建与应用程序将强制实施的逻辑约束不一致的数据(例如,引用完整性)

您可以通过在生成测试数据的过程中添加一些约束来消除无效或冗余的组合(相对于您的应用程序)来解决这些问题。

但是,实际可能的限制(并且有意义)取决于您的业务和用例。因此,没有关于此类限制的一般规则。例如,如果您的API根据年龄和性别的性别组合为年龄值提供特殊处理,则对于您的测试很重要,如果不存在这种区别,则年龄和性别的任何组合都可以。

只要您正在寻找白盒测试方案,就需要输入您的实现(或至少是规范)详细信息。

对于黑盒测试,一整套组合数据就足够了。然后,仅减少测试数据以将测试的运行时间保持在某个最大值内是一个问题。

在处理白盒测试时,您可能会明确地寻找添加角落情况。例如,在你的情况下:没有任何学生的部门,只有一个学生的部门,没有部门的学生,只要这种情况对你的测试目的有意义。(例如,在测试错误处理或测试应用程序如何处理不一致的数据时。

在你的例子中,你将API视为数据的主要视图。数据库内容只是实现该 API 的所有有趣输出所需的输入。识别正确数据库内容的实际任务可以通过提供与应用程序提供的映射(从数据库内容到 API 结果)相反的数学问题来描述。

在没有任何现成工具的情况下,您可以应用以下步骤:

  1. 从简单的组合数据生成器开始
  2. 应用一些限制,消除无用非法记录
  3. 运行测试捕获覆盖率数据,添加额外的数据记录,以改善覆盖率重复测试,直到覆盖率正常

  4. 在对代码或架构进行任何更改后查看和调整数据


答案 2

我认为 DbUnit 可能是您尝试执行操作的正确工具。您可以在测试之前指定数据库的状态,并在测试之后检查预期的状态。


推荐