分享
 
 
 

NUnit Cookbook(.net单元测试工具)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

NUnit Cookbook

本文讲述了如何用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");

}

}

一旦准备好Fixture,就可书写任意多的测试用例。

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);

AssertEquals(expected, f12CHF.Add(f28USD.Add(f14CHF)));

}

创建MoneyTest的实例:

new MoneyTest("TestMoneyMoneyBag")

当这个测试运行起来时,测试会查找测试方法的名字并调用它。一旦有多个测试,就可以把他们组织成一个Suite。

Suite

如何一次进行多个测试?NUnit提供了TestSuite,它可以一次运行任意数目的测试。例如,运行一个单独的测试用例:

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

如何运行这些测试并收集结果呢?NUnit提供了定义suite运行和显示结果的工具。为了使你的suite对于TestRunner时可存取的,必须定义一个返回测试suite 的static property Suite。

例如,在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属性的类名。如下图:

在reload已编译类的动态编程环境中,你可以不需要NUnit窗口。在其他环境中,你必须为每次运行不断重启GUI版本。这是非常乏味和费时的工作,这在将来的版本中会得到改进。

同样,有一个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 就可运行测试。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有