对象母亲

2006年10月24日

对象母亲是一种在测试中使用的类,用于帮助创建用于测试的示例对象。

当你在一个相当大的系统中编写测试时,你会发现你需要创建大量的示例数据。如果我想测试员工的病假工资计算,我需要一个员工。但这不仅仅是一个简单的对象 - 我需要员工的婚姻状况、受抚养人数量、一些工作和工资历史。这可能需要创建很多对象。这组数据通常被称为测试夹具。

第一步是在 xunit 测试的设置方法中创建夹具 - 这样它就可以在多个测试中重复使用。但这样做的问题是,你经常需要在多个测试类中使用类似的数据。此时,使用一个工厂对象来返回标准夹具是有意义的。也许是“John”,一个上周刚入职的员工;“Heather”,一个已经工作了十年的员工。

对象母亲只是这种工厂的一个朗朗上口的名称。这个名字是在世纪之交的 Thoughtworks 项目中创造的,它足够朗朗上口,一直沿用至今。

对象母亲产生的罐装对象对团队来说很熟悉,甚至会侵入与用户的讨论。这样一来,它们就类似于角色的概念 - 虽然它们并不总是人。它们可能是保险单、供应合同,任何测试框架需要的任何数据。在多个测试中使用类似的数据有助于人们熟悉你正在使用的示例。

这些罐装对象通常并不完全适合特定的测试,但通常可以通过一些额外的设置来调整。“让我们把 John 弄成两个月前生病的。”偶尔你需要在母亲那里添加一个新的罐装对象,但如果可以的话,尽量调整现有的对象 - 这样测试的读者如果熟悉现有的罐装对象,就会更快地理解。

通常你会需要几种类型的对象,所以为不同的类创建不同的母亲很方便:例如 CustomerMotherProductMother 等。

对象母亲确实有缺点。特别是,存在着大量的耦合,因为许多测试将依赖于母亲中的确切数据。因此,如果你想出于任何原因更改标准数据,就会很麻烦。对类的更改也会导致需要迁移测试 - 尽管这在任何情况下都会是一个问题。

进一步阅读

Peter Schuh 和 Stephanie Punke 为 XP Universe 撰写了一篇关于对象母亲的 论文