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

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

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

原文地址:http://today.java.net/pub/a/today/2004/01/22/DozenWays.html

+O5T!f]F*c0

译者:Aaron如有意见建议或者交流需要,请联系unique.wuchaodong@hotmail.com

*c/U'[m-Y S0

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

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

EPwme+K0

 51Testing软件测试网V7`4i4gf6V0b+S#J

让你的计算机去做那些让人厌烦的事情51Testing软件测试网t6z_7? Dz#]

 

W?0H H;s)fh"p*z#v:f0

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

 

+x M?.S8{7w{-f0

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

public static void main(String args[]) {51Testing软件测试网#?k*A'S3nJh%S??

       

'~/a;T#pMc0

   Spreadsheet sheet = new Spreadsheet();51Testing软件测试网7M1Am@,K/S3S,D

       51Testing软件测试网 a/t]+M+x3EK

   System.out.println("Cell reference:");

} PD#X f[0

   sheet.put("A1", "5");51Testing软件测试网`(d4K4SKnG%Fi

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

H{%Y\kZ0

   System.out.println("A2 = " + sheet.get("A2"));51Testing软件测试网 Yh(xmvx/y3`

       51Testing软件测试网4r+P'P6S.r T}

   System.out.println("\nCell change propagates:");51Testing软件测试网6T.~2S+DW|S

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

t~Y7k8l3^hy3mmN0

   System.out.println("A2 = " + sheet.get("A2"));51Testing软件测试网K-_-Q$zS+FA

       

6p8Xi+XD5s0HX8Qe'nH0

   System.out.println("\nFormula calculation:");

7pa:n Uq;J @0

   sheet.put("A1", "5");51Testing软件测试网 N2iw-xd9X

   sheet.put("A2", "2");

7] ^f~x-j"i0

   sheet.put("B1", "=A1*(A1-A2)+A2/3");51Testing软件测试网9S0kd]]?n~ft/r(B

   System.out.println("B1 = " + sheet.get("B1"));51Testing软件测试网1Fv+`[.[)o,|EeS

}51Testing软件测试网0q,h ^4S;k

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

Cell reference:51Testing软件测试网bi$D#N rW#G

A2 = 551Testing软件测试网+aW!D6N!N6Ut/@5gr5M

 

sLgP5n0

Cell change propagates:51Testing软件测试网`nub#gk*TM

A2 = 1051Testing软件测试网@4y/R)pj4^)_1ok

 51Testing软件测试网 x*o"sS9G

Formula calculation:

:Gh~)f!N/s{2P)V0

B1 = 1551Testing软件测试网|X4?uCB L/| s8p,Y6a

 

h*mp;^4_{2C+A0

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

 51Testing软件测试网L2rrgs

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

)b)l)a,p.^s0

 

'x)e {pZ0

import junit.framework.TestCase;

r M(^um0

 51Testing软件测试网RM[i ~

public class SpreadsheetTest extends TestCase {

7|Nc ~2]8r+|z0

   

i,mk B6r0

   public void testCellReference() {

)s/O0bT#[0

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网3PN$TA c*P,W

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

YPrTa3o2J |_0

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

&}a.C"}KVJ0

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

^J L6w8h8kQ0

   }

M e0y\D w1Y;l0

 51Testing软件测试网-VEz H{

   public void testCellChangePropagates() {

|Kf\\ E+Y.E:B9z0

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网_mD"v6o9dJ*B

       sheet.put("A1", "5");51Testing软件测试网ACx!c|.N

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

$c:Pka]d0

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

)R`(oGJ"X5In0

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

:jm.D*tnA _ {0

   }51Testing软件测试网J+_3g/Y"Qf~Y%P

 

\D'hz^mo+Q0

   public void testFormulaCalculation() {

4B/x l)NS"K0

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网r3be]B g+V k

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

6y @ fd1\;` Ta+p0

       sheet.put("A2", "2");

2j1^0HU4W1c*o%tnm0

       sheet.put("B1", "=A1*(A1-A2)+A2/3");51Testing软件测试网k)sU.I@Z8nd*v

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

9\{Ie'N0

   }

)oN)H6@ ]#jF0v2?4M0

}51Testing软件测试网8vjwrh

 

'y]JTI!g3j$u0

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

$C FF0Y^2o0

 51Testing软件测试网 Ms*WFjs+{v

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

 51Testing软件测试网i~,XR3uMg8KW

> java junit.textui.TestRunner SpreadsheetTest51Testing软件测试网r9Wi,{3Z6\z^$a

 51Testing软件测试网Ze7P8W`'DwV0TFQ

...

jL P QS3T x)G(un0

Time: 0.0451Testing软件测试网j4j%j i,S#oX

 51Testing软件测试网R7i*y N2N`;t

OK (3 tests)51Testing软件测试网:v0il"^kp,t

 51Testing软件测试网fXF-e5L

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

(c5gW7s:O,`S_051Testing软件测试网,_Us$d]Io n

Green bar
c%AA3t{@v%I&p0Figure 1. Green is good

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

 51Testing软件测试网O9N:XA%PXe*F2q

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

+JtTO5SM051Testing软件测试网p&OZ"z$I%h8^7p9p


TAG: Bug

 

评分:0

我来说两句

Open Toolbar