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

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

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

原文地址:http://today.java.net/pub/a/today/2004/01/22/DozenWays.html51Testing软件测试网JvRs"\

译者:Aaron如有意见建议或者交流需要,请联系unique.wuchaodong@hotmail.com51Testing软件测试网Ip3M"rl#V

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

2K6hmqM@ Tgv"l7P0

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

 51Testing软件测试网2^?)zM$ZK#l6Yx

让你的计算机去做那些让人厌烦的事情51Testing软件测试网z:G.xcJ1ub

 

(qc4?|m"v Q0

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

 51Testing软件测试网-\#J~+fp1pa

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

yp-rm*E0

public static void main(String args[]) {51Testing软件测试网,cbL x_]#I5c

       51Testing软件测试网H'aS-w2kyjZ

   Spreadsheet sheet = new Spreadsheet();

2N"~ vv|&i3wE0

       51Testing软件测试网B8N#CfE

   System.out.println("Cell reference:");51Testing软件测试网wnYI%a1x

   sheet.put("A1", "5");51Testing软件测试网#n$}l l1V? ]1~f

   sheet.put("A2", "=A1");51Testing软件测试网0cW"qc&R)C h

   System.out.println("A2 = " + sheet.get("A2"));51Testing软件测试网Cjn#D7A:M9v#B:v

       

5p"Y c#K.b0

   System.out.println("\nCell change propagates:");51Testing软件测试网8F5I!K?3Q;AN

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

4^pc'S!^n0

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

#C2oh"n8pmA E-q0

       51Testing软件测试网ze7r

   System.out.println("\nFormula calculation:");51Testing软件测试网T q'O!e1V$\e.kK

   sheet.put("A1", "5");51Testing软件测试网:i1C'{3^2q1Y7TS

   sheet.put("A2", "2");51Testing软件测试网pX,q~#ZB

   sheet.put("B1", "=A1*(A1-A2)+A2/3");51Testing软件测试网\%]0N P&Tj"W

   System.out.println("B1 = " + sheet.get("B1"));51Testing软件测试网+M5AI0L7X{ HT

}51Testing软件测试网0VW1Ru$c} V^

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

Cell reference:

+^ F*zI#R9fd'@S0

A2 = 551Testing软件测试网V+KP PC3@ d_#t

 51Testing软件测试网u:ww2v;b7lW

Cell change propagates:

.S1R J?'w)b9e1@p;R0

A2 = 10

r,R0U,GZq;p1S0

 51Testing软件测试网 g"Z6@F{3u3o/d-D

Formula calculation:51Testing软件测试网.CQHF(B'Ed@5W)R

B1 = 1551Testing软件测试网D#f/i8ZZ-sYO

 

g%Ht$aw2~.^0

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

Q]NR s{Y2}%RB0

 51Testing软件测试网 ^hS'GVi+?

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

 51Testing软件测试网Du xF/jK/}/g5V

import junit.framework.TestCase;51Testing软件测试网U p#Z4`]

 

dLX/nfpL"e6i)F0

public class SpreadsheetTest extends TestCase {51Testing软件测试网}MHP0]wrv|3u

   

j c Mnz.F)RPt2C0

   public void testCellReference() {

[q?Lc$PGO0

       Spreadsheet sheet = new Spreadsheet();

tN6zK k.rU*{0

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

D9I"K uu]1{_Y-\+p8LL0

       sheet.put("A2", "=A1");51Testing软件测试网V9}N"D;I5{

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

o.C,S"t(y[:l0

   }51Testing软件测试网"A$sh[_VfbD

 51Testing软件测试网%el"L$q{4h

   public void testCellChangePropagates() {

`6@*?{*X6V(WD |0

       Spreadsheet sheet = new Spreadsheet();

Y+t7qY`keZ|0

       sheet.put("A1", "5");51Testing软件测试网 NXF?)H"L)~lD^

       sheet.put("A2", "=A1");51Testing软件测试网Vp9p&Wq4{&ao

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

$TK(`?d s*W6f4\0

       assertEquals("10", sheet.get("A2"));51Testing软件测试网k^1W/j8shC&c

   }

b$t-K#LP2f/NG0

 

Poi!EZ T6o0

   public void testFormulaCalculation() {51Testing软件测试网)A6@!s*M.z4Gkc

       Spreadsheet sheet = new Spreadsheet();51Testing软件测试网1c*a+zFH7]Z

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

lf0r0\ ^ w0

       sheet.put("A2", "2");51Testing软件测试网1v?!A)w%be

       sheet.put("B1", "=A1*(A1-A2)+A2/3");

M%VVua/?0

       assertEquals("15", sheet.get("B1"));51Testing软件测试网7J?l~ ^7j

   }51Testing软件测试网'?-V H k2OC8|:\

}

u b _"n Ey7~vd0

 

,C%do2K3mz0V&v%s@3b0

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

L-h2fkh9O0

 51Testing软件测试网CuVP;s[+R)Mt1f

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

 51Testing软件测试网;j P ]dt3\

> java junit.textui.TestRunner SpreadsheetTest

z^)gfu.qcu@M0

 

qb5u1JN8B*z+?+W0

...51Testing软件测试网1u,gi+JC&N Vd8D5@2I

Time: 0.0451Testing软件测试网P#Pj$DeN

 

@-j])~)D2i0

OK (3 tests)

4d$t7Q [ J0

 

*UFk+mIW0

如果是使用具有图形界面的,这时候你会看到一个绿色的条:51Testing软件测试网d+b Z h]'v,f

q8IN!C*\'~/?4\L+s&g0Green bar51Testing软件测试网]+I%Y#}d'MO&L
Figure 1. Green is good

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

 51Testing软件测试网2{,Ep @Daf!J~7[

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

$z8}w|5WF YE[e0

Q7sa)`m?0

TAG: Bug

 

评分:0

我来说两句

Open Toolbar