虚拟座谈会:代码测试比率、测试驱动开发及行为驱动开发-2
上一篇 / 下一篇 2012-09-27 16:45:27 / 个人分类:杂谈
(Djoa$Y V0 问题:一直以来,TDD被公认为是一种(代码)设计准则、测试准则或沟通工具。然而,在TDD方法中,作为这些准则和工具的目标会如何影响设计?在测试方面,TDD现在与未来的价值又是怎样的?51Testing软件测试网[4V@D |y9]FP
9^AD`0U"h1rx Ss0 JB:我认为这很大程度上取决于方法的实践 者。当我实践TDD的时候,发现最有价值的部分是测试规范这块,这可能是因为我期望在这个方面有所提高。而只有当我的错误数大幅度地减少时,我才注意到 TDD是如何帮助和指导自己改进设计。在你实践TDD的时候,所有这些都指向对测试的当前价值的个人感受:你可能期望从其他测试中获益。
'I5x9FR K!p051Testing软件测试网\;W4t~G2kP.d我觉得测试的当前价值远比未来价值要高得多。虽然从未这样试过,但我曾经打算在几个月后把测试都扔掉,仅当我需要改进某些东西的时候才去重写测试。51Testing软件测试网/ZzL[t*R
51Testing软件测试网C+?,bo;sgRd我从未在不是我编写的测试上获益,我也不认为这会对我所工作的项目有什么样的帮助,或是对TDD实践者的基本规范有什么样的贡献。对此我有所顾虑,就好象合同工走进要装修的房间,然后对之前的装修出言不逊。
Q8Deyj0hav |051Testing软件测试网_([T,gtU我曾经宣称, TDD风格的测试会起到变更探测器的作用(引用Cem Kaner的术语),用来减少代码变更的代价。我也听到过有人像我这么宣称。尽管没有仔细地度量过,但的确见识过TDD所带来的益处。我甚至听说有人宣 称,这些测试可以为从未了解系统和API的人,讲述清楚其中的内容。对我而言,这些益处仍旧是理想化和理论上的。51Testing软件测试网0Ee&g3?As SsJ`
B*`w/A&~j0 Dan:TDD是一种设计规范,每样东西都有 两面性。在 “测试驱动”这个词组中,“测试”这个词很不幸。 你所写的用来描述行为的实例并不是测试,你所写的代码也只是简单的实例。这些实例只有当与类似持续集成等实践联系在一起时,才成为一套的回归测试。但这些 无法代替测试的需求,特别是代替类似Brian Marick和James Marcus Bach所倡导的有技巧的、直接的探索性测试。TDD测试的另一个特性就是它的决定性。在回归测试中,这是一个优势,但在发现阴暗角落方面(译注:指不易 发现或重现的Bug/Defect)做得却不怎样。随机化的测试技巧能够帮复杂的系统找出许多细微之处,然后你就可以利用TDD逐个解决。Haskell 和Scala的QuickCheck工具就是个很好的例子。
1i6tnD;k?-WN:c00p?IlU e0 关于沟通,这是TDD的主要目的之一。特别是在你需要向其他程序员讲述你的代码意向的时候。在文章《Introducing BDD》中,我描述了有含义的命名方式对测试起到了多么大的帮助。否则,你就无法得知你的测试用例失败时所揭示的真相。你必须能够像读故事一样地去理解 TDD测试用例,而出色的测试命名则决定了功能文档的易用程度。51Testing软件测试网jK]!j'lt7TRg!A
51Testing软件测试网U*F` U Z#P7~Gojko:我认为答案总是位于这些因素的平衡点上。为了将TDD作为一种规范,我们必须找到一种方法来完成所有事情。好的单元测试,能够指引设计。但也必须能够帮助我们缓解关键技术难题带来的风险,并且告诉人们设计的代码应该怎样表现。
#|Mh];OhBmRzG0E7Q`'Hd;|.Cw0 Ron:TDD会用到测试,但不仅仅是测试而 已。它是我们开发系统的方式,是所有测试和程序的骨架。TDD以及其他相关实践让我们逐步地、一个特征接一个特征地开发系统。从始至终,它保证了代码的活 性,以及可塑性。这让我们更清楚地了解我们究竟完成了什么,也让产品负责人或管理者清楚下一步要做什么,不论是通过揭露代码满是缺陷,或者设计是错误的, 或者我们不能太快地改进。这也极大地减少了在项目最后阶段才了解到坏消息的可能性。
R(R|.B%e0