为单元测试创​​建模拟数据

时间:2009-02-27 18:12:58

标签: tdd mocking

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

我喜欢一些更好的方法。

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

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果您正在使用.Net,请尝试NDBUnit

您填充商店,然后在测试时将数据库恢复为已知状态,以进行每项测试。 Autumn of Agile屏幕演员系列非常详细地展示了这一点。

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

答案 3 :(得分:0)

我确切地知道你的意思。我认为解决这个问题的一个好方法是实际上有一个单独的MockFramework项目,它包含测试项目之外的所有模拟数据。这样,您可以单独生成模拟数据,如果您愿意,可以将其存储在内存中,然后从测试项目中引用模拟框架。如果您使用第三方框架来做到这一点,那就更好了,但是您仍然可以将第三方框架包装在您自己的模拟框架中,这样您就可以获得创建模拟数据的所有“粘合”,就像您需要它一样。你的测试,所以测试真的只是他们需要的。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

Untils.org 比以往更好地涵盖了这种方式。

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

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