单元测试之NUnit二

NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档。初次写博客,望大家指点。

导航:
单元测试之NUnit一
单元测试之NUnit二
单元测试之NUnit三

本文介绍常用的NUnit属性特性和断言。

常用属性

更多属性参考官方文档

1. Test Attribute

标记一个方法为测试方法。

        /// <summary>
        /// 简单标记方法为测试方法
        /// </summary>
        [Test]
        public void Add()
        {
            Assert.AreEqual(4, 2 + 2);
        }

         /// <summary>
        /// 添加说明内容,等同于DescriptionAttribute属性
        /// </summary>
        //[Test(Description = "这是说明内容")]
        [Test,Description("这是说明属性")]
        public void Add()
        {
            Assert.AreEqual(4, 2 + 2);
        }

        // 标记异步方法
        [Test]
        public async Task AddAsync()
        {
            /* ... */
        }

        // 如果测试方法有返回值,要使用ExpectedResult校验
        [Test(ExpectedResult = 4)]
        public int TestAdd()
        {
            return 2 + 2;
        }

        // 异步含返回值的测试方法
        [Test(ExpectedResult = 4)]
        public async Task<int> TestAddAsync()
        {
            //await do something;
            return 2 + 2;
        }
2. TestFixture Attribute

标记一个类为测试类。从2.5版本开始,对于非参数化、非泛型化测试类是可选的。只要类包含Test、TestCase、TestCaseSource属性标记的方法,都会被视为一个测试类。

TestFixture大多数用来构造参数,被标记的类必须有个对应的构造函数。

简单例子:

