既然选择远方,便只顾风雨兼程……

(译)寻找bug的十二条捷径(一)——让你的计算机去做那些让人厌烦的事情

上一篇 / 下一篇  2007-12-29 00:52:24 / 个人分类:【译】寻找bug的12条捷径系列

原文地址:http://today.java.net/pub/a/today/2004/01/22/DozenWays.html51Testing软件测试网{B2tT.a'lr^

译者:Aaron如有意见建议或者交流需要,请联系unique.wuchaodong@hotmail.com51Testing软件测试网 }P!khL"u8^

 测试驱动开发最近越来越受到大家的关注,而且我相信大家对它的兴趣会越来越浓厚。一个很重要的原因就是:每个人都知道测试是很重要的,现在也有一些比较专业的开发人员主张测试先行,他们认为这样可以做出更好的软件。这些人也很快发现测试驱动开发让他们的效率提高很多,也减少了很多压力。他们只需要用很少的时间就可以创造出一系列通过的测试和具有良好设计的代码。听起来不错吧?试一试吧,你一定会受益匪浅的!51Testing软件测试网|2OZ:DF"c3P(q

   这篇文章列出了十二种关于怎样开始写测试和怎样持续下去的实用方法而不需要考虑你使用的是哪一类软件方法。前面的两个技巧是教你怎样推翻自己已经写出来的代码,因此你不必一下子甩开代码去专注于测试,这样可能会比较容易接受吧。接下来的两个是让你尝试一下进一步了解测试驱动开发的好处的,其余的技巧则是帮你更加有效地完成你的测试。

%Y*Z L p3y5JM0

 

8m1v%y W@/D0

让你的计算机去做那些让人厌烦的事情

v;y(W6@l m)L1b-S'z0

 51Testing软件测试网N8~ xj ~aR

开始写测试用例的最简单的方法就是将自己可以看到结果的情形都列出来,然后用自动化的方式取代手动方式(人眼)去验证它们。不要说我懒,我会用计算机来完成这些事情,这样会比手动执行会更加可靠。有些时候可能会碰到比较麻烦的情况,这时候当然还是需要你亲自出马了,那就不要从这种地方开始你你的测试,你应该从那些比较容易的地方开始,那样你可以先找到一点bug来涨涨自信。我发现在大多数情况下,使用main()方法这种形式的测试代码比较适合用于自动化测试。我不是说main(),我们应用程序的入口点,我们需要的只是一个测试的入口并将测试结果输出。

