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

标签 java api jvm kotlin integration-testing

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

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

departments 看起来像:

department_id, department_name, campus_id, number_of_faculty

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

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

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

最佳答案

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

实际上,总的来说,这是一项艰巨的任务。您可能会寻找有关该主题的科学论文和书籍。其中有可能。不幸的是,我没有推荐一组“好”的。

一种非常简单的方法是从每个字段的一组潜在值(数据库案例中的列)中生成随机数据。 (这是您已经做过的。)对于较小的集合,您甚至可以生成完整的潜在组合集合。例如。你可以看看下面的test data generator例如,应用这种方法的变体。

但是,由于以下原因,这可能不合适:

  • 生成的数据将显示出显着的冗余,但可能仍无法涵盖所有​​有趣的情况。
  • 它可能会创建不一致的数据,这与您的应用程序将强制执行的逻辑约束(例如引用完整性)有关

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

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

只要您正在寻找白盒测试场景,您就需要输入您的实现(或至少是规范)细节。

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

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

在您的情况下,您将 API 视为数据的 View 。数据库内容只是实现该 API 的所有有趣输出所必需的输入。识别适当的数据库内容的实际任务可以通过提供与应用程序提供的映射(从数据库内容到 API 结果)相反的数学问题来描述。

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

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

  4. 在您的代码或架构发生任何更改后查看和调整数据

关于java - 使用人工数据设置和播种数据库以进行集成测试的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019694/

相关文章:

java - 不同jar中的相同功能

java - android-radioButton 返回 id

java - 如何创建声音淡出效果

java - AlwaysPretouch 是否会导致触摸 -Xms 或 -Xmx 内的页面?

java - 等待一系列脚本中的单个 Shell 脚本运行完成后再继续(Java、MySQL、JUnit)

api - react_with 在 rails 4.2 中的替代方案用于主干

javascript - 如何将用户从 NodeJS 服务器发布到页面?

java - JVM 是如何开始寻找类的?

java - "VerifyError: Expecting to find object/array on stack"在Java中使用ASM监控对象创建时?

api - 在 REST API 中返回绝对 URI 与相对 URI