在上述代码中,被测单元Account.java有构造方法、存钱(deposit)、取钱(withdraw)、余款查询(checkBalance)以及人民币与美元兑换(toDollar)这些方法。CaseCheck.java构造了TomAccount这个对象,测试该对象上述方法是否能正常工作。注意到toDollar方法中调用了另一模块中的RmbtoDollar这个静态方法,因此,在本测试程序中加入了桩模块MoneyTran。实际中MoneyTran的RmbtoDollar()方法可能要完成实时的数据表查询操作,然而,因为被测单元是Account.java,所以采用一个简单的数值返回行了。

  目前常用的JUnit以及Nunit基本上都采用了上述实现架构。例如,在JUnit中上述CaseCheck.java文件可以用如下文件代替:

import junit.framework.*;
/* * Using junit to complete test task. */
public class JunitCaseCheck extends TestCase {
protected Account TomAccount;
protected Account NullPointer;
public JunitCaseCheck(String args0){ super(args0); }
protected void setUp() throws Exception{ TomAccount=new Account(8000);}
protected void tearDown() { TomAccount=NullPointer;}
public static Test suite() { return new TestSuite(JunitCaseCheck.class);}
public void testConstructor() {assertTrue(TomAccount.checkBalance()== 8000);}
public void testWithdraw(){ TomAccount.withdraw(1000);
assertTrue(TomAccount.checkBalance()== 7000);}
public void testDeposit(){ TomAccount.deposit(1000);
assertTrue(TomAccount.checkBalance()== 9000);}
public void testtoDollar(){assertTrue((int)(MoneyTran.RmbtoDollar()*8000)==TomAccount.toDollar()); }
public static void main(String[] args){ junit.swingui.TestRunner.run(JunitCaseCheck.class);}
}

  保持其他两个java文件不变,可以看到JUnit将以绿条表示上述测试全部通过。由于NUnit一般采用C#描述测试脚本,上述三个程序都要做一些词法上的调整。

  单元测试工具之外的工作

  单元测试工具必须在人的辅助下完成单元测试任务。测试人员在运行单元测试工具之前,应设计好相应的测试用例。然后将测试用例输入驱动模块进行相应软件单元的测试工作。

  如何设计高质量的测试用例是一个很有技术含量的论题,而且,一个设计完好的测试用例本身有时也应随编程语言、运行环境等做适应性修改。这里笔者给出几点经验之谈。

  ● 设计正常测试用例

  这里,正常测试用例是指在实际业务中经常使用到的、不能出错的测试用例。设计正常的测试用例,关键是做到全面。要充分考虑到系统客户可能会实际面对的各种应用的情境,而不能只测一种或几种应用情境,忽略其他的情境。

  ● 设计边界值测试用例

  边界值测试用例是指使用处于条件的边界的数值来测试被测软件单元能否作出预期反应的测试用例。比如对于一个int型数据,可以考虑输入一个int型数据大值看会发生什么情况,又比如对于循环或条件语句,可以考虑输入条件的临界值,看看软件单元如何反应。边界值测试用例能较好地暴露编码人员逻辑不严密的地方。