跑跑单元测试(NUnit)

本文介绍了如何使用NUnit进行单元测试的实际案例,包括自定义约束条件以检查工作日及处理异常的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于单元测试,网上很多讲得详细文章,那些基本的操作作为程序员应该可以很轻松的掌握,一些基本用法,比如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}


 

转载于:https://www.cnblogs.com/shenba/archive/2007/08/26/870337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值