假设我在数据库中有 2 个表,一个称为 students
,另一个称为 departments
。 students
如下所示:
department_id, student_id, class, name, age, gender, rank
和 departments
看起来像:
department_id, department_name, campus_id, number_of_faculty
我有一个 API 可以查询数据库并从 2 个表中检索各种信息。例如,我有一个端点,可以通过加入 2 个表来获取每个校区的学生人数。
我想对我的 API 端点进行集成测试。为此,我启动了一个本地数据库,运行数据库模式的迁移以创建表,然后用人工记录填充每个表,以便我确切地知道数据库中的内容。但事实证明,想出一个好的播种过程绝非易事。对于我上面描述的简单示例,我当前的方法涉及为每列生成多个不同的记录。例如,我需要至少 2 个校区(比如 main
和 satellite
),以及 3 个部门(比如 Electrical Engineering
和 Mathematics
用于 main
校园,English
用于 satellite
校园)。然后我需要每个部门至少有 2 名学生或总共 6 名学生。而如果我把 gender
、age
和 rank
混合在一起,你可以很容易地看到人工记录的数量呈指数增长。想出所有这些人工记录是手动的,因此维护起来很乏味。
所以我的问题是:一般来说,为集成测试设置和播种数据库的正确方法是什么?
最佳答案
首先,我不知道有任何公共(public)工具可以自动为任意场景生成测试数据。
实际上,总的来说,这是一项艰巨的任务。您可能会寻找有关该主题的科学论文和书籍。其中有可能。不幸的是,我没有推荐一组“好”的。
一种非常简单的方法是从每个字段的一组潜在值(数据库案例中的列)中生成随机数据。 (这是您已经做过的。)对于较小的集合,您甚至可以生成完整的潜在组合集合。例如。你可以看看下面的test data generator例如,应用这种方法的变体。
但是,由于以下原因,这可能不合适:
- 生成的数据将显示出显着的冗余,但可能仍无法涵盖所有有趣的情况。
- 它可能会创建不一致的数据,这与您的应用程序将强制执行的逻辑约束(例如引用完整性)有关
您可以通过在生成测试数据的过程中添加一些约束来解决此类问题,以消除无效或冗余组合(对于您的应用程序)。
但是,可能的实际限制(并且有意义)取决于您的业务和用例。因此,没有关于此类限制的一般规则。例如。如果您的 API 根据年龄和性别的性别组合对年龄值提供特殊处理,那么对于您的测试很重要,如果不存在这种区别,则年龄和性别的任何组合都可以。
只要您正在寻找白盒测试场景,您就需要输入您的实现(或至少是规范)细节。
对于黑盒,测试一整套组合数据就足够了。那么只有减少测试数据以将测试的运行时间保持在某个最大值是一个问题。
在处理白盒测试时,您可能会明确地寻找添加极端情况。例如。在您的情况下:没有任何学生的部门,只有一个学生的部门,没有部门的学生,只要这种情况对您的测试目的有意义。 (例如,在测试错误处理或测试您的应用程序如何处理不一致的数据时。)
在您的情况下,您将 API 视为数据的 主 View 。数据库内容只是实现该 API 的所有有趣输出所必需的输入。识别适当的数据库内容的实际任务可以通过提供与应用程序提供的映射(从数据库内容到 API 结果)相反的数学问题来描述。
在缺乏任何现成工具的情况下,您可以应用以下步骤:
- 从一个简单的组合数据生成器开始
- 应用一些限制来消除无用或非法记录
运行捕获覆盖率数据的测试添加额外的数据记录以改进覆盖率重复测试直到覆盖率OK
在您的代码或架构发生任何更改后查看和调整数据
关于java - 使用人工数据设置和播种数据库以进行集成测试的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019694/