本文讲述了如何用NUnit书写和组织测试代码的步骤。
简单的Test Case
书写软件测试代码的步骤:
1. 创建TestCase的一个实例;
2. Override方法RunTest();
3. 如要检查某值,则调用Assert。
例如,测试“两个Money对象之和与包含它们之和的对象相等”的测试代码如下:
public void TestSimpleAdd() {
Money m12CHF= new Money(12, "CHF");
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.Add(m14CHF);
Assert(expected.Equals(result));
}
如果要写的测试与以前写的测试非常像,那么就写一个Fixture来代替。如果想在一个测试中运行更多的东西,就创建一个Suite。
Fixture
如果有两个或两个以上的测试作用于相同或类似的对象集,我们该怎么办呢?测试作用于一个已知的对象集,这个对象集被称为fixture。一般建立这个fixture的时间比实际测试的时间多得多。
当有个公共的fixture时,我们可以这么做:
1. 创建TestCase的子类。
2. 为fixture的每部分加入一个实例变量。
3. Override SetUp()初始化这些变量。
4. Override TearDown()释放任何在SetUp中分配的永久资源。
例如,编写用来与12 Swiss Francs,14 Swiss Francs和28 US Dollars不同组合一起工作的TestCase时,首先创建一个fixture:
public class MoneyTest: TestCase {
private Money f12CHF;
private Money f14CHF;
private Money f28USD;
protected override void SetUp() {
f12CHF= new Money(12, "CHF");
f14CHF= new Money(14, "CHF");
f28USD= new Money(28, "USD");
}
}
Test Case
当有一个Fixture如何书写和调用一个独立的Test Case呢?书写一个没有的fixture测试用例是非常简单的——只需在TestCase 的一个子类中override RunTest。为一个Fixture书写测试用例是同样的方法,通过为set up代码制造一个TestCase的子类,然后为每个独立的测试用例制造不同的子类。然而,不久你就会注意到这些代码中的大部分成为了语法的牺牲品。
NUnit为书写一个基于Fixture的测试提供了简明的方法:
1. 在fixture类中书写一个public的测试方法。在此,必须确保这个方法是public的,否则它将不能通过reflection被调用。
2. 创建这个TestCase的一个实例,并把这个测试方法的名字传给它的constructor。
例如,测试一个Money对象与另一个MoneyBag的和:
public void TestMoneyMoneyBag() {
// [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]}
Money bag[]= { new Money(26, "CHF"), new Money(28, "USD") };
MoneyBag expected= new MoneyBag(bag);