简单的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)); } 如果要写的测试与以前写的测试非常像,那么托匆桓鯢ixture来代替。如果想在一个测试中运行更多的东西,就创建一个Suite。 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"); } } 一旦准备好Fixture,就可书写任意多的测试用例。 Test Case 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); AssertEquals(expected, f12CHF.Add(f28USD.Add(f14CHF))); } 创建MoneyTest的实例: new MoneyTest("TestMoneyMoneyBag") 当这个测试运行起来时,测试会查找测试方法的名字并调用它。一旦有多个测试,就可以把他们组织成一个Suite。 Suite TestResult result= (new MoneyTest("TestMoneyMoneyBag")).Run(); 创建一个有两个测试用例的suite并且一次运行它们: TestSuite suite= new TestSuite(); suite.AddTest(new MoneyTest("TestMoneyEquals")); suite.AddTest(new MoneyTest("TestSimpleAdd")); TestResult result= suite.Run(); 另一种方法是让NUnit从一个TestCase吸取出一个suite,只需把你的TestCase传给TestSuite的constructor即可: TestSuite suite= new TestSuite(typeof(MoneyTest)); TestResult result= suite.Run(); 当创建只包含一个测试用例子类的suite时,使用手工方法。否则就采用自动方法,它避免了在每增加新的测试用例时都要改变suite的创建代码。 TestSuites并不是只能包含TestCase类。它可以包含实现了ITest的任意对象。例如,你可以在你的代码中创建一个TestSuite,同样我也可以在我的代码中这样做。那么我们就可以创建一个包含它们的TestSuite来一次运行它们: TestSuite suite= new TestSuite(); suite.AddTest(Kent.Suite()); suite.AddTest(Erich.Suite()); TestResult result= suite.Run(); TestRunner 例如,在MoneyTest中加入以下代码使MoneyTest suite对于TestRunner可用: public static ITest Suite { get { TestSuite suite= new TestSuite(); suite.addTest(new MoneyTest("TestMoneyEquals")); suite.addTest(new MoneyTest("TestSimpleAdd")); return suite; } } 如果一个TestCase类不定义一个suite方法,TestRunner将自动产生用所有方法来填充的suite,并在这些方法名字前加上前缀“Test”。NUnit提供两种TestRunner:GUI和字符版本。 GUI窗口包含:填写包含测试类的DLL 或EXE名字的文本框;填写在DLL 或EXE中拥有Suite属性的类名。如下图:
同样,有一个NUnit的批处理接口。为了使用命令行的NUnit,可以在系统提示符下键入NUnitConsole后跟包含Suite属性的类所在的装配体。例如,使用批处理TestRunner测试MoneyTest: C:\NUnitConsole NUnit.Samples.Money.MoneyTest,NUnitSamples.dll 批处理接口将结果以文本的方式输出。另一个可选方法是在你的TestCase类的main方法中调用批处理接口。如下: public static void Main(String[] args) { NUnit.TextUI.TestRunner.Run(Suite); } 这样,只需在系统提示符下键入MoneyTest 就可运行测试。 | |