C#vsq2XOH0

 51Testing软件测试网 Q-yx5x!@,w.}(B

例子:假设你正在写一个java类,它只是实现一个简单的电子表格的功能,一个表格的单元格是用类似"A1"这种用行和列的标帜来定义,这个单元格可以用来存放一些数据,我们利用这个电子表格来实现数据的存储和查找等功能。这里有一个关于main()形式的测试用例:

3C hDxO B;VgY0

public static void main(String args[]) {

4G6_ q!Ff8n4x?0

       

xa(^}L+j"~2Q:nrA0

   Spreadsheet sheet = new Spreadsheet();51Testing软件测试网lX@O.o F[

       

U%R(Ed-b7D5i$H"w-b0

   System.out.println("Cell reference:");51Testing软件测试网\V6X O+[,x

   sheet.put("A1", "5");

-r0Q2p9qZQ:n2s6u7G0

   sheet.put("A2", "=A1");

.cR&YS*R-F;@-r U%N%v0

   System.out.println("A2 = " + sheet.get("A2"));

~]6B6gT9Je0

       51Testing软件测试网 M:\2m7o9Vq5N9@1e

   System.out.println("\nCell change propagates:");51Testing软件测试网f.}u.~#N$t4~/l

   sheet.put("A1", "10");51Testing软件测试网 XwP`&\8jU|R

   System.out.println("A2 = " + sheet.get("A2"));51Testing软件测试网koA^ VSk6y

       51Testing软件测试网H{l0o"e;{rx

   System.out.println("\nFormula calculation:");51Testing软件测试网$jMR I:\

   sheet.put("A1", "5");51Testing软件测试网c kTKW;Ie&n

   sheet.put("A2", "2");51Testing软件测试网 A&@&T ~s

   sheet.put("B1", "=A1*(A1-A2)+A2/3");51Testing软件测试网8L$A~K2Q

   System.out.println("B1 = " + sheet.get("B1"));

{;h ^4~W} ZCq-g0

}51Testing软件测试网s/A4W%xW

或许你已经发现对这些代码似曾相识,这样做的冬季很单纯,我们检验我们的程序的运行结果是否与期望结果相符,如果是那我们可以对自己的代码(质量)增加信心了。这些年来这种方式一直是我的必备武器,它很简单很好用。我们也要注意,这种方法可能会耗费自己大量的时间,因为一旦电子表格的相关代码发生了变动,我们就必须运行一次这样的测试来检验这些改动是否影响到这里,显然如果我再次运行测试并看到了下面的输出结果我会对自己的改动充满信心。(因为测试证明我的改动没有破坏其他的地方)51Testing软件测试网5JiAsj#RS\BJ^

Cell reference:

X-TMG T(p0

A2 = 5

V]*Y1O.X{0

 51Testing软件测试网T%q'o)Ig4r

Cell change propagates:51Testing软件测试网6N*C koN

A2 = 10

)Z![%{`Ez7|Q-\0

 51Testing软件测试网d3x1TEO

Formula calculation:

E;@mU'Le0

B1 = 1551Testing软件测试网B.Q0xDnoJx/[q+@

 51Testing软件测试网:WqO0K`0y+o

这种方法有一个问题:需要我们每次在测试运行之后手工(人眼)检查测试结果。如果我们正在大规模使用这种方法,那么这样的劳作方式会让人们感到痛苦。最终结果是我们开始感到厌烦甚至会因此放弃测试。人工检查结果还要求我们在测试运行的时候记住我们所希望看到的结果,这样如果你需要检查的结果由十几个部分组成……还记得住吗?如果我们记不住,我们的测试就失去了意义.51Testing软件测试网{E6JQ i#V"w&H

 51Testing软件测试网!P L;s2Yu

JUnit,这个工具可以帮你解决这个问题。如果你从来没有用过它,没关系,JUnit FAQhttp://junit.sourceforge.net/doc/faq/faq.htm)可以帮上你的忙,让你快速处理测试。运用JUnit可以让计算机帮你运行这些测试并帮你验证测试结果。下面是在JUnit中运行的测试代码:51Testing软件测试网:TD$\#w,v^#h,F

 

C/Wn0PWO0

import junit.framework.TestCase;

3s?"|| R tm0

 51Testing软件测试网y.Yp5p+tN

public class SpreadsheetTest extends TestCase {51Testing软件测试网#V1Et%J6N@o

   

3gu"~2UFf0

   public void testCellReference() {51Testing软件测试网jr3HU*XI;sR

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网jd r g]o7n0n

       sheet.put("A1", "5");

p W8O7|0Ap)l0

       sheet.put("A2", "=A1");51Testing软件测试网(y){ u5~{

       assertEquals("5", sheet.get("A2"));51Testing软件测试网`Ll(?"})O

   }

-i2xK6lH9oQ0

 51Testing软件测试网z8s+gvIm$z7o4a

   public void testCellChangePropagates() {51Testing软件测试网 Va#o6mwa

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网9Oy$lG,[v

       sheet.put("A1", "5");

dEMY p!f^ q0VyE0

       sheet.put("A2", "=A1");

VI7m/I j0

       sheet.put("A1", "10");

hv%CKnM7r0

       assertEquals("10", sheet.get("A2"));

!_W3Ybd2N0^H$|y0

   }51Testing软件测试网9v*qU k/|#\q*E

 

4]`u"Q$t0Pv0

   public void testFormulaCalculation() {

yS Wj;il~xu0

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网%Ho ^I0r'C]

       sheet.put("A1", "5");

H_)?cH3Qe0

       sheet.put("A2", "2");51Testing软件测试网.@?e[%K2I$aS

       sheet.put("B1", "=A1*(A1-A2)+A2/3");51Testing软件测试网V-oJ&mI Mr Ci

       assertEquals("15", sheet.get("B1"));

7obe!F;\ g#YK0

   }

`?_ TzY P#|0

}

iRU#_?)^(d2X H%F0

 

(_e1NO*fpQ0

请注意:结果的验证已经用assertEquals()方法来处理了,这个方法帮你验证我们所期望的值是否和测试运行后的结果一致,这样就不需要你痛苦地记忆那些数据了。

6w.zeN-Iq k0

 51Testing软件测试网7w p4|8{0k

JUnit有文本和图形化两种,不管是哪一种都能为你提供简约而精确的输出。如果使用文本形式的,当所有的测试都通过(预期结果与实际运行结果一致)的时候你可看到:51Testing软件测试网[g3nldE

 

$|e]0

> java junit.textui.TestRunner SpreadsheetTest51Testing软件测试网rP3\%c)BGEI

 

#c4XAU3gm0

...51Testing软件测试网v@E}QY`,p5EA

Time: 0.0451Testing软件测试网)Jy&h1T3o

 51Testing软件测试网%P*q-Jg8ar3z

OK (3 tests)51Testing软件测试网 p3r k2|%W(KT E{*|Y$J

 51Testing软件测试网#S9L0WI2bu8V l%r `

如果是使用具有图形界面的,这时候你会看到一个绿色的条:

Q.d&U @!rXZf0

2u]8Wk%G2m'MFH0Green bar51Testing软件测试网2@4q{ C0] A
Figure 1. Green is good

如果期望与实际运行结果不符,JUnit会迅速作出反应,根据选用的JUnit形式不同,看到的可能是一个刺眼的失败信息或者一个红色的条,同时会提供关于测试详细信息。

},n._T)}{0

 

1G,tv3{*[\u0

自动化测试是多此一举?我想现在应该已有定论了吧。自动化测试组件可以带你脱离手工测试的苦海,这样你就有了更充足的时间去设计更加全面的测试。Pragmatic Unit Testing这本书可以帮助你提升测试技巧,写出更好的测试。如果你新增加了一批测试用例,你也已不需要多花很多的时间来运行这些测试。随着项目中测试的逐渐深入,自动化测试的价值会逐渐提升——尤其是在进行回归测试的过程中,它可以节省很多时间。

t$S b.Oj0~4S051Testing软件测试网?+_/rEl(h


TAG: Bug

 

评分:0

我来说两句

Open Toolbar