Nunit单元测试演练

发表于:2018-7-16 17:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:小城故事    来源:博客园

  学以致用,单元测试的工具越来越多,可是想找一篇如何单元测试的文章却很难。所以偶来写一点自己的心得,也是一步步摸索着。
  先从测试一个方法开始,偶随便找了一个小算法。这个方法看来正合适:不能太简单,比如一加一等于二;也不能太复杂,比如牵涉到数据库操作。
  这个算法的功能是取得小于Max的N个随机不重复正整数,代码如下:
  public static List<Int32> GetRandomNum(int Max, int N)
  {
  List<int> Source = new List<int>();
  List<int> Result = new List<int>();
  for (int i = 0; i < Max; i++) Source.Add(i + 1);
  for (int n = 0; n < N; n++)
  {
  int r = new Random().Next(0, Source.Count);
  Result.Add(Source[r]); Source.RemoveAt(r);
  }
  Result.Sort();
  return Result;
  }

  算法很好理解。好久前写的,现在翻出来,一眼就看出有问题。不过有点问题正好,看看单元测试能否找出来。
  先添一个项目,引用NUnit.Framework,装好NUnit后在Net组件里有,免安装版的在解压后的目录里找。
  新建一个Public类用于测试,叫Test,生成随机数的方法的类叫Program。现在无所谓,正式项目里命名得规范一点。Test类加[TestFixture]特性,添加一个Public函数叫做TestGetRandomNum,加上[Test]特性,这样NUnit就能认出这个方法是用于测试的方法了。还给该函数加了一个[Category("GetRandomNum")],因为一个功能可能要写几个函数来测试,这个特性表明方法属于测试GetRandom的方法组。
  还有几个常用的特性: [TestFixtureUp] [TestFixtureDown] [TearDown] [Setup] [Ignore] [Explicit],据说以后了解这几个就差不多了。
  接着,第一个测试方法该测试什么呢?以偶写代码的一点经验,每个函数都会把参数验证放在前面,参数无效就不往下走了,抛异常什么的该干嘛干嘛,那测试也先从参数测起吧。 现在分析一下参数异常下的输出:若N<1,不管Max值多少都返回空的List;若N>=1,且Max<N,由于Source集合数量不够,应该会引发IndexOutOfRangeException。
  写一个测试方法用于测试这两种异常输出,应该写两个测试方法好一点。不过刚入手,一个两个就不必分了,写出来就好。代码如下:
  1       public void TestGetRandomNum3()
  2        {
  3            int result1 = 0, result2 = 0, result3 = 0;
  4            //N<1的case
  5            int[,] case1 = { { 0, 0 }, { 9999, 0 }, { -888, 0 }, { 1111, -888 }, { 0, -1 }, { -100, -99 } };
  6            for (int i = 0; i < 6; i++)
  7            {
  8                int Max = case1[i, 0];
  9                int N = case1[i, 1];
  10                List<int> list = Program.GetRandomNum(Max, N);
  11                if( list.Count==0) result1 ++;
  12            }
  13            //N>=1,Max<N
  14            int[,] case2 = { { 0, 5 }, { 0, 1 }, { -10, 1 }, { -10, 30 }, { 10, 20 } };
  15            for (int j = 0; j < 5; j++)
  16            {
  17                int Max = case2[j, 0];
  18                int N = case2[j, 1];
  19                try
  20                {
  21                    List<int> list = Program.GetRandomNum(Max, N);
  22                }
  23                catch (IndexOutOfRangeException ex)
  24                {
  25                    result2++;
  26                }
  27            }
  28            //M=N>=1
  29            int[,] case3 = { { 1, 1 }, { 10, 10 } };
  30            for (int k = 0; k < 2; k++)
  31            {
  32                int Max = case3[k, 0];
  33                int N = case3[k, 1];
  34                List<int> list = Program.GetRandomNum(Max, N);
  35                bool isMatch = true;
  36                for (int n = 0; n < list.Count; n++)
  37                {
  38                    if (n != list[n]) { isMatch = false; break; }
  39                }
  40                if (isMatch && list.Count == N) result3++;
  41            }
  42
  43            Assert.AreEqual(result1, 6);
  44            Assert.AreEqual(result2, 5);
  45            Assert.AreEqual(result3, 2);
  46        }

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号