对TDD的思考(一)

上一篇 / 下一篇  2012-04-06 09:48:36 / 个人分类:杂谈

 TDD是否有效,是否能够驱动设计,我在此不想给出答案,以避免陷入业界多年以来对于TDD的争纷。事实上,武断地说TDD好,或是不好,都是不负责任的做法。因此,在这里,我只想来谈谈自己对TDD一些思考。51Testing软件测试网+j'A^{"`c

  让我们先来看看TDD的过程,如下图所示:51Testing软件测试网1S*M%C'c-S#g:wG

51Testing软件测试网9p] i0mwW8s

  TDD的过程是一个从输入到输出的过程。输入就是寻找任务、编写适当的测试用例,最终的输出则是合理设计的实现代码。如此,即可将TDD的过程转换为:51Testing软件测试网"bp7`T:h*^u

  1)如何寻找正确的任务列表?51Testing软件测试网n!@Ll6]V3c v[^

  2)如何编写好的测试用例51Testing软件测试网,Qvv`:_vP

  3)何谓简单设计?

Z+E1QEy9SO!`0

  4)如何发现代码的坏味道?

B@}kJ:yy"l0

  5)如何重构?51Testing软件测试网s3sl7wBQ'p

  以上五个环节正是TDD的关键。如果说这个过程蕴含着“驱动”的涵义,这正是一种驱动设计的过程。我们必须要将每一个环节都做好,TDD才能变得有效;否则一切都只是镜花水月。这正是TDD的困难之处,也是它的争议之处,对于我而言,却也正是TDD的迷人之处。

(qz#ad$E$` `!L,]0

  一、如何寻找正确的任务列表

H+u WY.rn0

  通常而言,实施TDD的团队都会从用户故事(User Story)开始分析需求,辨别我们将要完成的任务(功能)列表。典型的用户故事事实上描写了一个场景,通过诸如:As, I would like, So that……这样的句式展开对场景的描述。这种描述方式分别包含了角色、功能、业务价值三部分内容。

5ktbmT x0

  在职责驱动设计中,我们常常将角色作为场景分析的入口点,通过角色所要执行的功能,来识别对象以及对象的职责,并合理地分配对象的职责,实现良好的对象协作。TDD的方式与之相似。这是因为好的测试项事实上应该是一种规格说明,是对业务场景的一种模拟,是站在调用者(测试者)的角度去揣摩对象或接口的意图,而非考虑具体的实现。当我们在分析User Story时,就可以从角色的角度分析这个需求所需要完成的任务。每个任务可能代表一个功能或者职责,组合起来正好能够为完整的场景服务。例如这样的一个User Story:

)dU"w@:M1i4^0

  view sourceprint?As an Account Administrator51Testing软件测试网 Z2| ?#Q}e OU
  I would like the bank to track new customers
3e zEOm0  So that we can tie all records of them together51Testing软件测试网5J1[f7RQV|U&v Bpd/V8x

  对于这样的一个用户故事,从Account Administrator的角色出发,所能获得的一个场景就是:创建一个客户对象,然后将新建的客户对象添加到银行的账户系统中。于是,根据场景,我们能够辨识出两个任务:51Testing软件测试网+[ w'X2fq/@jt

  1)创建一个新的客户;51Testing软件测试网} A J@3t0AUJ

  2)添加一个创建好的客户;51Testing软件测试网 l%?[$Hw

  在整个用户故事中,虽然我们将其分割为两个任务,但这两个任务始终是为一个业务价值服务的。一个好的用户故事应该遵循INVEST模式(Independent, Negotiable, Valuable, Estimable, Small, Testable),因此在分析任务时,需要分析这些任务是否是为同一个业务目标服务。如果发现任务繁多,体现为多个业务价值,就应该思考这个用户故事的划分是否合理。所以在TDD的过程中,对于输入部分的用户故事而言,是需要思考和分析的,一方面是为了从角色的角度入手,获得我们可以分解的任务列表,另一方面也可以反过来判断用户故事的编写与划分是否合理。

-]_s+lR0

  当然,在一个典型的用户故事中,都会给出一些验收条件(Acceptance Criteria),这些验收条件既可以转换为任务,也可以视为实现功能或职责的一种约束。例如这样的验收条件:

wa+v!jp"A2`0

  view sourceprint?1.Each customer has a nickname?
,~+O?CM[\0  2.Valid nickname contain only lowercase letters or digits
b_4Z ~#Ju&Y0  3.Each customer has a dateOfBirth?(DateTime)
A-r&Z,XiE/B+A dH;b0  4.Customers may be added to the Bank provided that there is not an existing customer with the same nickname?51Testing软件测试网X$YS1]gWag

  在这些验收条件中,前面三个验收条件可以看做是第一个任务的约束,后一个验收条件则是第二个任务的约束。对于验收条件而言,既可以作为验收测试的一种输入,又是TDD测试用例的一个重要参考。有了任务和验收条件作为基础,我们就能够比较容易地编写合乎需要的测试用例了。51Testing软件测试网] B;jHb _.c7t7I


TAG:

 

评分:0

我来说两句

Open Toolbar