TDD从何开始-2
上一篇 /
下一篇 2012-06-26 09:27:04
/ 个人分类:杂谈
运行测试,会看到下面的错误信息:51Testing软件测试网4W3d.DY0o6qk51Testing软件测试网 g*{)}5M)z ]U#A
51Testing软件测试网"Xd$_ [
uD]{ oj[ 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" 'DZ7AH 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&CFz Jo/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 bz V%^]'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;}hVA051Testing软件测试网s| P JKpf ~6xI/Y;stx+RH#P0publicvoidstart() { ~"kot(]N;Lfn0 String answer=answerGenerator.generate(); ^~
u+fzQ
P#JB8d0} |
51Testing软件测试网(J@n _@)I:@ 再跑测试,会发现仍然错,但结果有变化,第一步已经变绿了!51Testing软件测试网$w?4c5\~.r2l
KU"V
:es6cM+M5X0
x&e-oS'vRXYU051Testing软件测试网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" 7Ma:|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#|,Q C@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"PTUL n.Q0
%BeXNJDGc0publicvoidstart() { 51Testing软件测试网&^c:_/zRED
String answer=answerGenerator.generate();
9}Wz+k2{D8n)Sk0 String guess=inputCollector.guess(); 51Testing软件测试网IZN
_8a&{
}51Testing软件测试网dX/K!B4Dso*}cs
跑测试,错但是结果进一步好转,已经有两步可以通过了:51Testing软件测试网c2h7iKW#N51Testing软件测试网M;gOH9bYoD7i
9u!KV Rtvyb,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(Bch x)~z6l Mx 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软件测试网e L'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 T b-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)GDc1KTfm } |
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+Y0AJkDq
|%^t0 3、一堆基于该骨架的协作类,虽然是空的,但它们每个的职责是清晰的。51Testing软件测试网7c+v.}6y W
Xxg
51Testing软件测试网AU5lKz/j 经过这最艰难的第一步(实际上叙述的过程比较冗长,但反馈周期还是很快的),相信每个人都会对完整实现这个游戏建立信心,并且应该知道后面的步
骤要怎么走了吧。是的,我们可以通过写更多的骨架测试来进一步完善它(比如考虑失败情况下的输出,增加对用户输入的验证等等),或者深入到每个小协作类
中,继续以TDD的方式实现每一个协作类了。无论如何,骨架已在,我们是不大可能出现大的偏差了。
'J'Q$UP.J$w(G+l051Testing软件测试网
ZV-Q'ZJ-a
收藏
举报
TAG: