自动化软件测试练习

上一篇 / 下一篇  2012-07-13 08:56:44 / 个人分类:自动化测试

51Testing软件测试网 {^x s.d

  为了确认游戏的功能是否正常,你需要一遍一遍地在你的游戏中输入命令。这个过程是很枯燥无味的。如果能写一小段代码用来测试你的代码岂不是更好?然后只要你对程序做了任何修改,或者添加了什么新东西,你只要「跑一下你的测试」,而这些测试能确认程序依然能正确运行。这些自动测试不会抓到所有的bug,但可以让你无需重复输入命令运行你的代码,从而为你节约很多时间。51Testing软件测试网,qr;J~,`

51Testing软件测试网g5d9|,Y_

  从这一章开始,以后的练习将不会有「你应该看到的结果」这一节,取而代之的是一个「你应该测试的东西」一节。从现在开始,你需要为自己写的所有代码写自动化测试,而这将让你成为一个更好的程序员。

$I2kT1r!e051Testing软件测试网 V5vC0NE!PP sS

  我不会试图解释为什么你需要写自动化测试。我要告诉你的是,你想要成为一个开发人员,而程序的作用是让无聊冗繁的工作自动化,测试软件毫无疑问是无聊冗繁的,所以你还是写点代码让它为你测试的更好。

G4BMyw1b"h051Testing软件测试网2vz.s&qH&ZBu F

  这应该是你需要的所有的解释了。因为你写单元测试的 原因是让你的大脑更加强健。你读了这本书,写了很多代码让它们实现一些事情。现在你将更进一步,写出懂得你写的其他代码的代码。这个写代码测试你写的其他 代码的过程将强迫你清楚的理解你之前写的代码。这会让你更清晰地了解你写的代码实现的功能及其原理,而且让你对细节的注意更上一个台阶。51Testing软件测试网VAT i%c!i

51Testing软件测试网*]&d8c~`~

  撰写TestCase51Testing软件测试网:y{[-Y!^0[#`

51Testing软件测试网#[/rx+E8U_

  我们将拿一段非常简单的代码为例,写一个简单的测试,这个测试将建立在上节我们创建的项目框架上面。

5}%z} IL&\Z051Testing软件测试网9HAg7M*gN*p3z9q

  首先从你的项目框架创建一个叫做 ex47 的项目。确认该改名称的地方都有改过,尤其是 tests/ex47_tests.rb 这处不要写错。51Testing软件测试网/We'I"eS)E

51Testing软件测试网 aje,X'\Sq/T

  接下来建立一个简单的ex47/lib/game.rb 文件,里边放一些用来被测试的代码。我们现在放一个傻乎乎的小 class 进去,用来作为我们的测试对象:51Testing软件测试网.X(pc-XP O.m4j^

51Testing软件测试网"Pq,`-v#P3]D-l2y

class Room

EGh:KX(Yur1l051Testing软件测试网7k-R3xl1t'X%Df

  attr_accessor :name, :description, :paths51Testing软件测试网~ G(w*Ik,S

51Testing软件测试网a,n4VI-c)k g.tt

  def initialize(name, description)
~ ~OM(`i"m0    @name = name
,Gz)u*{ E JQ8n0    @description = description51Testing软件测试网1^bf"d W"yr#V#|
    @paths = {}
}4h(}\5lS0  end

UN[)m#a^3a8|h0

-C Vy#zS0  def go(direction)
tlI:Y?M,L0    @paths[direction]
P XoJ;wo;sZrT0  end
51Testing软件测试网p$Cj!AM"k\0mS

51Testing软件测试网\N hX3Ctu4B,oV

  def add_paths(paths)51Testing软件测试网 xq GJ,S0L
    @paths.update(paths)51Testing软件测试网6M1z8s6C.\
  end
51Testing软件测试网+Z8J upz

(o6b'z P-S,yOA0end51Testing软件测试网;^s4ep*a

;D{2h r7LXKI0  一旦你有了这个文件,修改你的 unit test 框架变成这样:51Testing软件测试网%a [S _~~R$U

51Testing软件测试网1Ar~A-|"GU u ] er

require 'test/unit'51Testing软件测试网8X0] \6c)P*m3G
require_relative '../lib/ex47'

!u3Oc2@p_ lI051Testing软件测试网Ws m-g.o%M\v{

class MyUnitTests  north, :south => south})
"gTT4aY}v5O*A4Ry0    assert_equal(center.go(:north), north)51Testing软件测试网!u9h)S7l;b5[4P#\~ f
    assert_equal(center.go(:south), south)
X&K&tfm sh0  end

&YCZ(R(Y m0|6r a051Testing软件测试网2Kt6Q zEq*d0w

  def test_map()51Testing软件测试网Fywvt8D|\
    start = Room.new("Start", "You can go west and down a hole.")
;L(_*p Ch&Q sAA@0    west = Room.new("Trees", "There are trees here, you can go east.")
+b#{.Z*?[q+A:Fa0    down = Room.new("Dungeon", "It's dark down here, you can go up.")

5FX} z*R1A051Testing软件测试网+nR"g6t`_ L/B R/J

    start.add_paths({:west => west, :down => down})
E3cny x0    west.add_paths({:east => start})
dR\/rfX0    down.add_paths({:up => start})
51Testing软件测试网8?)]2wm(han4J

w^ ~U7ZJi d0    assert_equal(start.go(:west), west)51Testing软件测试网F9B SSb,g1i%I
    assert_equal(start.go(:west).go(:east), start)51Testing软件测试网,nB$J#`1q8M hYSU
    assert_equal(start.go(:down).go(:up), start)51Testing软件测试网QbN e Je4l1HS!J
  end
51Testing软件测试网%h"je}:_.w!s"b

51Testing软件测试网:?~]"J%v6d"\I

end51Testing软件测试网 `.l%|S;@T

"q Fz^;Q@-w.b5^0  这个文件 require 了你在lib/ex47.rb 里建立的 Room这个类,接下来我们要做的就是测试它。于是我们看到一系列的以 test_ 开头的测试方法,它们就是所谓的「Test Case」,每一个Test Case里面都有一小段代码,它们会建立一个或者一些房间,然后去确认房间的功能和你期望的是否一样。它测试了基本的房间功能,然后测试了路径,最后测试 了整个地图。51Testing软件测试网/Wv*h3s:f)vzN

51Testing软件测试网 v1Z`.b;S(s s

  这里最重要的方法是 assert_equal,它保证了你设置的变量,以及你在Room 里设置的路径和你的期望相符。如果你得到错误的结果的话,Ruby 的 Test::Unit 模块将会印出一个错误信息,这样你就可以找到出错的地方并且修正过来。51Testing软件测试网 yzS4O'Kpa[mR

51Testing软件测试网I!k4h]?'gF

  测试指南51Testing软件测试网4@%tbd A!gl:h

51Testing软件测试网 F3Hb%d UC

  在写测试代码时,你可以照着下面这些不是很严格的指南来做:

i+_.h*r ]6d$Sq8lf051Testing软件测试网aYX%gHI

  1、测试脚本要放到 tests/目录下,并且命名为test_NAME.rb这样做还有一个好处就是防止测试代码和别的代码互相混掉。51Testing软件测试网a,\G#P#Ro%q

E,M||r0  2、为你的每一个模块写一个测试。51Testing软件测试网)ksYUB|A3K

;B4i4ih~\0  3、Test Cast 方法保持简短,但如果看上去不怎么整洁也没关系,Test Cast一般都有点乱。51Testing软件测试网 ^"Q;q\C@|']

Ja.a[0W i u6N$x0  4、就算Test Cast有些乱,也要试着让他们保持整洁,把里边重复的代码删掉。建立一些辅助方法来避免重复的代码。当你下次在改完代码需要改测试的时候,你会感谢我这一条建议的。重复的代码会让修改测试变得很难操作。51Testing软件测试网I `_V3rCW

R{ Q$Yh-q R*L'["Q?0  5、最后一条是别太把测试当做一回事。有时候,更好的方法是把代码和测试全部删掉,然后重新设计代码。51Testing软件测试网!m r$p_]Cat

51Testing软件测试网*Bl Y5B7GF&s

  你应该看到的结果

w l6g5]*f({i051Testing软件测试网 ZC;aP1[E'SX

51Testing软件测试网f1ya C*m ]8\

51Testing软件测试网s)_;@x'LV

$ ruby test_ex47.rb
y k_q0y0Loaded suite test_ex4751Testing软件测试网[A fNCm5B1F~,_3ZPq
Started51Testing软件测试网5^ ~$VQ TXpE!n
...51Testing软件测试网6kg6?1r(g9GD_
Finished in 0.000353 seconds.
51Testing软件测试网O x1E2[8i5Y ~yk

51Testing软件测试网G*K/I)i T

3 tests, 7 assertions, 0 failures, 0 errors, 0 skips

4~0G(c@KD0}#K-t0

*|7aVz(j[^0Test run options: --seed 6353751Testing软件测试网e}Qdt

51Testing软件测试网S n,Ds v

  程序正确,测试代码运行结果如上,试着将程序改错,运行测试代码看看结果会是什么样子。51Testing软件测试网6o@3V u1Qd&P-f

51Testing软件测试网 OB+IR C.D

  加分练习51Testing软件测试网ao4om R4UC;R

5H~ PV4B1{"[,y0  1、仔细阅读Test::Unit相关的文件,再去了解一下其他的替代方案。51Testing软件测试网F]#xJ r)m

I.p,n!p4O0  2、了解一下 Rspec,看看它是否可以干得更出色。51Testing软件测试网 U,D%\O}XM

y(z&Vn |6P]4S0  3、改进你游戏里的 Room,然后用它重建你的游戏。这次重写,你需要一边写代码,一般把单元测试写出来。

%k&Xd{\cp0

TAG:

 

评分:0

我来说两句

Open Toolbar