(译)寻找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-YS0测试驱动开发最近越来越受到大家的关注,而且我相信大家对它的兴趣会越来越浓厚。一个很重要的原因就是:每个人都知道测试是很重要的,现在也有一些比较专业的开发人员主张测试先行,他们认为这样可以做出更好的软件。这些人也很快发现测试驱动开发让他们的效率提高很多,也减少了很多压力。他们只需要用很少的时间就可以创造出一系列通过的测试和具有良好设计的代码。听起来不错吧?试一试吧,你一定会受益匪浅的!51Testing软件测试网c%HkF.eN
这篇文章列出了十二种关于怎样开始写测试和怎样持续下去的实用方法而不需要考虑你使用的是哪一类软件方法。前面的两个技巧是教你怎样推翻自己已经写出来的代码,因此你不必一下子甩开代码去专注于测试,这样可能会比较容易接受吧。接下来的两个是让你尝试一下进一步了解测试驱动开发的好处的,其余的技巧则是帮你更加有效地完成你的测试。
EPwme+K0让你的计算机去做那些让人厌烦的事情
W?0H H;s)fh"p*z#v:f0
开始写测试用例的最简单的方法就是将自己可以看到结果的情形都列出来,然后用自动化的方式取代手动方式(人眼)去验证它们。不要说我懒,我会用计算机来完成这些事情,这样会比手动执行会更加可靠。有些时候可能会碰到比较麻烦的情况,这时候当然还是需要你亲自出马了,那就不要从这种地方开始你你的测试,你应该从那些比较容易的地方开始,那样你可以先找到一点bug来涨涨自信。我发现在大多数情况下,使用main()方法这种形式的测试代码比较适合用于自动化测试。我不是说main(),我们应用程序的入口点,我们需要的只是一个测试的入口并将测试结果输出。51Testing软件测试网2cj9b/c^L+gg
例子:假设你正在写一个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[0sheet.put("A1", "5");51Testing软件测试网`(d4K4S KnG%Fi
sheet.put("A2", "=A1");
H{%Y\kZ0System.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^hy3mmN0System.out.println("A2 = " + sheet.get("A2"));51Testing软件测试网K-_-Q$zS+FA
6p8X i+X D5s0HX8Qe'nH0
System.out.println("\nFormula calculation:");
7pa:nUq;J @0sheet.put("A1", "5");51Testing软件测试网 N2iw-xd9X
sheet.put("A2", "2");
7]^f~x-j"i0sheet.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#NrW#G
A2 = 551Testing软件测试网+aW!D6N!N6Ut/@5gr5M
Cell change propagates:51Testing软件测试网` nub#gk*T M
A2 = 1051Testing软件测试网@4y/R)pj4^)_1ok
Formula calculation:
:Gh~)f!N/s{2P)V0B1 = 1551Testing软件测试网|X4?uCBL/|s8p,Y6a
这种方法有一个问题:需要我们每次在测试运行之后手工(人眼)检查测试结果。如果我们正在大规模使用这种方法,那么这样的劳作方式会让人们感到痛苦。最终结果是我们开始感到厌烦甚至会因此放弃测试。人工检查结果还要求我们在测试运行的时候记住我们所希望看到的结果,这样如果你需要检查的结果由十几个部分组成……还记得住吗?如果我们记不住,我们的测试就失去了意义.51Testing软件测试网[0BSZ I7I8ht4v
JUnit,这个工具可以帮你解决这个问题。如果你从来没有用过它,没关系,JUnit FAQ(http://junit.sourceforge.net/doc/faq/faq.htm)可以帮上你的忙,让你快速处理测试。运用JUnit可以让计算机帮你运行这些测试并帮你验证测试结果。下面是在JUnit中运行的测试代码:
)b)l)a,p.^s0import junit.framework.TestCase;
rM(^um0public class SpreadsheetTest extends TestCase {
7|Nc~2]8r+|z0i,mkB6r0
public void testCellReference() {
)s/O0bT#[0Spreadsheet sheet = new Spreadsheet();51Testing软件测试网3PN$TA c*P,W
sheet.put("A1", "5");
YPrTa3o2J |_0sheet.put("A2", "=A1");
&}a.C"}KVJ0assertEquals("5", sheet.get("A2"));
^J L6w8h8kQ0}