测试驱动开发TDD系列(一)

 

  

 

引言

  这个系列来自我读《Test-Driven Development in Microsoft .NET》这本书的一些内容,以及一些自己的体会。

正文

  1、什么是测试驱动开发?

  可以用下面的两句话来定义。

  •   在你已经写好一个测试失败的自动化测试用例之前,绝不写一行代码。
  •   消除代码重复。

  第一句话很好理解,就是在写代码之前,先写一些测试失败的自动化脚本,测试肯定是失败的,因为没有任何实现。因为测试包含代码必须满足和实现的需求。如果没有需求,就不需要实现任何功能。这条可以防止我们实现没有测试和不需要实现的功能。

  但是我还是有一点疑问,就是如果一行代码都不写,连接口没有,自动化脚本又测试什么呢?也只能写一写手动测试脚本,功能性的测试脚本。针对具体实现的自动化脚本,也还是要等接口出来才可以写吧,你们说呢?

  第二点是说在应用中不应该有重复的代码。代码重复是一种典型的不良软件设计,会导致矛盾问题。如果有代码重复,在看见的时候,程序员就应该消除它。

  2、简单的设计

  因为测试覆盖了需求,所以在写代码的时候,你的工作就是不多不少的满足需求。每个人都理解“不少”(因为少了软件没有办法工作了),但是不是每个人都理解“不多”。

  “不多”是什么意思呢?想象回到有人让你在现有系统上添加功能的时候,然后你说“没有问题,在之前我就已经想到会发生这个了,我已经加入了这个功能的代码”。你被看做是英雄,因为你预料到了这个需求,并且在解决方案中已经实现了它。

  想一下在你为了额外的功能增加复杂性的时候,抽象类,等等,那些没有人让你实现的功能。这些额外的代码必须随着那些使用中的代码一起维护。事实上,维护这个软件的负担在加重,因为它超过了实际的适用范围。因此你需要为不多、不少而奋斗,可以参考下面:

  •   代码满足了当前客户的要求。
  •   代码通过了所有的测试。
  •   代码做了需要做的每一件事。
  •   代码的类数量最少。
  •   代码保持了最少数量的方法。

  优先级最高的就是:代码满足了当前客户的要求。在你满足了适当的需求之后,下一个高优先级的是:代码通过了全部的测试。其次就是其他的了。

  有一句话,原文是:

  You might think that achieving simplicity is an easy process. Think again—it’s often very difficult. However, the simpler the code is, the more resilient it is and the easier it is to modify.

  我是这么理解的:

  你一定认为完成这些简单的事情是一个非常容易的过程。自己想想,通常它很困难。但是,代码越简单,它越有弹性,越容易修改。

  我不知道是不是我理解错了,还是这句话本身就是错误的呢?我不认为代码越简单越好,应该保持适度,甚至是应该相对应该复杂一点。如果类最少就是好的,那就写几个类好了,每个类几个方法,方法要少吗,那就每个方法写上几千行。这样的代码还能有弹性吗?还能容易修改吗?这么说来的话,分层和设计模式是最扯蛋的了,他们会导致很多的类,很多的方法。还有就是设计原则:SRP,单一职责原则,更是要求类的职责要单一,每一个类只应该有一个改变它的理由。这不都是矛盾的吗?如何理解呢?还是我太极端的理解了书中的意思呢?

  3、重构

  重构可以理解为,改进代码本身,但是不影响功能。重构是TDD的关键环节,因为在增加测试的时候,需要重新定义代码的设计。例如:你在代码中看到了重复,你就要移除它。如果需要引入复杂性来移除重复,也是正确的,因为是实际需要的,而不是预期设计的。

  4、红/绿/重构

  红、绿、重构,定义了实现每一个测试的过程。这个过程的目标就是工作在一个小的,可验证的过程,可以提供及时的反馈。

  •   编写测试代码。
  •   编译测试代码,它肯定会失败,因为你还没有写任何实现的代码。
  •   编写实现的代码。
  •   运行测试,观察测试结果,可能是红色的。
  •   使得测试通过。
  •   运行测试,观察测试结果,直到变绿。
  •   重构代码,消除重复代码。
  •   重复上面的过程。

  这就是著名的红绿条,不断的修改代码,直到进度条变成了绿色。因为,红色代表没有通过测试,绿色代表通过了测试。然后再对代码进行重构,消除代码中的重复。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相随的 论坛中提出您就本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”来访问该论坛。) 最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行之中结合测试测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将有助于使您的系统尽可能的简单。 先编写测试 XP 涉及两种测试: 程序员测试和 客户测试测试驱动的编程(也称为 测试为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写的代码。这意味着您必须在编写代码之前进行测试测试指出您 需要编写的代码,从而也 决定了您要编写的代码。您只需编写足够通过测试的代码即可 ― 不用多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么代码,所以您不会去编写任何代码。 测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。其中比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。 1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行。而测试驱动开发技术并不只是单纯的测试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值