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