许多书上都讨Z自动试Q但是只有很的著作注意到这么一个问题,那就是怎样把这些测试组lv来。随着试的增加,攄和调用这些测试却变得更加ȝ。这成Z个重要问题,以至于出CTDDQ极限编E(XPQTDD得以普及。另外,你可以这L解TDDQ通过试来开发?/font>
TDD的主要规范:
在编写程序代码之前,与之对应的自动测试必被写好。甚至程序代码ƈ不存在,那也要看见一个失败的试l果?/font>
在测试通过后,副本代码必须被丢弃?/font>
有一个具体步骤(可能指的是《Extreme Programming》)可以被Q何一个程序员来参考,而不需要特D的其他Ҏ。在我们开始写试之前Q这些步骤(章节Q应该被首先阅读——怎样l织自动试?/font>
讲解一下不同种cȝ试Q?/font>
单元试Q?/strong>模块(也就是类Q的正确性。如果对象需要访问外部的数据资源Q例如数据库Q就需要模拟一个mock objectsQ但在实际中真实数据与测试环境是不同的?/font>
客户试Q?/strong>q是功能性、系l、和验收试。用来测试整体的pȝҎ。在XP中,q些试qL写?/font>
l合试Q?/strong>介于用户试和单元测试之间的桥梁。综合测试帮助测试应用程序的交互性。一般情况下Qmock objects不被用于l合试Q它会增加测试时间。同Pl合试l常依赖Ҏ的测试环境,例如数据库送来的测试数据。综合测试也需要用到外部类库。例如ؓJ2EE应用E序q行l合试的类库Cactus。解释这些测试超Z本文的范_需要更加详l的信息请参?/font>http://jakarta.apache.org/cactus/?/font>
开发h员测试:q是用来让开发h员检验自׃码或新函数的。对于每一个开发h员,只要有可能,需要有更多的测试来验代码。组l这些测试和l织E序代码一样重要?/font>
在以下章节,只要提到“试”Q那指的是开发h员测试?/font>
我们几乎准备好开始徏立测试了Q先应该为我们的试选择名字。你也许会说Q?#8220;q不是问题:?#8216;Test’q个字放在类名前面,好了!”不会q么快!让我来说一下这个步骤存在的问题Q?/font>
在TDD中,被测试的cL者方法还不存在?/font>
一个测试能够覆盖多个方法,甚至多个c,q是可能的?/font>
以上只是一些普遍问题;q存在更多的问题?/font>
让我来提一个徏议,在测试命名时Q测试类的名字应该让Z眼就知道q是一个测试类Q且能说明它要测试什么,注意是否和其他类重名。按照以上徏议做Q就很简单了Q也不用担心名字太长或难听?/font>
卛_在Eclipse中用JUnit工具创徏我们W一个测试了。假设你已经下蝲了一个最新的Eclipse版本。如果还没有Q你应该d方站点http://www.eclipse.org下蝲。还需要JUnitQ也可以从http://www.junit.org/下蝲?/font>
q行Eclipse。新Z个workplace目Q点?strong>文g->新徏->目Q选择Java目Q点?strong>下一?/strong>。v一个项目名Uͼ例如ProjectWithJUnit。点?strong>完成。这样就完成新项目的建立了。再来配|一下EclipseQ在构徏路径中添加JUnitcd。在工具条上点击目->属?/strong>Q选择Java构徏路径Q?strong>?/strong>Q选择d外部JARQ浏览Junit被存储的目录Q选择junit.jarQ点?strong>打开。你会看见JUnit出现在库的列表中。点?strong>定Q让Eclipse重徏路径?/font>
现在开发我们的“Hello World”例子。按照TDD的规则,应该在代码徏立以前先把测试写好。ؓ了能够在某出开始,我们假设未来的类名是HelloWorldQƈ且有一个方法Say()Q这个方法返回String的|例如“Hello World!”Q?/font>
建立试Q在ProjectWithJUnit的标题上面点d键,选择新徏->其他Q展开“Java”选项Q选择JUnit。在双的栏目对话框中选择试案例Q然后下一步。参考图1?/font>
?. 在Eclipse中徏立JUnit试
在测试类q一栏中Q写上将要被试的类名HelloWorld。选择一?strong>试案例的名字,例如TestThatWeGetHelloWorldPromptQ是的,看上d长,但是很清楚它的行为。)点击完成?/font>
TestThatWeGetHelloWorldPrompt的代码如下:
import junit.framework.TestCase;
public class TestThatWeGetHelloWorldPrompt
extends TestCase {
public TestThatWeGetHelloWorldPrompt(
String name) {
super(name);
}
public void testSay() {
HelloWorld hi = new HelloWorld();
assertEquals("Hello World!", hi.say());
}
public static void main(String[] args) {
junit.textui.TestRunner.run(
TestThatWeGetHelloWorldPrompt.class);
}
}
代码q不复杂Q只是有点与众不同。然而,让我们考察一下细节。我们承了JUnit的TestCasec,它在JUnit的javadocs定义?#8220;q行众多试的夹兗?#8221;JUnit也有TestSuitec,它是一l测试案例的集合Q但在本文中不做讨论?/font>
建立试案例的步骤如下:
1、徏立一个junit.framework.TestCase的实例?/font>
2、定义一些以“test”开头的无返回方法(例如testWasTransactionSuccessful()QtestShow()Q等{)?/font>
TestThatWeGetHelloWorldPrompt.java包含q些QTestCase的子cd一个叫做testSay()的方法。这个方法调用了assertEquals()函数Q它用来比较我们预期的值和由say()q回的倹{?/font>
main()Ҏ用来q行试和显C出的。JUnit的TestRunner处理试Q提供基于图像和文本的输现Ş式。我们用基于文本的版本Q因为Eclipse支持它,且也适合我们。当开始运行后Q基于文本的版本试会以文本形式输出QEclipse会把q些输出自动变成囑փ界面的输出?/font>
按照TDD规范Q首ơ运行测试,应该故意让它p|。点?strong>q行->q行?/strong>->Junit试Q记住TestThatWeGetHelloWorldPrompt.java应该被突出的昄在包资源理器中Q。在左边H口Q应该看见JUnitH口而不?strong>包资源管理器Q它昄一个红条,一ơ失败的试Q具体的p|原因参看?。如果没有自动显C些内容,点击JUnit标签Q在底部的左边)?/font>
?. JUnit中失败的试
很好Q的却失败了。现在我们来建立被测试代码:在包资源理器窗口的ProjectWithJUnit标题上右击,选择新徏->c?/strong>。选择cdQ我们已l假设了它叫HelloWorldQ然后直接点?strong>完成。ؓHelloWorld.java填入下列代码Q?/font>
public class HelloWorld {
public String say() {
return("Hello World!");
}
}
q段代码很简单,甚至不需要注解,我们再来看看l果。按照上面描q过的方式,?strong>JUnit的窗口中昄了一个绿条,参看?。绿条证明测试成功?/font>
?. JUnit中成功的试
现在Q我们想再让试p|一ơ,但原因不同。这有助于展CJUnit试中不同的报错信息。修改assertEquals()代码Q把“Hello World!”变成“Hello Me!”。当再次q行JUnitӞl果变成了红条,?strong>JUnitH口的底部输Zp|原因Q参看图4?/font>
?. JUnit中的ComparisonError
最后,我想说一下关于测试是开发过E中的必要部分的话题。测试代码一直是开发中的重要部分。经q近几年的发展,已得C很大的提高,q要归功于强大的理论研究Q比?#8220;expectations-based development”{等Q,和快速发展的试工具包,q有试q程的改q。如果你对这文章感兴趣Q那请你׃些时间来正式的学习一下测试理论吧Q这对你的工作很有用?/font>