单元测试 – 关于如何编写重构友好单元TDD测试的提示
我一直在ASP.NET MVC项目工作大概8个月了.在大多数情况下,我一直在使用TDD,只有在我编写了实际代码之后,单元测试才覆盖了一些方面.总的来说,该项目的测试覆盖率很好.
我对迄今为止的结果感到非常满意.重构真的很容易,我的测试帮助我发现了很多错误,甚至在我第一次运行我的软件之前.此外,我开发了更复杂的假冒和助手帮助我最大限度地减少测试代码. 不过,我不太喜欢的事实是,我经常发现自己不得不更新现有的单元测试来解释我对软件的重构.重构软件现在是快速和无痛的,但重构我的单元测试是相当无聊和乏味.事实上,维护单元测试的成本高于首先编写它们的成本. 我想知道我可能会做错事,还是测试开发成本与测试维护的关系是否正常.我已经尝试编写尽可能多的测试,以便这些覆盖我的用户故事,而不是系统地覆盖我的对象的界面,如this blog article所示. 此外,您是否还有如何编写TDD测试的其他提示,以便重构会尽可能少地进行测试? 编辑:正如Henning和tvanfosson所说的那样,编写和维护通常是最昂贵的设置部分.破碎的测试(在我的经验中)通常是重构域模型的结果,该模型与这些测试的设置部分不兼容.
这是一个众所周知的问题,可以通过根据最佳做法编写测试来解决.这些做法在优秀的
xUnit Test Patterns中描述.本书描述了导致不可忽视测试的测试气味,以及如何编写不可维持的单元测试的指导.
在长时间遵循这些模式之后,我写了AutoFixture,这是一个封装了很多这些核心模式的开源库. 它作为一个Test Data Builder,但也可以连接起来作为一个自动模拟容器,并做许多其他奇怪和奇妙的事情. 它有助于维护,因为它提高了大量写作测试的抽象水平.测试成为更多的声明性,因为您可以声明您想要某种类型的实例,而不是明确地写出如何创建它. 想象一下,你有一个具有这个构造函数签名的类 public MyClass(Foo foo,Bar bar,Sgryt sgryt) 只要AutoFixture可以解析所有的构造函数参数,就可以简单地创建一个新的实例,如下所示: var sut = fixture.CreateAnonymous<MyClass>(); 主要好处是,如果您决定重构MyClass构造函数,则无需测试,因为AutoFixture会为您找出结果. 这只是一瞥AutoFixture可以做什么.它是一个独立的图书馆,因此它将与您选择的单元测试框架一起使用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |