关于单元测试,网上很多讲得详细文章,那些基本的操作作为程序员应该可以很轻松的掌握,一些基本用法,比如Test,TestFixture,Ignore,SetUp,Assert等用法大伙都是用得烂熟的,简单的几步操作可以就让原有程序上实现单元测试的扩展.其实做的更多的是复制原来的项目程序,重构一个专门用于测试的项目.至于单元测试的好处,也不多说了.以下是两个实际例子,相互学习一下.......
1.
用过NUnit的都知道,NUnit.Framework命名空间下有个IConstraint接口,这个接口主要用在Assert.That()等方法中,比如Assert.That("", Is.Empty); 其中Is.Empty的Empty就是继承了IConstraint接口,NUnit提供的确实够丰富了,不过既然给了个接口,就留给用户一个扩展的余地,可以实现一些相对复杂的逻辑,比如实际开发中可能需要判断提交日期是不是工作日,以下例子就是自定义一个Constrait来实现对是否工作日的判断

继承IConstraint的类
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
5
using NUnit.Framework;
6
using NUnit.Framework.Constraints;
7
using NUnit.Framework.SyntaxHelpers;
8
9
namespace Base
10

{
11
public class IsWorkDay : IConstraint
12
{
13
/**//// <summary>
14
/// 存放传入的值
15
/// </summary>
16
private DayOfWeek week;
17
private bool wrongType = false;
18
IConstraint 成员#region IConstraint 成员
19
/**//// <summary>
20
/// 用于判断
21
/// </summary>
22
/// <param name="actual"></param>
23
/// <returns></returns>
24
public bool Matches(object actual)
25
{
26
if (actual.GetType() != typeof(DateTime))
27
{
28
wrongType = true;
29
return false;
30
}
31
32
week = ((DateTime)actual).DayOfWeek;
33
bool isWorkDay = (week != DayOfWeek.Saturday) && (week != DayOfWeek.Sunday);
34
return isWorkDay;
35
}
36
37
public void WriteActualValueTo(MessageWriter writer)
38
{
39
writer.Write(week.ToString());
40
}
41
42
public void WriteDescriptionTo(MessageWriter writer)
43
{
44
writer.Write("Check work day");
45
}
46
47
/**//// <summary>
48
/// 发生错误的时候,输出预期信息,和实际值信息
49
/// </summary>
50
/// <param name="writer"></param>
51
public void WriteMessageTo(MessageWriter writer)
52
{
53
if (wrongType)
54
{
55
writer.Write(string.Format("the expected type is DateTime"));
56
}
57
else
58
{
59
writer.Write(string.Format("expect day is a work day, but actual date is {0}", week.ToString()));
60
}
61
}
62
63
#endregion
64
}
65
}
66

调用
1
namespace Base
2

{
3
public class CusConstraint
4
{
5
private static IsWorkDay _isWorkDay;
6
public static IsWorkDay IsWorkDay
7
{
8
get
9
{
10
if (_isWorkDay == null)
11
{
12
_isWorkDay = new IsWorkDay();
13
}
14
return _isWorkDay;
15
}
16
}
17
}
18
19
[TestFixture]
20
public class Class1
21
{
22
[Test]
23
public void TestMethod()
24
{
25
NUnit.Framework.AssertionHelper.Expect(DateTime.Now, CusConstraint.IsWorkDay);
26
}
27
}
28
}
例2 指定异常的处理方法
有个Attribute叫ExpectedException,通常情况下会指定一个异常类型,不指定异常类型时对任意异常都有效,但是这个ExpectedException有个不好就是,如果出现了异常不能用try/catch去捕获,否则就与愿意相违背,如果用了try/catch那么就会出现red bar,即异常没有抛出,但是我们实际开发的时候还需要记录异常信息,针对这点,NUnit提供了个简单的方法,那就是指定一个异常处理方法,具体如下,其中Hander的值就是异常处理方法的名称

处理异常
1
namespace Base
2

{
3
[TestFixture]
4
public class HandleException
5
{
6
[Test]
7
[ExpectedException(Handler = "DealException")]
8
public void RaisExceptions()
9
{
10
// 以下将抛出算术溢出异常
11
checked
12
{
13
int a = 200;
14
byte b = (byte)(a + 200);
15
}
16
// 如果添加了try catch 将不会抛出异常 单元测试不通过
17
}
18
19
public void DealException(System.Exception e)
20
{
21
Console.WriteLine(e.Message);
22
}
23
}
24
}