首页 / 知识
关于架构:测试驱动开发是否将重点放在设计上?
2023-04-16 09:48:00

Does Test Driven Development take the focus from Design?我对TDD感触良多。虽然我相信测试,但是我对测试驱动开发工作的想法存有疑问。 当您编写代码以满足某些为接口而编写的测试以满足当前需求时,您可能会将重点从构建可维护的代码,从简洁的设计和声音体系结构转移。 我有一个驱动问题,而不是测试问题。有什么想法吗? 编号 如果做对了,测试驱动开发就是您的设计工具。 我希望您能原谅我链接到我自己的博客条目的原因,其中讨论了测试驱动开发的陷阱,这些陷阱之所以出错,仅是因为开发人员将他们的测试仅当作测试。 在先前的项目中,开发人员使用了破坏性很强的单例模式,该模式在整个项目中都实施了依赖关系,而当需求发生变化时,这种依赖关系就破坏了一切:
正确执行"测试驱动开发"应该使开发人员高度了解设计陷阱,例如紧密耦合,违反DRY(不要重复自己),违反SRP(单一责任原则)等。 如果您为了通过测试而为测试编写通过代码,则您已经失败了:您应该将难以编写测试的路标视为让您问的路标:为什么这样做呢?为什么不能不依靠其他代码来测试此代码?为什么我不能重用此代码?为什么单独使用此代码会导致中断? 除了您的设计是否真正干净,代码是否真正可维护之外,为什么为它编写测试并不容易? 始终存在过度执行TDD设计或前期设计的风险。因此,答案是取决于情况。我更喜欢从用户故事/验收测试开始,这是我的测试将有助于产生的要求的基础。只有在确定了这一点之后,我才开始编写TDD风格的详细单元测试。如果您唯一的设计和思考是通过TDD进行的,那么您将冒太多自下而上的方法的风险,这可能会给您带来出色的隔离性的单元和类,但是当您尝试将它们集成到用户故事执行任务中时,做错了一切可能会感到惊讶。有关更多灵感,请查看BDD。 在罗伯特·C·马丁和詹姆斯·科普利恩之间已经记录了有关此问题的一个很好的"辩论",前者是TDD的拥护者,而后者则表示破坏了系统的设计。这是罗伯特对TDD和设计的评价:
James Coplien指出,仅从TDD驱动设计会有很大的风险:
他还举了一个很好的例子,说明了与使用先验知识来驱动架构相比,如果您进行测试驾驶,银行帐户的外观将如何:
有趣的是,TDD的支持者和TDD的反对者都说您需要预先设计。 如果有时间,请观看视频。这是两位很有影响力的专家之间的一次很好的讨论,而且只有22分钟之久。 我完全同意pjz。没有一种正确的方法来设计软件。如果您将TDD推到了极致,除了下一个单元测试之外没有其他任何考虑,则可能会使您的工作变得更艰难。同上一个花了几个月时间在图表和文档上但没有代码的人,开始了一个大型软件项目。 适中。如果有想绘制一个快速图表来帮助您可视化代码结构的需求,那就去做吧。如果需要两页,可能是时候开始编写一些代码了。如果您想在编写测试之前这样做,那该怎么办。我们的目标是提供高质量的软件,而不是绝对符合任何特定软件开发原则。做对您和您的团队有用的事情。寻找可以改进的地方。重复 我考虑的方式是,首先编写您想要的代码。
获得目标代码和测试支架之后。实施代码。现在,您甚至拥有了通过自己的测试时就知道自己的进步程度的优势(这是一个很好的动力!) 根据个人经验,测试可能是多余的唯一情况是当您制作早期原型时,因为那时您仍然对问题的理解不够,无法准确地设计或测试代码。 在这个问题上,我完全同意你的看法。在实践中,我认为TDD通常会对代码库产生非常负面的影响(糟糕的设计,过程代码,没有封装,生产代码中充斥着测试代码,无处不在的接口,难以重构的生产代码,因为所有内容都与许多测试紧密相关)。 )。 吉姆·科普林(Jim Coplien)现在就这个话题进行了一段时间的演讲:
Robert C. Martin和James Coplien之间也就InfoQ进行了讨论,他们讨论了这个问题。 完成软件需要完成三个步骤: 测试使您排名第一。您的代码不仅仅因为测试通过而完成。在开始编写测试/代码之前,最好具有项目结构的一些概念(实用程序,常用访问的对象,层,框架)。在编写代码以使测试通过之后,您需要重新评估它,以查看可以将哪些部分重构为应用程序的不同方面。 Yuo可以自信地做到这一点,因为您知道只要测试仍在通过中,您的代码就仍然可以正常工作(或至少满足要求)。 在项目开始时,请考虑一下结构。随着项目的进行,请继续评估和重新评估您的代码,以保持设计不变,或者在不再有意义的情况下更改设计。在估算时,必须考虑所有这些项目,否则最终将得到意大利面条字代码(无论是否为TDD)。 这里有许多非正式的意见,包括流行的意见(来自Jon Limjap),认为做错事会导致不好的结果,并且声称除了个人经验以外,似乎并没有其他依据。大量的经验证据和已发表的结果与该经验指向相反的方向。 理论上认为,一种要求您在代码之前编写测试的方法将导致在单个代码段(即,小型编程)级别上进行设计的思考。由于过程就是您可以测试的全部内容(您仍然一次只能测试一个方法的一个对象,而您根本无法测试大多数语言的类),因此您的设计重点将放在各个方法及其组合方式上。从理论上讲,这导致了自下而上的程序设计,进而导致对象之间的不良耦合和内聚。 广泛的经验数据证实了该理论。 Siniaalto和Abrahamsson(测试驱动开发对程序设计和测试覆盖率影响的比较案例研究),ESEM 2007,发现"我们的结果表明内聚性可能更差(即使Beck声称TDD产生了高内聚性系统)在我们的第二项研究中,我们注意到使用TDD的复杂性度量更好,但是依赖管理指标显然更差。" Janzen和Saledian(测试驱动开发真的提高了软件设计质量吗?IEEE软件25(2),2008年3月/ 4月,第77-84页)发现,"该结果不支持较低耦合度的主张,并且与TDD的内聚力增强"。 文献综述将发现其他出版物,进一步加剧这些情况。 即使我亲爱的朋友Bob叔叔也写道:"敏捷开发的一个更加隐蔽和持久的神话是,前期的架构和设计很糟糕;您永远不要花时间在前期进行架构决策。相反,您应该一次只用一个测试用例就一无所有地发展您的架构和设计。对不起,但这就是马屎。" ("敏捷架构的类别学", 但是,值得注意的是,更广泛的失败是人们认为这是一种测试技术,而不是设计技术。 Osherov指出了许多通常与TDD等同的方法。我不确定这里的海报是什么意思。请参阅:http://weblogs.asp.net/rosherove/archive/2007/10/08/the-various-意义-of-tdd.aspx。 在大多数情况下,我同意TDD确实提供了一种设计工具。对我来说,最重要的部分是它构建方式进行更多更改的能力(您知道,当您拥有洞察力的时刻,可以通过删除代码来添加功能),大大降低了风险。 也就是说,我最近从事的一些算法工作在TDD下受到了一些折磨,而没有仔细考虑设计思想。上面关于更安全的重构的声明仍然是一个很大的好处,但是对于某些算法,TDD(尽管仍然有用)不足以使您获得理想的解决方案。以排序为例。 TDD可以很容易地导致您获得次优(N ^ 2)算法(以及大量通过的测试,使您能够重构为快速排序的算法),例如冒泡排序。 TDD是一种工具,是非常好的工具,但是就像要解决问题的上下文一样,许多东西都需要适当使用。 我在TDD和单元测试方面相对较新,但是在我使用过的两个附带项目中,我发现它是设计助手,而不是设计的替代品。独立测试和验证组件/子组件的能力使我更容易进行快速更改并尝试新的设计思路。 我在TDD上经历的差异是可靠性。在设计过程的开始而不是以后,就可以在较小级别的组件上确定组件接口的过程是,我拥有可以信任的组件,它们可以更早地工作,因此,我不必担心这些小组件而取而代之解决棘手的问题。 当我不可避免地需要回来维修这些小零件时,我可以花更少的时间这样做,这样我就可以回到想要做的工作上。 总是平衡的: 一切都适度。 |
最新内容
相关内容
linux系统维护命令?
linux系统维护命令?,系统,工作,信息,策略,发展,网络,时间,情况,工具,服务,系统加固之Linux安全加固1、修改系统密码;查看系统是否已设定了正确Ulinux常用的维护命令?
linux常用的维护命令?,系统,网络,管理,工作,标准,工具,地址,数据,命令,信息,linux运维必须知道的几个常用命令1、bash常用任务管理命令 &,Ctrl-linux维护网络命令?
linux维护网络命令?,网络,地址,系统,工具,信息,服务,电脑,初级,设备,命令,linux查找网络配置命令是什么?1、首先在电脑上打开Linux系统,然后进让Python代码更易维护的工具
让Python代码更易维护的工具,代码,工具,标准,项目,质量,地方,更正,一致,变动,软件,检查你的代码的质量,通过这些外部库使其更易维护。可读性很如何让Python代码更易维护
如何让Python代码更易维护,代码,项目,标准,工具,质量,地方,一致,更正,培训,控制权,检查你的代码的质量,通过这些外部库使其更易维护。可读性很Python 需求分析的方法
Python 需求分析的方法,系统,设计,分析,产品,网站,时间,服务,社会保险,证券,银行,需求分析518方法,简称我要发,具体就是5w1h8c5w+1h属于功能属Python 需求模型
Python 需求模型,系统,设计,产品,分析,网站,时间,项目,需求,服务,图片,1.需求VS功能需求:客户想要的效果,对客户有价值的事情功能:系统为了实现Python 需求模型之用例的写法
Python 需求模型之用例的写法,分析,名称,异常,价值,流程,环境,培训,情况,需求,写法,1、python写用例的技巧三段法:NEA1正常处理(normal):分析python让Python代码更易维护的工具
python让Python代码更易维护的工具,代码,工具,培训,关于体系结构:SaaS数据库设计-多个
关于体系结构:SaaS数据库设计-多个数据库? 分裂?,关于体系结构:SaaS数据库设计-多个数据库? 分裂?,拆分,应用程序,数据库,模块,SaaS databa关于单元测试:测试驱动开发的缺点?
关于单元测试:测试驱动开发的缺点?,关于单元测试:测试驱动开发的缺点?,福利,损失,列出,底片,Disadvantages of Test Driven Development?关于体系结构:如何在仍然忠于敏捷的
关于体系结构:如何在仍然忠于敏捷的同时避免技术债务,即:避免违反YAGNI和避免BDUF?,关于体系结构:如何在仍然忠于敏捷的同时避免技术债