您的位置:首页 > 其它

NUnit单元测试使用实例

2007-09-20 15:42 330 查看
1.新建.NET项目-->类库

2.添加引用 nunit.framework.dll

3.编写测试用例(Test Case)

using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;

namespace NUnitTest
{
//作者: 王文平
//日期: 2007-09-20
//描述: NUnit单元测试Demo
/*
* TDD的简介
* 使用下面2个原则来定义TDD
* 除非你有一个失败的自动测试,永远不要写一单行代码.
* 阻止重复
* 第一个原则是显而易见的.在没有失败的自动测试下就不要写代码
* 第二个原则说明了在一个程序中,不应该包含重复的代码.如果代码重复
* /

/*
* TestFixture 属性
*本属性标记一个类包含测试,当然setup和teardown方法可有可无.
*做为一个测试的类,这个类还有一些限制
*必须是Public,否则NUnit看不到它的存在.
*它必须有一个缺省的构造函数,否则是NUnit不会构造它.
*/

[TestFixture]
public class NUnitExample
{
private int a;
private int b;
//SetUp 属性
//初始化
[SetUp]
public void InitializeOperands()
{
a = 1;
b = 2;
}

//Test属性用来标记一个类(已经标记为TestFixture)的某个方法是可以测试的.
[Test]
[Category("Numbers")]
public void AddTwoNumbers()
{
int sum = a + b;
Assert.AreEqual(sum, 3);
}
[Test]
[Category("Numbers")]
public void MultiplyTwoNumbers()
{
int product = a * b;
Assert.AreEqual(2, product);
}

//TearDown 属性
//清除

/*
* ExpectedException 属性
* 这里是一个验证这个假设的测试.有的时候,我们知道某些操作会有异常出现.
* 例如, 在实例中增加除法,某个操作被0除,抛出的异常和.NET文档描述的一样.参看以下源代码
*/

[Test]
[Category("Exception")]
[ExpectedException(typeof(System.DivideByZeroException))]
public void DivideByZero()
{
int zero = 0;
int infinity = a / zero;
Assert.Fail("Should have gotten an exception");
}

//Ignore 属性
//保持测试,但又不运行
[Test]
[Category("Numbers")]
[Ignore("Multiplication is ignored")]
public void MultiplyTwoNumbers2()
{
int product = a * b;
Assert.AreEqual(3, product);
}

//TestFixtureSetUp/TestFixtureTearDown 属性
//正如他们名字表明的一样,这些属性用来标记为整个test fixture初始化/释放资源方法一次的方法.
//为所有test fixture的测试共享相同的数据库连接对象,我们可以写一个打开数据库连接的方法,标记为TestFixtureSetUp属性
//编写另外一个关闭数据库连接的方法,标记为TestFixtureTearDown属性

//Category 属性
//对于测试来说,你有的时候需要将之分类,此属性正好就是用来解决这个问题的。
//你可以选择你需要运行的测试类目录,也可以选择除了这些目录之外的测试都可以运行。
//在命令行环境里 /include 和/exclude来实现。在GUI环境下,就更简单了,选择左边工作域里的Catagories Tab,选择Add和Remove既可以了。

//Explicit属性
//本属性忽略一个test和test fixture,直到它们显式的选择执行。如果test和test fixture在执行的过程中被发现,就忽略他们。
//所以,这样一来进度条显示为黄色,因为有test或test fixture忽略了。
//原因是Ingore属性忽略了某个test或test fixture,那么他们你再想调用执行是不可能的。那么万一有一天我想调用被忽略的test或test fixture怎么办,就用Explicit属性了。我想这就是其中的原因吧。
[Test, Explicit]
[Category("Exception")]
[ExpectedException(typeof(DivideByZeroException))]
public void DivideByZero2()
{
int zero = 0;
int infinity = a / zero;
Assert.Fail("Should have gotten an exception");
}

//Expected Exception属性
//期望在运行时抛出一个期望的异常,如果是,则测试通过,否则不通过。
//在本测试中,应该抛出DivideByZeroException,但是期望的是InvalidOperationException,所以不能通过。
//如果我们将[ExpectedException(typeof(InvalidOperationException))]改为[ExpectedException(typeof(DivideByZeroException))],本测试通过。
[Test]
[Category("Exception")]
[ExpectedException(typeof(DivideByZeroException))]
public void ExpectAnException()
{
int zero = 0;
int infinity = a / zero;
Assert.Fail("Should have gotten an exception");
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: