我正试图以干净优雅的方式来保持测试数据填充模拟对象。我知道有些测试是非常明确的数据,即一些根据审计师的偏好指定公司进行审计的算法。
通常在我的安排中,我会根据我的假测试数据设置模拟,我会调用分配服务的行为,并且在我的断言中我确保分配了正确的公司。
在何处保留和重用测试数据的最佳做法是什么?什么时候我真的需要硬编码数据?
答案 0 :(得分:4)
单元测试需要记住的是,您希望单独测试单个工作单元(通常是单个方法)(它的依赖项已被模拟/存根,因此它们不会影响方法中的逻辑在测试中)。这就是你的模拟对象发挥作用的地方。请注意,您的模拟通常不需要返回大量数据,您只需返回最小的预期结果,以确保模拟的依赖项不会对您测试的方法产生意外影响。单元测试中的大型设置(排列)被认为是代码气味。在这种情况下,您应该考虑代码的设计。
说过减少此设置代码的一种方法是使用测试数据构建器模式。 以下是“Test Data Builder”上文章的链接。
许多测试框架允许进行测试设置和拆卸。我倾向于避免使用设置方法,因为这会使测试更难以阅读和理解。
此外,我的一位同事正在撰写一系列关于TDD的博客。他拥有超过十年的TDD经验,他的博客文章非常清晰,富有洞察力。您可以查看here。
答案 1 :(得分:3)
正如安德鲁所说,通常TestDataBuilder / TestObjectBuilder模式可能是最干净的方式,尤其是在处理集成测试时。其他任何东西(csvs,数据库等......)引入了额外的间接层。
但是,如果你在.Net世界,我会强烈强烈要求你看看AutoFixture自动化这些模式(以及更多),以及很多情况下都可以自动为您生成测试数据。例如,这是一个片段:
var fixture = new Fixture();
var expectedUsers = fixture.CreateMany<User>(3);
这将根据预定义或可自定义的算法自动生成3个具有伪随机值的用户。
使用AutoFixture,对于大多数测试,您不再需要担心测试数据的内容,您可以使用它为您提供的自动生成的测试数据。
如果您不在.Net世界中,可能会有类似的框架可用于生成测试数据。