当前位置: 首页 > 科技观察

我们再谈谈TDD,续篇——大家都在做TDD

时间:2023-03-16 10:08:35 科技观察

上一篇《让我们再聊聊TDD》,我通过DHH的文章分析和DHH与KentBeck的讨论和分类阐述了我对TDD的理解,下面继续说说实现和分层测试驱动开发。现在还有很多软件工程师在质疑TDD的可行性,比如太难了,推广起来太贵,意义不大等等,但是他们一直在做TDD,只是没有意识到而已.这就是“不识庐山真面目,只因身处此山”。TDD的实现一般分为思维层面和技术层面。一般来说,思维层面的实施成本较低,容易接受,但也有很多缺点,如交付困难,难以获得持续快速的反馈;而在技术层面的实施一般成本高,不易被接受,但优势更多,比如反馈快,交付和协作更容易等。TDD在现实世界的实施一般分为三个阶段,即无意识的TDD,通过技术的被动TDD,以及通过技术的有意识和主动的TDD。1.第一阶段:无意识的TDD对于软件开发人员来说,当他们得到一个新的软件需求时,首先会思考如何去实现它,包括当前的软件架构、业务分解、实现设计、代码分层、代码实现等等。然后通过对得到的输出进行思考和设计来驱动代码实现,然后在代码实现中,会思考如何通过一个或多个函数或算法来实现业务逻辑。因此,软件系统的实现需要先在意识层面进行思考,然后在技术层面进行工作。开发者在思考和设计这些函数或方法的时候,通常会想到它们有哪些参数,然后想象将这些参数替换成真实的数据传入后会得到什么样的返回值。更好的开发者会思考如何处理异常输入和异常返回值。这种思维其实就是有意识思维中的TDD。它帮助开发人员先在大脑中设计和验证代码实现,甚至帮助他们重构代码。很多开发人员都在不知不觉中进行TDD。比如在一个银行系统中,开发者接到一个需求,需要开发一个手机APP转账的功能。首先,开发者会基于当前的软件架构思考:是否开发一个全新的模块来处理这个业务?或者在当前架构的基础上添加代码进行处理?当架构和设计确定后,他们就开始思考具体的代码实现,比如类设计,方法设计,或者功能设计。在开发“原账户转账”功能之前,开发者会想:该功能需要支持原账户转账成功后,原账户余额等于原账户余额减去转账金额数量。进一步的,一些程序员还会设计一些例子来验证功能。例如,账户中原余额为999.99,转账为111.11,则余额应为888.88。这样思考之后,开发人员就开始根据自己心中的测试逻辑和用例来驱动和辅助开发过程。代码开发完成后,我们会想一些办法来验证实现的功能是否符合预期,比如手动使用以前的或新的测试用例重新测试。如果验证无误,则认为自己开发的功能无误,交给测试人员进行测试。其实开发人员在开发之前思考测试逻辑和用例的过程就是在做TDD。很多做业务分析和测试分析往前走的QA的BA也在不自觉的做TDD(注:TDD包括上一篇文章解释的ATDD),比如分析验收条件,写验收文档等。只不过这些AC验收文档可能不是很清楚,也可能写的不是很好,比如没有实例化需求等,但本质上已经是TDD了。它只是一种初级的无意识的TDD,有些人可能做的好,有些人可能做的不好,而且没有明确的输出来辅助和规范这种测试驱动的开发方式,也缺乏快速的反馈、测量、交付和协作等等。因此,从无意识到有意识,将是做好TDD的一个重要过渡。2、第二阶段:通过技术被动实现TDD当一些软件工程师意识到TDD的意义和无处不在的时候,就开始准备解决TDD在思想上的不足。解决这些问题的方法是在技术层面用代码来实现TDD,用清晰的代码来辅助和规范开发者的测试驱动开发行为,衡量他对业务逻辑和代码实现的理解。通过将他的理解传递给未来的维护者,他的理解可以被重用并与其他人合作开发。然而在现实中,很多开发者的认识和技术能力都不够。即使管理层支持并积极推动TDD,最终开发人员设计和选择的测试用例的合理性很差,导致驱动代码的有效性很差,测试用例无法体现。SBE(Specificationbyexample)导致可读性差,不熟悉自动化测试框架和测试编写导致开发速度慢等,往往在技术层面被动实施TDD,所以各种抱怨,各种冲突,结果,技术层面的TDD很难大规模实施。由于意识层面的难度和工作量比技术层面的难度和工作量相对较小,因此前者实施起来相对容易,而后者则相对困难。所以,如果通过各种手段强行实施TDD,而不主动实施TDD,如果有正确做TDD的意识,连技术能力都不够,那么这样的TDD就是一个倒三角,非常容易倒塌。TDD倒三角所以,如果不想TDD在技术层面随时崩溃,就需要完成这个倒三角,才能更好更长久的实施TDD。3.第三阶段:通过技术自觉主动实施TDD要大规模有效实施TDD,首先要突破思维和意识的局限,实现TDD的普适性和适用性,不被害怕或拒绝TDD的思维和开发模式。其次,我们要积极学习并刻意去实践TDD的技术实现,提升自己的技术能力,让我们更容易在技术层面实现TDD,摆脱被动TDD的困境。学习方法包括阅读TDD相关的书籍和文章,包括《测试驱动开发》、《重构》、《BDD In Action》和《系统思考》等,充分了解TDD的优点和局限性。对于刻意练习,一定要长期坚持去做,让它成为一种习惯。如果项目中没有适合练习的环境,也可以使用一些第三方的TDD练习系统进行刻意练习,比如Cyber??-dojo。只有大量的刻意练习,才能让你在真正的代码编写过程中思考和理解TDD,并通过学习运用所学知识。最终你可以通过技术自觉主动的去实现TDD,TDD的倒三角是可以改变的。成为一块稳定的砖头,然后将其移动到需要移动的位置。TDDBrick4.总结综上所述,大部分开发人员应该都在做TDD,但他们是在不自觉或被动地做着,只有一小部分是有意识地、主动地在做。既然大家都在做TDD,为什么我们不能像黑客帝国里的Neo一样选择红色药丸认清现实,积极拥抱TDD,通过大量的刻意练习改变我们的工作习惯,让TDD成为我们的工作习惯只有这样怎样才能更好地提高软件质量,大大降低软件维护成本。信不信由你,反正我信。