【问题标题】:Where to keep unit test data?在哪里保存单元测试数据?
【发布时间】:2014-02-14 04:13:54
【问题描述】:

我试图以一种简洁优雅的方式来保持填充模拟对象的测试数据。我知道有些测试对数据非常具体,即一些算法会根据审计师的偏好分配公司进行审计。

通常在我的安排下,我会使用我的虚假测试数据设置模拟,在我调用分配服务的行为时,我会确保分配正确的公司。

在何处保留和重复使用测试数据的最佳做法是什么?我什么时候真的需要硬编码数据?

【问题讨论】:

    标签: unit-testing testing tdd moq bdd


    【解决方案1】:

    使用单元测试需要记住的是,您希望单独测试单个工作单元(通常是单个方法)(它的依赖项已被模拟/存根,因此它们不会影响方法中的逻辑正在测试中)。这就是你的模拟对象发挥作用的地方。请注意,您的模拟通常不需要返回大量数据,您只需要返回最小的 expected 结果,以确保模拟的依赖项不会对您的测试方法产生意外影响.单元测试中的大型设置(排列)被认为是代码异味。在这种情况下,您应该考虑代码的设计。

    话虽如此,减少此设置代码的一种方法是使用测试数据构建器模式。 这是一篇关于“Test Data Builder”的文章的链接。

    许多测试框架允许测试设置和拆卸。我倾向于避免使用设置方法,因为这会使测试更难阅读和理解。

    另外,我的一位同事正在撰写一系列关于 TDD 的博客。他拥有十多年的 TDD 经验,他的博客文章非常清晰和富有洞察力。您可以查看here

    【讨论】:

    • 同意代码气味位。这听起来更像是集成测试而不是单元测试。
    • 我实际上不同意你的一些观点。对于在整个代码库中重用的实用程序类,应该在方法级别进行隔离。但是,当您测试在大型 api 上提供的功能/行为时,您需要超越方法测试。工作单元隔离从根本上意味着您的单元:不与数据库对话。不通过网络进行通信。不接触文件系统。
    • 如果你还没有读过,我建议你阅读 Mark Seemann(AutoFixture 的作者)的“.Net 中的依赖注入”。他还在 PluralSight 上有一个精彩的视频,名为“高级单元测试”。
    【解决方案2】:

    正如 Andrew 所说,通常 TestDataBuilder/TestObjectBuilder 模式可能是最简洁的方法,尤其是在处理集成测试时。其他任何东西(csvs、数据库等)都会引入额外的间接级别。

    但是,如果您在 .Net 世界中,我会强烈敦促您查看 AutoFixture,它可以自动化这些模式(以及更多),并且在许多情况下可以自动为您生成测试数据。例如这里是一个 sn-p:

    var fixture = new Fixture();
    var expectedUsers = fixture.CreateMany<User>(3);
    

    这会根据预定义或可自定义的算法自动生成 3 个具有伪随机值的用户。

    使用 AutoFixture,对于大多数测试,您不再需要担心测试数据的内容,您只需使用它为您提供的自动生成的测试数据即可。

    如果您不在 .Net 世界中,可能有类似的框架可用于生成测试数据。

    【讨论】:

      猜你喜欢
      • 2010-10-27
      • 2014-05-24
      • 2018-01-04
      • 2016-11-09
      • 2010-09-08
      • 1970-01-01
      • 2012-07-07
      • 2012-03-21
      相关资源
      最近更新 更多