`
visualcatsharp
  • 浏览: 40974 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

读《测试驱动开发》和《敏捷软件开发:原则、模式和开发》有感

阅读更多
《      测试驱动开发》虽然是一本薄薄的书,但解开了我心中不少的疑团,可惜也带来了一堆新的问号。

        我们平时开发的流程大致分为两个步骤:确定需求,编码实现。如果分得再细一点,可以分为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....

    Introducting in Agile Process

    - **极限编程(XP)**:强调通过持续集成、测试驱动开发等技术实践,实现高质量的代码和快速的反馈循环。 - **精益开发(Lean Development)**:侧重于消除浪费,最大化价值流,提高效率。 - **水晶系列(Crystal)*...

    40分钟项目管理实践.pdf

    2. **研发人员的感受:** - 需求变更频繁导致工作量增加。 - 加班成为常态,个人生活受到影响。 - 缺乏学习新技能的时间。 - 对项目经理的能力持怀疑态度。 - 文档填写繁重,缺乏实际意义。 - 考虑跳槽或离开...

    嵌入式软件工程课程项目总结报告模板1

    我们采用敏捷开发模式,团队成员按技能特长分工,如UI设计、后端开发、测试等。通过定期会议和在线协作工具,确保了信息同步和任务分配的透明性。团队协同效果良好,每个人都积极参与并完成了各自的任务。 10. **...

    百度2014校招笔试题

    3. **软件工程**:包括软件开发流程、版本控制、敏捷开发、需求分析、设计模式等。 4. **操作系统**:进程与线程的概念、内存管理、文件系统、I/O操作等基础知识。 5. **计算机网络**:TCP/IP协议栈、HTTP协议、...

    修炼之道:互联网产品从设计到运营

    开发过程中,敏捷开发方法被广泛应用,它强调迭代、快速反馈和团队协作。开发人员需掌握编程语言、框架、数据库管理等技术,并运用版本控制工具如Git进行代码管理。此外,软件架构设计、性能优化及安全性都是开发...

    2024年6大关键市场研究趋势报告(英文版).pdf

    敏捷研究方法借鉴了软件开发中的敏捷原则,强调快速响应市场变化和迭代。这种方法允许研究者迅速调整研究设计,以适应快速变化的消费者行为和市场环境。通过敏捷研究,企业能更快地获得反馈,及时调整策略,提高...

    产品经理实用工具全集(1-8)

    2. **Jira**: 更面向软件开发的项目管理工具,支持敏捷开发流程。 3. **Slack**: 即时通讯工具,促进团队内部的沟通和信息共享。 4. **Notion**: 多功能知识管理工具,可用于笔记、文档编写和项目管理。 5. **...

    企业IT持续交付.pdf

    在当今的数字化时代,软件已经成为驱动世界的核心力量,正如亨利·福特的流水线革命极大地提升了汽车制造效率一样,企业IT的持续交付也正在引领一场软件开发与部署的革命。这一革命的核心是自动化,它不仅缩短了产品...

    Realizing Quality Improvement Through Test Driven Development - Results and Experiences of Four Industrial Teams (nagappan_tdd)-计算机科学

    测试驱动开发(TDD,Test-Driven Development)是一种在软件工程领域中长期存在的实践方法,由Kent Beck在2003年的著作中正式提出。TDD的核心理念是通过编写失败的单元测试先行,然后编写代码使其通过这些测试,形成...

    jubilant-computing-machine

    2. 软件工程:这涉及到编写、测试、维护和改进软件的过程。软件工程师使用各种编程语言如Java、Python、C++或JavaScript来创建应用程序。他们遵循敏捷开发方法,强调迭代和增量开发,以适应快速变化的需求。 3. ...

    Vectra-开源

    游戏的核心在于测试玩家的反应速度和敏捷性。这通常包括快速判断、精准操作和适时决策等元素。在 Vectra 中,玩家可能会面临各种动态的障碍和敌人,需要通过不断练习来提高应对能力,从而达到更高的分数和成就。 4...

Global site tag (gtag.js) - Google Analytics