/// <summary>
    /// 使用TestFixture标记会生成三个测试,是每个测试方法执行三次
    /// </summary>
    [TestFixture("hello", "hello", "goodbye")]
    [TestFixture("zip", "zip")]
    [TestFixture(42, 42, 99)]
    public class TestFixtureAttributeTest
    {
        private string eq1;
        private string eq2;
        private string neq;

        public TestFixtureAttributeTest(string eq1, string eq2, string neq)
        {
            this.eq1 = eq1;
            this.eq2 = eq2;
            this.neq = neq;
        }

        public TestFixtureAttributeTest(string eq1, string eq2)
            : this(eq1, eq2, null) { }

        public TestFixtureAttributeTest(int eq1, int eq2, int neq)
        {
            this.eq1 = eq1.ToString();
            this.eq2 = eq2.ToString();
            this.neq = neq.ToString();
        }

        [Test]
        public void TestEquality()
        {
            Assert.AreEqual(eq1, eq2);
            if (eq1 != null && eq2 != null)
                Assert.AreEqual(eq1.GetHashCode(), eq2.GetHashCode());
        }

        [Test]
        public void TestInequality()
        {
            Assert.AreNotEqual(eq1, neq);
            if (eq1 != null && neq != null)
                Assert.AreNotEqual(eq1.GetHashCode(), neq.GetHashCode());
        }

还可以标记类型:

    /// <summary>
    /// 标记TList会以两种类型来执行。
    /// </summary>
    /// <typeparam name="TList"></typeparam>
    [TestFixture(typeof(ArrayList))]
    [TestFixture(typeof(List<int>))]
    public class IList_Tests<TList> where TList : IList, new()
    {
        private IList list;

        [SetUp]
        public void CreateList()
        {
            this.list = new TList();
        }

        [Test]
        public void CanAddToList()
        {
            list.Add(1); list.Add(2); list.Add(3);
            Assert.AreEqual(3, list.Count);
        }
    }
3. SetUp And TearDown Attribute

标记一个方法在测试前或者测试后执行,以便初始化或者清理一些参数。

 public class SetUpAndTearDownTest
    {
        [SetUp]
        public void SetUp()
        {
            Console.WriteLine("我在测试前执行");
        }
        [Test]
        public void Test()
        {
            Console.WriteLine("我在测试时执行");
            Assert.Pass();
        }

        [TearDown]
        public void TearDown()
        {
            Console.WriteLine("我在测试后执行");
        }
    }

执行Test测试方法,依次输出:
我在测试前执行
我在测试时执行
我在测试后执行

4. TestCase Attribute

TestCase有两个作用:
标记为测试方法;
为方法提供测试参数。

public class TestCaseTest
    {
        [TestCase(12, 3, 4)]
        [TestCase(12, 2, 6)]
        [TestCase(12, 4, 3)]
        public void DivideTest(int n, int d, int q)
        {
            Assert.AreEqual(q, n / d);
        }

        /// <summary>
        /// TestCase 可以包含条件属性:Author、Category、Description、ExcludePlatform、ExpectedResult、Explicit、Ignore、IgnoreReason、IncludePlatform、Reason、TestName、TestOf
        /// </summary>
        /// <param name="n"></param>
        /// <param name="d"></param>
        /// <returns></returns>
        [TestCase(12, 3, ExpectedResult = 4)]
        [TestCase(12, 2, ExpectedResult = 6)]
        [TestCase(12, 4, ExpectedResult = 3)]
        public int DivideTest(int n, int d)
        {
            return n / d;
        }
    }

常用断言

更多参考官方文档 的Pages页。

1. Assert.AreEqual
        [Test]
        public void AreEqual_Test()
        {
            Assert.AreEqual(5, 5.0);//Successed.double 和 int 会内部转化比较。
            //Assert.AreEqual(5.0, "5.0");//Failed.double和string类型不能相互比较。
            List<Dictionary<int, string>> dic1 = new List<Dictionary<int, string>>
            {
                new Dictionary<int, string>(){ { 1,"one"},{2,"two" } }
            };
            List<Dictionary<int, string>> dic2 = new List<Dictionary<int, string>>
            {
                new Dictionary<int, string>(){{1,"one"}, { 2, "two" } }
            };
            Assert.AreEqual(dic1, dic2);//Successed.泛型也可以比价,会比较内部的值,且只能一一对应。
            List<int> list = new List<int> { 1, 3, 2 };
            List<double> list2 = new List<double> { 1.0, 2.0, 3.0 };
            Assert.AreEqual(list, list2);//Failed.
        }
2. Assert.AreSame
        [Test]
        public void AreSame_Test()
        {
            BankAccount A = new BankAccount(1000);
            BankAccount B = A;
            Assert.AreSame(A, B);// Successed 引用类型对象
            double a = 5;
            double b = 5;
            Assert.AreSame(a, b);//Failed 值类型两个值相同对象不相同。
        }
2. Assert.True

判断条件是否为真。

 bool result = true;
 Assert.IsTrue(result);

组合条件判断 Assert.That + Constraint

以前老版本有 Assert.IsNullOrEmpty("");这样的断言,新版本之后就没有了。那如果要满足这种判断怎么处理呢?
NUnit提供了一系列条件组合,配合 Assert.That 的使用可以灵活多变。
Constraint的使用参考文档

1. 取代 Assert.IsNullOrEmpty
Assert.That("1", Is.Null.Or.Empty);

本文就举一两例子介绍NUnit的使用,关于Attribute、Assert和Condition的使用得多参考官方文档学习(文中已经贴了链接)。

原文地址:https://www.cnblogs.com/jimizhou/p/11412301.html

时间: 2024-10-09 19:39:15

单元测试之NUnit二的相关文章

单元测试之NUnit三

NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 除了Assert断言外,NUnit还提供了其它直接断言的方法,比如string.directory.file等.另外,如有需要还可自行扩展. String Assert 实现了string 类型的断言,包含以下方法: public class StringAssertTest { [Test] public void C

单元测试之NUnit一

NUnit 分三篇文章介绍,入门者可阅读文章,有基础者直接参考官方文档.初次写博客,望大家指点. 导航: 单元测试之NUnit一 单元测试之NUnit二 单元测试之NUnit三 NUnit是什么? NUnit .net 语言单元测试框架.最初是从JUnit移植过来的,目前已经发布3.0版本.新版本重写了许多新特性,并且支持许多 .net 平台.有关NUnit的介绍详见官网. 选择产品 NUnit提供两种运行方式执行测试代码.控制台运行启动快,但不利于交互.图形运行是一个WinForm程序,灵活控

谈谈单元测试之(二):测试工具 JUnit 3

前言 上一篇文章<为什么要进行烦人的单元测试?>讨论了一下现阶段软件开发中,程序员们测试情况的现状.这篇文章中,我打算介绍一下单元测试的工具(插件),并且推荐大家以后在开发中,真正的用上单元测试,用好单元测试. 说明 这篇文章的主题,主要是介绍一下 JUnit 3,虽然 JUnit 3 已经不推荐使用了,但它也曾是风靡一时.这里旨在讨论一下 JUnit 3 的使用,以及它的内部构造,就当是为下一篇文章介绍 JUnit 4 做铺垫吧.之前已经把单元测试的重要性都讲出来了,这里就不再赘述了,直接进

单元测试之道(使用NUnit)

首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上的按钮,顿时你刚刚的轻松感烟消云散:系统无法正常工作,你想读的数据显示不出来,你想存的东西也送不到数据库……于是,你再次回 到IDE里,设断点.调试.一层一层跟踪,当你精疲力尽终于将数据送到数据库里,你又发现了其它问题,于是你继续设断点.调试.编译.调试…… 2.你狂躁地敲击着键盘和鼠标,咒骂着不断

Visual Studio 单元测试之二---顺序单元测试

原文:Visual Studio 单元测试之二---顺序单元测试 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试不熟悉的话,请先参看上一篇.http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx 本文会自动略去上篇中提到过的相关概念.方法.本文的例子可以使用下面的链接下载: http://download.csdn.net/source/30

我的单元测试之总结

单元测试 版权声明:本文为博主原创文章,未经博主允许不得转载. 以下关于单元测试的总结,是基于目前工作的内容进行的汇总,包括了单元测试的定义,单元测试assertion语句,单元测试的框架以及实践中的注意事项等.其中[***]为解释说明.在此推荐几本有关单元测试的书籍供参考.<单元测试的艺术><单元测试之道junit(Java版)><单元测试之道Nunit(C#版)>. Overview 一个UT当中,包括了准备数据,释放资源,执行要验证的那段逻辑代码,以及结果的验证等

.NET 单元测试的艺术&amp;单元测试之道C#版

目录 1.单元测试概念 2.单元测试的原则 3.单元测试简单示例 4.单元测试框架特性标签 5.单元测试中的断言Assert 6.单元测试中验证预期的异常 7.单元测试中针对状态的间接测试 8.单元测试在MVC模式中的实现 8.单元测试相关参考 9.示例源代码下载 志铭-2020年1月23日 11:49:41 1.单元测试概念 什么是单元测试? 单元测试(unit testing)是一段自动化的代码,用来调用被测试的方法或类,而后验证基于该方法或类的逻辑行为的一些假设. 简而言之说:单元测试是一

单元测试之Stub和Mock

单元测试之Stub和Mock FROM:http://www.cnblogs.com/TankXiao/archive/2012/03/06/2366073.html 在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,记录Log, 文件系统 之类的). 而我们没法控制这些外部依赖的对象.  为了解决这个问题,我们需要用到Stub和Mock来模拟这些外部依赖的对象,从而控制它们 阅读目录 实例 设计测试用例 什么是外部依赖 Stub和Mock的相同

补习系列-springboot 单元测试之道

目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 springboot 实现接口的测试 了解如何 利用 mokito 做代码的 mock 一.About 单元测试 单元测试其实是一种廉价的技术,是由开发者创建运行测试代码,用于对程序模块(软件设计的最小单位)进行正确性检验的一种做法. 而所谓的最小单元,就是指应用的最小可测试部件. 在面向对象领域,最小单