【问题标题】:What is the proper way to setup and seed a database with artificial data for integration testing使用人工数据设置和播种数据库以进行集成测试的正确方法是什么
【发布时间】:2017-10-30 16:08:56
【问题描述】:

假设我在数据库中有 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 混合在一起,你可以很容易地看到人工记录的数量呈指数增长。想出所有这些人工记录是手动的,因此维护起来很乏味。

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

【问题讨论】:

    标签: java api jvm kotlin integration-testing


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • DbUnit 似乎不处理播种到数据库的数据,尽管它确实提供了一种加载准备好的 xml 数据的方法。
      • 如果您对答案满意,请采纳。谢谢。
      【解决方案3】:

      如果您需要使用 Junit 初始化表和虚拟数据的数据库,

      我正在使用UnitilsDbUnit

      Unitils 中的数据可以从资源文件夹中的 XML 文件加载,因此一旦测试运行程序启动,它将从 xml 加载所有内容并将它们插入数据库,请查看他们网站上的示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多