《 测试驱动开发》虽然是一本薄薄的书,但解开了我心中不少的疑团,可惜也带来了一堆新的问号。
我们平时开发的流程大致分为两个步骤:确定需求,编码实现。如果分得再细一点,可以分为n个步骤:提出需求、确定需求、编写需求文档、数据库建模和对象建模、编码、集成测试和验收测试。编码的过程又可以分为n个步骤:编写功能代码,单元测试。虽然这种流程不算是RUP,但我觉得却是向着RUP进发。
但从《测》一书中,我没看到作者要求在开发中具备完整的文档,看第一遍的时候我是觉得作者是从编码中得出需求的,但看第二遍的时候我又否定了自己的想法。《测》的作者Kent Back拿了一个汇率计算的例子向我们演示如何TDD,在例子的第一次单元测试失败后,我们可爱的MR.Kent已经得出了汇率计算的所有需求,这时我释然了,TDD应该也要结合实际嘛,然后需求真的是从开发中驱动出来么?不可能,这样的话还要客户干嘛?这是我当时的想法。
如果到了这里已经算是解开了疑团,我也没必要写这篇东东了,下面我借花敬佛,通过TDD所包含的步骤开打开话匣子。
TDD可以分为三步:
1、 写一个不可以工作的测试,一开始这个测试程序甚至不能编译。
2、 尽快让这个测试程序工作起来,为此可以在程序中使用一些不合情理的方法。
3、 重构,消除重复设计,优化设计结构。
为什么一定要先写一个不可以工作的测试?而不是先写一个不可以工作的程序?为什么一定要由测试来驱动开发,而不是先开发,后测试?先写Test Case后写程序的方法,会不会导致开发效率降低?
这些疑问一直缠着我很久了,虽然不致令我寝食难安,但让问题存在了这么长的时间是一位coder的耻辱。结合在不久前景德镇的会员中心改造这一需求和几晚的思考,一些云雾已经渐渐被拨开。
为什么一定要先写一个不可以工作的测试?而不是先写一个不可以工作的程序?
这里的测试并非普通的测试,甚至跟我们想像中的测试是完全不同的,它是对需求的理解。TDD要求我们在测试前写一个测试清单,这更像把需求整理出来。不过TDD根本没要求我们把测试做得像验收测试那样详细,TDD要求能清楚表达需求就行了。
为什么一定要由测试来驱动开发,而不是先开发,后测试?
TDD有一个标准,就是在没有测试的情况下,决不编写任何程序代码。TDD提倡小步跑,在开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的,这导致了很多时候“设计过度”,因此TDD的每一步都是适可而止的,今天的事今天解决,明天的事明天再说。
先写Test Case后写程序的方法,会不会导致开发效率降低?
这里是我最大的疑问,不过没实践过因此没任何发言权。我们重温一下测试驱动的三步曲:
1、写一个不可以工作的测试,一开始这个测试程序甚至不能编译。
2、尽快让这个测试程序工作起来,为此可以在程序中使用一些不合情理的方法。
3、重构,消除重复设计,优化设计结构。
怎样能能使用这个测试程序尽快地工作起来?以下是《测试驱动开发》一书中的摘抄:
1、 伪实现,可以直接返回一个常量。
2、 显明实现,将真实的代码键入。
3、 三角法,在不确定的时候可以由几个方面抽象出共同的事物,类似已知三角形任意两边可以得出第三边。
4、 可以使用复制粘贴等方法让你的程序尽快的工作。
5、 千万别忘记了重构,这是很重要的一步,在重构前写出你希望拥有的测试。
可能大家和我有一样的同感,这什么伪实现很扭扭捏捏嘛,这步伐也太小了吧,不过Kent Back说了,用什么样的步伐来跑,决定于你的感觉和经验,跟着感觉走准没错。
写到这里好像似乎可以结束了,不过这两晚我重温了《敏捷软件开发:原则、模式和实践》一书后,脑子里又塞满了一堆的问号。
XP是这样给自己定义的:
1、个体和交互 > 过程 (这里主张团队沟通,理解)
2、可以工作的软件 > 面面俱到的文档 (这里与我们背道而驰,有疑问)
3、客户合作 > 合同谈判 (需求在不断变化,理解)
4、响应变化 > 遵循计划 (开发过程不可能一成不变的,理解)
5、初期交付的系统中所包含的功能越少,最终交付的系统质量越高。(赞成)
下面这些更难以理解:
1、 XP缺乏明确的设计阶段(怪不得TDD是XP最著名的一个开发方式,但如果团队的成员拿不准方向咋办?与目标越离越远咋办?)。
2、 在给新的团队成员传授知识方面同,最好的两份文档是代码和团队(不是每个人的代码都写得清淅明了的,不是每个人都善于沟通的,这里会不会太理想化了)。
3、 许多团队因为太注重文档而非软件,而导致失败。(会不会夸大其词?)
4、 先在测试中陈述你的意图(这就是TDD吧)。
5、 XP没有全局视图或者全局视图不明确,这里存在着与第一点相同的疑问。
分享到:
相关推荐
无论是传统的V模型开发流程,还是敏捷开发中的TDD(测试驱动开发)模式,测试都是贯穿整个开发周期的核心环节。测试人员的职责就是确保每个开发阶段都达到质量要求,为企业创造高质量的产品。 而要实现这一目标,...
6. **测试技术**:包括单元测试、集成测试、系统测试和验收测试,以及TDD(测试驱动开发)和BDD(行为驱动开发)等策略,确保软件质量。 7. **项目管理**:敏捷方法如Scrum和Kanban在项目管理中的应用,以及项目...
2. **设计模式与原则**:设计模式是软件设计中经过验证的解决方案模板,如单例模式、工厂模式和观察者模式等。遵循SOLID原则(单一职责、开闭、里氏替换、接口隔离和依赖倒置)可以提高代码的可读性和可维护性。 3....
- **极限编程(XP)**:强调通过持续集成、测试驱动开发等技术实践,实现高质量的代码和快速的反馈循环。 - **精益开发(Lean Development)**:侧重于消除浪费,最大化价值流,提高效率。 - **水晶系列(Crystal)*...
2. **研发人员的感受:** - 需求变更频繁导致工作量增加。 - 加班成为常态,个人生活受到影响。 - 缺乏学习新技能的时间。 - 对项目经理的能力持怀疑态度。 - 文档填写繁重,缺乏实际意义。 - 考虑跳槽或离开...
我们采用敏捷开发模式,团队成员按技能特长分工,如UI设计、后端开发、测试等。通过定期会议和在线协作工具,确保了信息同步和任务分配的透明性。团队协同效果良好,每个人都积极参与并完成了各自的任务。 10. **...
3. **软件工程**:包括软件开发流程、版本控制、敏捷开发、需求分析、设计模式等。 4. **操作系统**:进程与线程的概念、内存管理、文件系统、I/O操作等基础知识。 5. **计算机网络**:TCP/IP协议栈、HTTP协议、...
开发过程中,敏捷开发方法被广泛应用,它强调迭代、快速反馈和团队协作。开发人员需掌握编程语言、框架、数据库管理等技术,并运用版本控制工具如Git进行代码管理。此外,软件架构设计、性能优化及安全性都是开发...
敏捷研究方法借鉴了软件开发中的敏捷原则,强调快速响应市场变化和迭代。这种方法允许研究者迅速调整研究设计,以适应快速变化的消费者行为和市场环境。通过敏捷研究,企业能更快地获得反馈,及时调整策略,提高...
2. **Jira**: 更面向软件开发的项目管理工具,支持敏捷开发流程。 3. **Slack**: 即时通讯工具,促进团队内部的沟通和信息共享。 4. **Notion**: 多功能知识管理工具,可用于笔记、文档编写和项目管理。 5. **...
在当今的数字化时代,软件已经成为驱动世界的核心力量,正如亨利·福特的流水线革命极大地提升了汽车制造效率一样,企业IT的持续交付也正在引领一场软件开发与部署的革命。这一革命的核心是自动化,它不仅缩短了产品...
测试驱动开发(TDD,Test-Driven Development)是一种在软件工程领域中长期存在的实践方法,由Kent Beck在2003年的著作中正式提出。TDD的核心理念是通过编写失败的单元测试先行,然后编写代码使其通过这些测试,形成...
2. 软件工程:这涉及到编写、测试、维护和改进软件的过程。软件工程师使用各种编程语言如Java、Python、C++或JavaScript来创建应用程序。他们遵循敏捷开发方法,强调迭代和增量开发,以适应快速变化的需求。 3. ...
游戏的核心在于测试玩家的反应速度和敏捷性。这通常包括快速判断、精准操作和适时决策等元素。在 Vectra 中,玩家可能会面临各种动态的障碍和敌人,需要通过不断练习来提高应对能力,从而达到更高的分数和成就。 4...