私有方法、测试驱动开发与优秀设计

发表于:2008-1-14 13:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

  有人说“TDD(测试驱动开发)可以带来优秀的设计”,也有人说“TDD会对设计有负面影响”。如果有个具体例子的话,讨论起来会实际得多,所以下面我们来看一下私有方法以及它与优秀设计、可测试性的关系——这种对立观点的一个实例。

  Szczepan Faber在博客中写道,私有方法是一种反模式:

  自从TDD诞生之日起,私有方法似乎就有了坏味道。被测试浸染的开发者总想寻找测试私有方法的办法。嗯……这显然是很困难的,所以问题就从“如何”变成了“为何”:为何要测试私有方法?大多数TDDers都会立刻回答说:别这么干。于是TDD又改变了我们构建软件的方式,对私有方法进行了重新评估

  Jay Fields在博客上描述了在ruby中测试私有方法的一种通用方式:

……我很少测试私有方法。我更倾向于通过public API来进行测试。不过偶尔也有这种时候,如果你可以给一两个私有方法写点测试用例的话,日子就可以过的容易一些。

  Michael Feathers在去年的The Deep Synergy Between Testability and Good Design一文中指出,TDD可以带来优秀的设计,而反过来想,那些不可测试的代码应该引起我们的深思:

  在我编写测试时,如果觉得有强烈的冲动促使我去测试一个私有方法,我就会把它看作一种暗示。它告诉我,我的类已经被封装得趋近于封闭了,测试代码无法再通过公共接口来“理解”这个类的行为。我顺从了这个暗示的召唤,重新构建了代码。通常我都会把这个私有方法(可能还有一些相关的方法)挪到一个新的类里面,在那里它不再是私有,可以让测试代码访问。

  以上种种想法,都倾向于不鼓励使用私有方法,在天平的可测试性一端加入更多砝码。但它们并不是唯一的声音。实际上在我们所能看到的有关面向对象开发的观点中,很多都是支持少用一些类,极尽所能使用封装。在public API中只暴露最小的API集合,就会将耦合降低到最小。David West在Object Thinking一书中,引用了Lorenz和Kidd在Object Oriented Software Metrics书中的论述:

  一个应用程序应该最多包括40个故事,100个类。
  应用程序所属的整个业务领域不应该需要超过1000个类来完成。
  每一次迭代后都该扔掉25-30%的代码。
  每个类的职责:平均是7个。
  每个类的方法数:平均是12个。
  每个方法的代码行数:平均是15个。
  需要进行注释的代码行数百分比:60。
  case语句的数量:平均为0。
  如果私有方法确实是坏味道,需要把它们挪到自己所应归属的类中,这不就是“为了让测试变得简单,而增加类的数量”么?它势必会造成类的数量急剧膨胀。

  那么该拿私有方法怎么办呢?测试它们太折磨人了。我们可否修改一下,把它们暴露给测试代码?或者不去测试私有方法,让设计与可测试性永不相干?或者,私有方法是一种坏味道,它表明一个类做了太多事情?

《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • VisualUnit
    2008-1-15 16:06:52

    只将接口暴露给用户,让实现细节私有,这是面向对象的基本特征。
    测试是为了找错,复杂的函数有错的可能性大,就应该测试,不管它是私有公有还是集体所有。
    测试私有方法其实是很简单的:把代码拷贝一份进行修改,将私有改为公有,然后对拷贝进行测试,不就OK了吗?测试抽象类也可以用这个办法,当然,拷贝和修改应该由工具自动完成,产品代码是不能动的,实现这么一个功能是很简单的。
    可以参考一下Visual Unit 2。
    (打少了一个字,重发一次,论坛要是有对自己的评论进行编辑的功能就好了)

  • VisualUnit
    2008-1-15 16:04:35

    只将接口暴露给用户,让实现细节私有,这是面向对象的基本特征。
    测试是为了找错,复杂的函数有错的可能性大,就应该测试,不管它是私有公有还是集体所有。
    测试私有方法其实是很简单的:把代码拷贝一份进行修改,将私有改为公有,然后对拷贝进行测试,不就OK了吗?测试抽象类也可以用这个办法,当然,拷贝和修改应该由工具自动完成,产品代码是不能动的,现这么一个功能是很简单的。
    可以参考一下Visual Unit 2。

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号