TDD从何开始-2

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

运行测试,会看到下面的错误信息:51Testing软件测试网4W3d.DY0o6qk

51Testing软件测试网 g*{)}5M)z] U#A

51Testing软件测试网"Xd$_[ uD]{ o j[

java.lang.AssertionError: not all expectations were satisfied51Testing软件测试网 N!KG1~5Q D ]ZsU

m*RuX!]P_U0expectations:
7{(Q4o"wQ9X0expected once,never invoked: answerGenerator.generate(); returns "1234"51Testing软件测试网:q.?7a*FJZ%XnIq
expected once,never invoked: inputCollector.guess(); returns "1234"
'DZ7A H Q2qC`?0expected once,never invoked: guesser.verify("1234"); returns "4A0B"51Testing软件测试网GsL@:L/}F5jN;]
expected once,never invoked: outputPrinter.print("You win"); returns a default value51Testing软件测试网"@N(d|.Oc2d
at org.jmock.lib.AssertionErrorTranslator.translate(AssertionErrorTranslator.java:20)51Testing软件测试网0Zbrf"fU1w [
at org.jmock.Mockery.assertIsSatisfied(Mockery.java:196)51Testing软件测试网tW&CFzJo/c"_
at com.swzhou.tdd.guess.number.GameFacts.should_play_game_and_win(GameFacts.java:54)
51Testing软件测试网G&ocH~@&ld4[U!H?

J{1{2D&H%f%u%L3q0  太好了,正是我们期望的错误!别忘了我们只是在测试中定义了期望的游戏流程,真正的game.start()还是空的呢!现在就让测试指引着我们前行吧。51Testing软件测试网&S i!s+kF

51Testing软件测试网)Zut2u:c\I:G+p

  先改一改我们的Game类,把需要依赖的协作对象作为Game的字段:51Testing软件测试网8B bzV%^]'z

51Testing软件测试网F `+M f-N\0ijY

&r AvuIR0

{d"Q0|m,gK7YH5K0private AnswerGenerator answerGenerator;51Testing软件测试网w#\a \FE Ce
private InputCollector inputCollector;51Testing软件测试网8j;U*g.VQ.^
private Guesser guesser;51Testing软件测试网d1db%?^N0s
private OutputPrinter outputPrinter;

^0l[qBW|#av{0

h9G+j.^y2W0public Game(AnswerGenerator answerGenerator, InputCollector inputCollector, Guesser guesser, OutputPrinter outputPrinter) {
Yy@x$g0     this.answerGenerator = answerGenerator;51Testing软件测试网]m x??J:y'k
     this.inputCollector = inputCollector;
$X"mP4FC2j0     this.guesser = guesser;
&l9N"|&KF0     this.outputPrinter = outputPrinter;51Testing软件测试网v*_PveUGF
}

'Ovw%u(J f:_D{EQ0

0r/Qv&J c3m!{-F5k6N0  然后在start方法中通过answerGenerator来产生一个4位数:

0M@6K%n;}h VA051Testing软件测试网s| P JKpf~6xI

/Y;stx+RH#P0
publicvoidstart() {                         
~"kot(]N;Lfn0    String answer
=answerGenerator.generate();
^~ u+fzQ P#JB8d0}
51Testing软件测试网(J@n _@)I:@

  再跑测试,会发现仍然错,但结果有变化,第一步已经变绿了!51Testing软件测试网$w?4c5\~.r2l KU"V

:e s6cM+M5X0

x&e-oS'vRXYU0
51Testing软件测试网6@w7s;hK3[

java.lang.AssertionError: not all expectations were satisfied
(Pv i8O/ax0expectations:51Testing软件测试网!E|a&~)m
expected once,already invoked 1 time: answerGenerator.generate(); returns "1234"
8n q$a:Tc&A d2O0expected once,never invoked: inputCollector.guess(); returns "1234"
7M a:| h(z,O*X0expected once,never invoked: guesser.verify("1234"); returns "4A0B"51Testing软件测试网/Tt@ M?
expected once,never invoked: outputPrinter.print("You win"); returns a default value
7Ynh1n?2E0at org.jmock.lib.AssertionErrorTranslator.translate(AssertionErrorTranslator.java:20)51Testing软件测试网wg3DG8k3O#WV
at org.jmock.Mockery.assertIsSatisfied(Mockery.java:196)51Testing软件测试网 Mw5h#|,QC@U
at com.swzhou.tdd.guess.number.GameFacts.should_play_game_and_win(GameFacts.java:54)
51Testing软件测试网Cv4Sj(gB6W}

m&Zbd~Q-c^0  下面应该使用inputCollector来收集玩家的输入:

4w5T+]~e?pk0

.ATL"PTULn.Q0

%Be XNJDGc0publicvoidstart() {                         51Testing软件测试网&^c:_/zR ED
    String answer
=answerGenerator.generate();
9}Wz+k2{D8n)Sk0   String guess
=inputCollector.guess();    51Testing软件测试网IZN _8a&{
}51Testing软件测试网dX/K!B4Dso*}cs
 跑测试,错但是结果进一步好转,已经有两步可以通过了:
51Testing软件测试网c2h7iKW#N

51Testing软件测试网M;gOH9bY oD7i

9u!K V Rtvy b,B~0 java.lang.AssertionError: not all expectations were satisfied
\d)k?yt"_jgK0expectations:
_Z^$F!v;Z ^*P0expected once, already invoked 1 time: answerGenerator.generate(); returns "1234"51Testing软件测试网w2[2N2}%|k"S4T"Z
expected once,already invoked 1 time: inputCollector.guess(); returns "1234"51Testing软件测试网/Z\2GS5UE'MjP
expected once, never invoked: guesser.verify("1234"); returns "4A0B"51Testing软件测试网Q(Bc h x)~z6lMx
expected once, never invoked: outputPrinter.print("You win"); returns a default value51Testing软件测试网z;xtfc"FK'J
at org.jmock.lib.AssertionErrorTranslator.translate(AssertionErrorTranslator.java:20)
p$r-q@eC {'s0at org.jmock.Mockery.assertIsSatisfied(Mockery.java:196)51Testing软件测试网eL'lYa
at com.swzhou.tdd.guess.number.GameFacts.should_play_game_and_win(GameFacts.java:54)

E2i]6}6f:S`$E;U0
51Testing软件测试网!m6B!Q%^#uy

  下面加快节奏,按照测试中的需求把剩下的流程走通吧:51Testing软件测试网A WF[ r1Y,@ D

$Q-hpot9G051Testing软件测试网d XB%f j0@8i(i;a

public void start() {                         51Testing软件测试网 `Y.}5kU F d"qvj
    String answer = answerGenerator.generate();51Testing软件测试网9zdN0M,U Tb-gf)e
    String guess = inputCollector.guess();    
` K8X2F'}o0    String result = "";                       51Testing软件测试网yDFGa9oS$FH.i
    do {                                      
Ka [[gXp ~#}0       result = guesser.verify(guess, answer);51Testing软件测试网uY,T5WDm
    } while (result != "4A0B");               51Testing软件测试网1\$JOJ{:w%^
    outputPrinter.print("You win");           51Testing软件测试网s:f)GDc1KTf m
}
51Testing软件测试网:X jP$@~*P

  再跑测试,啊哈,终于看到那个久违的小绿条了!

N-fG:` OA051Testing软件测试网(T{\4j1h HJ3h3O

  回顾一下这一轮从无到有、测试从红到绿的小迭代,我们最终的产出是:

.TU\ ^vv.^051Testing软件测试网 }n%s!ZM%n"cS

  1、一个可以用来描述游戏流程的测试(需求,文档?)。51Testing软件测试网geh.a[

|#u*^ ead WU0  2、由该需求推出的一个流程骨架(Game.start)。

/S`.`Dn M*Q:C+Y0

AJkD q |%^t0  3、一堆基于该骨架的协作类,虽然是空的,但它们每个的职责是清晰的。51Testing软件测试网7c+v.}6yW X xg

51Testing软件测试网 AU5lKz/j

  经过这最艰难的第一步(实际上叙述的过程比较冗长,但反馈周期还是很快的),相信每个人都会对完整实现这个游戏建立信心,并且应该知道后面的步 骤要怎么走了吧。是的,我们可以通过写更多的骨架测试来进一步完善它(比如考虑失败情况下的输出,增加对用户输入的验证等等),或者深入到每个小协作类 中,继续以TDD的方式实现每一个协作类了。无论如何,骨架已在,我们是不大可能出现大的偏差了。

'J'Q$UP.J$w(G+l051Testing软件测试网 ZV-Q'ZJ-a

TAG:

 

评分:0

我来说两句

Open Toolbar