【问题标题】:managing test data for large applications管理大型应用程序的测试数据
【发布时间】:2014-07-05 19:22:47
【问题描述】:

我有一个相对较大的 web api 应用程序,即它目前有大约 300 个表。

应用程序的编写方式不使用任何存储过程并且几乎没有视图,即业务逻辑都在应用程序代码中。它使用存储库模式,因此为我们的单元测试创​​建模拟数据相对容易。

但是,管理模拟数据非常困难,而且任何给定的个人都很难深入了解已经存在的数据。我们尝试将测试数据移动到模拟工厂,以便将其存储在单个文件中,然后根据需要加载各种测试(即给定测试只需要数据的某个子集,因此它只会要求该子集)。

尽管如此,数据的管理还是相当复杂的,断言从应用程序返回的数据也很脆弱。例如,假设在我们的模拟数据中定义了 10 个客户,其中 2 个被标记为不活跃。我们可能有一个测试用例,它测试应该返回所有活跃客户的方法应该返回 8 个实例。但是,如果开发人员必须向我们的测试数据添加一个新实例,这将破坏现有的测试/断言。

有没有人有管理这方面的经验,或者有任何关于这方面的文章?

【问题讨论】:

  • 对每个测试使用特定的模拟,即不共享数据。此外,具体(匿名)代码示例会有所帮助。

标签: unit-testing tdd test-data large-data


【解决方案1】:

听起来您正在创建一个用于多个测试的测试数据。这不是最好的解决方案。您应该在每个测试的基础上创建您需要的数据。测试数据构建器模式应该在这里为您提供帮助。这个link 描述了您将如何使用测试数据生成器。此外,Mark Seemann 还编写了一个库来帮助构建这种名为 autofixture 的模拟数据。

他在advanced unit testing 上有一个关于 PluralSight 的精彩视频。如果您可以访问 PluralSight,我建议您观看视频。

【讨论】:

  • 是的,这是正确的,我同意这有其缺点。为每个测试创建测试数据也有其自身的缺点,即它可能会导致重复数据。我想那里有一条中间道路,我只需要找到它。
  • 我不确定我是否遵循。如果您采用上面的示例并应用测试数据构建器,构建器将看起来像这样。 var cust1 = CreateCustomerBuilder().WithInactiveSetTo(true).Build(); var cust2 CreateCustomerBuilder().WithInactiveSetTo(false).Build();您不再需要任何行来测试是否创建了非活动客户。您也不需要知道客户的任何其他属性的值。测试数据生成器可以分配随机值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2011-08-16
  • 2013-03-26
  • 1970-01-01
  • 2013-02-10
  • 1970-01-01
  • 2019-05-21
相关资源
最近更新 更多