【问题标题】:Creating mock data for unit testing为单元测试创​​建模拟数据
【发布时间】:2010-11-23 11:31:17
【问题描述】:

我认为自己对 TDD 场景还是很陌生。但是发现无论我使用哪种方法(模拟框架或存根我自己的对象)我发现我必须编写大量代码来创建模拟数据。我喜欢加载对象以创建内存数据库的想法。但是我不喜欢为了创建模拟数据的唯一目的而用大量代码使我的测试变得混乱。当数据需要考虑所有不同情况时尤其如此。

我很乐意提供一些建议以更好地执行此操作。

在我看来,我应该能够一次将数据从某个数据存储加载到已知状态,然后我可以使用该状态的快照,该快照在每个测试方法之前加载到测试设置/初始化中执行。这将满足正确的测试实践,同时提供便利,让我专注于编写测试而不是编写代码来“手动”创建测试数据。

【问题讨论】:

    标签: tdd mocking


    【解决方案1】:

    也许你可以试试 NBuilder 库。它提供了一个非常流畅的界面并且易于使用。您可以使用它来生成具有默认值的类的单个实例,或者生成具有默认值或覆盖值的列表。你可以看看this一个。

    【讨论】:

    • 很好,这正是我想要的。我放弃了,因为我没有找到我真正喜欢的东西。当数据值不那么重要,只要它们与生成的原始值匹配,这很好。
    【解决方案2】:

    如果您使用的是 .Net,请尝试NDBUnit

    您填充您的商店,然后它会在每次测试时将您的数据库恢复到测试时的已知状态。 Autumn of Agile 截屏系列非常详细地展示了这一点。

    或者您可以手动执行此操作...构建一个存储过程或其他任何东西来截断您的表并在您的拆卸方法中复制数据。

    【讨论】:

    • Freddy Rios 关于您的第二条评论是正确的。 nDbUnit 很接近,但我似乎找不到任何文档。我从 Autumn of Agile 下载了代码示例,看起来我需要一个 xsd,而且我已经在使用实体框架,所以我必须将所有内容从 xsd 复制到 EF。
    • XSD 仅用于将当前数据输出到 xml 文件,然后在测试完成后将其读回。 @Freddy Dunno 关于这一点......我从第一步开始......不会认为这是一个集成测试本身。
    【解决方案3】:

    您可以使用 Builder 类来帮助您构建所需的实例/在这种情况下,您将使用与存储库相关的实例。 让 Builder 使用适当的默认值,并且在您的测试中,您可以覆盖您需要的内容。这可以帮助您避免需要为所有不同的测试混合每个“数据”案例(这会带来问题,因为通常有些案例与不同的测试不兼容)。

    **更新一:**看看www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

    【讨论】:

    • 感谢您的链接,它帮助我更好地了解您的意思。这仍然需要我手写对象,只是不同。但是,您提出了一个很好的观点,即不要将每个案例都放入“数据”中。
    • 请注意,使用默认值的目的是让您能够拥有共享的配置/数据,但不会在特定情况下全部丢失。
    【解决方案4】:

    我完全明白你的意思。我认为解决这个问题的一个好方法是在测试项目之外有一个单独的 MockFramework 项目来容纳你所有的模拟数据。通过这种方式,您可以单独生成模拟数据,如果需要,将其存储在内存中,然后从测试项目中引用模拟框架。如果您使用第三方框架来执行此操作,那就更好了,但您仍然可以将该第三方框架包装在您自己的模拟框架中,这样您就可以获得所有以您需要的方式创建模拟数据的“胶水”你的测试,所以测试真的可以只是他们需要的。

    【讨论】:

    • 这解决了杂乱的问题,但我仍然需要模拟所有数据,只是在一个单独的项目中。也许,正如您所建议的,我可以使用第 3 方框架来加载数据并将其转换为我的对象模型。正如 webjedi 所建议的,nDbUnit 可以工作。
    【解决方案5】:

    感谢所有建议,我认为解决方案需要一点点的一切。我不希望这些测试最终成为回归测试,但是如果没有某种现有的数据存储,一切仍然归结为通过“手动”构建对象来创建数据。

    真正好的是一个框架,它允许我使用我现有的 DAL 来编写数据脚本为我编写代码,或者获取内存中的数据并像内存数据库一样访问它。

    【讨论】:

      【解决方案6】:

      Untils.org 以这种方式比以往任何时候都好。

      他们的整个指南实际上非常好。

      但基本上,如果您的单元需要“大量数据”,它们可能不再是单元测试。我建议尝试单独测试较小的部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 2016-12-31
        相关资源
        最近更新 更多