Nunit安装

首先说下,nunit2.X与3.X版本需要安装不同的vs扩展。

nunit2.x安装

安装如上3个,辅助创建nunit测试项目与在vs中运行单元测试用例 .

1.Nunit2 Test Adapter  帮助在vs中能够运行调试测试用例。

2.Test Generator Nunit extension 帮助生成用例。

3.Nunit Vs Templates 帮助创建Nunit项目和用例模板。

安装完之后,就可以做基本的测试啦。如果想用如下的Client辅助测试 。

https://github.com/nunit/nunitv2/releases/tag/2.6.4  目前只支持的版本为2.6.4最高,使用客户端的话,不支持Nunit3.X版本。

使用客户端界面调试

添加外部工具

工具->外部工具

nunit3.x安装

3.x与client不兼容。安装如下3个,在vs中运行即可。

Nunit属性

TestFixture

它标记一个类包含测试,申明该类是用来测试的。一般用在class的定义之前;

Test

一般是放在method之前,表示对该方法的测试,中添加Description参数可以给我们测试的功能添加描述信息

TestCase(arguments)

属性标记有参数无返值方法为测试方法(泛型方法一样标记),想要多次测试可用逗号隔开([TestCase(1,2), TestCase(2,3)])

TestCaseAttribute还提供一些列其他属性:

Description:描述测试用例详情

ExpectedException:指定期望抛出的异常

ExpectedExceptionName:指定期望抛出异常的全名

ExpectedMessage:指定期望抛出异常的信息

Explict:设置为true标记测试用例为显示执行,用Reason来诠释缘由

Ignore:设置为true用于指定忽略测试用例,用Reason来诠释缘由

IgnoreReason:指定忽略测试用例及缘由,等同于同时使用Ignore && Reason。注意:本特性会在以后版本中移除

MatchType:MessageMatch枚举类型,指定测试期望信息(详情见ExpectedExceptionAttribute

Reason:指定不执行测试用例的缘由,结合Ignore或Explicit特性使用

Result:指定测试方法期望的返回值,返回值类型必须是可兼容的

TestName:为测试用例指定一个名称,如果不指定会根据测试方法及参数自动生成。

Explicit

属性标记测试方法需要在UI界面显式执行,如果不想对某个方法进行单元测试,只是在它被选中时才进行测试的话,可以调用该特性。

Ignore

属性标记一个测试方法或一个测试类被忽略,如果测试类被忽略,其内中的测试方法也会被忽略。

ExpectedException(Type)

属性标记测试方法在运行时抛出一个期望的异常,如果是则测试通过,否则不通过

Category("")

属性标记用于将测试分类(便于只测试需要的类别),可在方法与类上进行标记,在NUnit-GUI界面的Categories选项卡中对要参与参数的类别进行选择,Run时仅测试该类别的测试。如果均不选,则默认全部测试

TestFixtureSetUp

属性标记方法为类级别设置(初始化)方法,在整个测试类中执行一次初始化,所有的测试方法共享初始化数据,标记此属性的方法可以简单的将其想象为一个初始化器,就行类的构造函数一样

TestFixtureTearDown

属性标记方法为类级别拆卸方法,在整个测试类中执行一次拆卸.当测试类中的所有测试方法执行完成,就会执行拆卸方法,用于清除数据、释放资源,可以将其想象为一个析够函数,在测试完成后对测试过程中使用的资源进行回收

TearDown

属性标记方法为函数级别的拆卸方法,在执行完每个测试方法后,执行该拆卸方法。一个测试类可以仅有一个TearDown/Setup/TestFixtureSetUp/TestFixtureTearDown方法。如果有多个定义,测试类也会编译成功,但是测试时不会运行这些标记过的方法

SetUp

属性标记方法为函数级别的设置方法,在执行每个测试方法前,执行该设置方法

[Maxtime]/[Timeout]

属性标记测试用例的最大执行时间,前者超时时不取消测试,而后者会强行中断,用法如:[Test, Maxtime(2000)],[Test, Timeout(2000)]。

Repeat

属性标记测试方法重复执行多少次,如:[Test, Repeat(5)]。

[RequiresMTA]/[RequiresSTA]/[RequiresThread]

属性标记测试用例必须的在多线程、单线程、独立的线程状态下运行

Values

属性标记测试用例的参数,以参数的形式传入一组值,NUnit会把这组值分解成相应数量的子测试。当测试用例的2个参数都使用[Values]进行标记,NUnit默认生成2组数量乘积的用例,需要使用[Sequential]标记测试用例才能按顺序生成一一对应的n(n=2组中最大数组长度)个子测试用例

ValueSource

属性标记测试用例的参数,指定参数的数据源来自哪里,在使用[ValueSource]指定数据源时,该数据源必须实现了IEnumerable接口,数据源可以是属性、无参方法、实例或静态成员

简单的用例demo

[TestFixture]
    public class TestClass
    {
        [Test(Description = "加法")]
        [Category(")]
        [TestCase(, ), TestCase(, )]
        public void TestAdd(int a, int b)
        {
            Assert.AreEqual(, new MeCommon.Calc().Add(a, b));
        }
        [Test, Explicit]
        [TestCase(, ), TestCase(, ), TestCase(, )]
        [Category(")]
        public void TestDivision(int a, int b)
        {
            Assert.AreEqual(a / b, new MeCommon.Calc().Division(a, b));
        }
        [Ignore("未完成")]
        [TestCase(, )]
        public void TestDivision1(int a, int b)
        {
            Assert.AreEqual(a / b, new MeCommon.Calc().Division(a, b));
        }
        [TestCase()]
        public void TestGetWCFOrder(int orderID)
        {
            var result = new MeCommon.Order().GetWCFOrder(orderID);
            var a = (result.Success && result.IntData == orderID);
            Console.Out.WriteLine(JsonConvert.SerializeObject(result.ObjectData));
            Assert.IsTrue(a, "orderid与查询order一值,返回true");
        }

        [TestCase()]
        public void TestGetDBOrder(int orderID)
        {
            var result = new MeCommon.Order().GetDBOrder(orderID);
            var a = (result.Success && result.IntData == orderID);
            Console.Out.WriteLine(JsonConvert.SerializeObject(result.ObjectData));
            Assert.IsTrue(a, "orderid与查询order一值,返回true");
        }
        [TestCaseSource("AddParam")]
        public void AddMutiParam(int a, int b)
        {
            var result = new MeCommon.Calc().Add(a, b);
            Console.Out.WriteLine(result);
            Assert.Less(, result);
        }
        static object[] AddParam()
        {
            return new object[] {
                ,},
                ,},
                ,},
                ,},
                ,}
            };
        }
        [TestCaseSource("AddParam")]
        [MaxTime()]
        public void AddTimeParam(int a, int b)
        {
            var result = new MeCommon.Calc().Add(a, b);
            Console.Out.WriteLine(result);
            Assert.Less(, result);
        }
    }

Nunit常用类和方法

1、Assert(断言):如果断言失败,方法将没有返回,并且报告一个错误。

1)、测试二个参数是否相等

Assert.AreEqual;

Assert.AreEqual;

2)、测试二个参数是否引用同一个对象

Assert.AreSame;

Assert.AreNotSame;

3)、测试一个对象是否被一个数组或列表所包含

Assert.Contains;

4)、测试一个对象是否大于另一个对象

Assert.Greater;

5)、测试一个对象是否小于另一个对象

Assert.Less;

6)、类型断言:

Assert.IsInstanceOfType;

Assert.IsAssignableFrom;

7)、条件测试:

Assert.IsTrue;

Assert.IsFalse;

Assert.IsNull;

Assert.IsNotNull;

Assert.IsNaN;用来判断指定的值是否为数字。

Assert.IsEmpty;

Assert.IsNotEmpty;

Assert.IsEmpty;

Assert.IsNotEmpty;

8)、其他断言:

Assert.Fail;方法为你提供了创建一个失败测试的能力,这个失败是基于其他方法没有封装的测试。对于开发你自己的特定项目的断言,它也很有用。

Assert.Pass;强行让测试通过

2、字符串断言(StringAssert):提供了许多检验字符串值的有用的方法

StringAssert.Contains;

StringAssert.StartsWith;

StringAssert.EndsWith;

StringAssert.AreEqualIgnoringCase;

3、CollectionAssert类

CollectionAssert.AllItemsAreInstancesOfType;集合中的各项是否是某某类型的实例

CollectionAssert.AllItemsAreNotNull:集合中的各项均不为空

CollectionAssert.AllItemsAreUnique;集合中的各项唯一

CollectionAssert.AreEqual;两个集合相等

CollectionAssert.AreEquivalent;两个集合相当

CollectionAssert.AreNotEqual;两个集合不相等

CollectionAssert.AreNotEquivalent;两个集合不相当

CollectionAssert.Contains;

CollectionAssert.DoesNotContain;集合中不包含某对象

CollectionAssert.IsSubsetOf:一个集合是另外一个集合的子集

CollectionAssert.IsNotSubsetOf:一个集合不是另外一个集合的子集

CollectionAssert.IsEmpty;集合为空

CollectionAssert.IsNotEmpty;集合不为空

CollectionAssert.IsOrdered;集合的各项已经排序

4、FileAssert

FileAssert.AreEqual;

FileAssert.AreNotEqual;

5、DirectoryAssert

DirectoryAssert.AreEqual;

DirectoryAssert.AreNotEqual;

DirectoryAssert.IsEmpty;

DirectoryAssert.IsNotEmpty;

DirectoryAssert.IsWithin;

DirectoryAssert.IsNotWithin;

Nunit文档

中文文档:http://www.36sign.com/nunit/quickStart.html

官网:http://nunit.org/

github :https://github.com/nunit

Xunit介绍

xunit是在nunit2.x版本迁移优化出来的产品,属于后起,单来势汹汹,已经被大多数开发测试所使用。

使用安装扩展插件

示例

 public class UnitTest1 : IDisposable
    {
        private ITestOutputHelper _output;
        public UnitTest1(ITestOutputHelper output)
        {
            _output = output;
            _output.WriteLine("start constructor");
        }
        [Fact]
        public void TestAdd()
        {
            Assert.Equal(, , ));
        }
        [Theory]
        [InlineData(, ), InlineData(, )]
        public void TesInlineAdd(int a, int b)
        {
            Assert.Equal(, new MeCommon.Calc().Add(a, b));
        }

        [Theory(DisplayName = "test.01", Skip = "没写好")]
        [InlineData(, ), InlineData(, )]
        public void TestProAdd(int a, int b)
        {
            Assert.Equal(, new MeCommon.Calc().Add(a, b));
        }
        [Theory(Timeout = )]
        [InlineData(), InlineData()]
        public void TestTimeOut(int time)
        {
            Thread.Sleep(time*);
            Assert.Equal(, , ));
        }

        [Theory]
        [MemberData(nameof(ParamData.AddParams), MemberType = typeof(ParamData))]
        public void TestMemberAdd(int a, int b)
        {
            Assert.Equal(, new MeCommon.Calc().Add(a, b));
        }
        [Theory]
        [MemberData()]
        public void TestMemberStrTypeAdd(int a, int b)
        {
            Assert.Equal(, new MeCommon.Calc().Add(a, b));
        }
        public static IEnumerable<object[]> GetAddParams(int index)
        {
            return ParamData.GetAddParams(index);
        }
        public void Dispose()
        {
            _output.WriteLine("Execute dispose!");
        }
    }
    public class ParamData
    {
        public static IEnumerable<object[]> AddParams => new List<object[]> {
                ,},
                ,},
                ,},
                ,},
                ,} };

        public static IEnumerable<object[]> GetAddParams(int index)
        {
            return new List<object[]> {
                },
                },
                },
                },
                } };
        }
    }

推荐几篇博文:

https://www.cnblogs.com/NorthAlan/tag/xUnit/

比较忙没时间整理,就这吧。有时间拉,再整理。88.

Nunit与Xunit介绍的更多相关文章

  1. 舍弃Nunit拥抱Xunit

    前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...

  2. MSTest、NUnit、xUnit.net 属性和断言对照表

    MSTest.NUnit.xUnit.net 属性对照表 MSTest NUnit xUnit.net Comments [TestMethod] [Test] [Fact] Marks a test ...

  3. Xunit和Nunit的区别

    https://www.cnblogs.com/Leo_wl/p/5727712.html 舍弃Nunit拥抱Xunit   前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试 ...

  4. Nunit工具做C#的单元测试

      Nunit工具做C#的单元测试 学习心得 编写人:罗旭成 时间:2013年9月2日星期一 1.开发人员如何做单元测试 单元测试是针对最小的可测试软件元素(单元)的,它所测试的内容包括单元的内部结构 ...

  5. 单元测试与Nunit的基本使用

    一.单元测试是什么 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,C# ...

  6. [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述

    谈到单元测试,任何一个开发或是测试人员都不会觉得陌生.我想大多数的同学也都是接触过各种单元测试框架.关于单元测试的重要性,应该不会有太多的质疑.这个系列,我向大家介绍一下xUnit.Net的使用.就让 ...

  7. [转载]单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...

  8. 单元测试之道(使用NUnit)

    首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...

  9. 单元测试工具之Xunit

    在.NET开发中的单元测试工具之——xUnit.Net  原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...

随机推荐

  1. MySql中的SHOW INDEX 查出的结果列代表的意义

    MySQL SHOW INDEX语法的实际操作用法以及其实际查看索引状态(语法)的具体内容的描述,如果你对这一技术,心存好奇的话,以下的文章将会揭开它的神秘面纱. INDEX FROM tbl_nam ...

  2. CI工具Jenkins的安装配置【linux】——jenkins集成sonarqube-异常解决

    Setup 官网https://jenkins.io/ 下载war包,扔到tomcat下启动即可. 如果有port限制,在iptables中打开商品限制. 访问http://ip:port/jenki ...

  3. 剑指offer第二版-总结:二叉树的遍历

    思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则 ...

  4. 项目中操作redis改brpop阻塞模式为订阅模式的实现-java实习笔记二

    更改项目需求以及项目之前阻塞模式问题的叙述已经在上一篇说过了,详情可参考:https://www.cnblogs.com/darope/p/10276213.html  ,https://yq.ali ...

  5. Java调用方法参数究竟是传值还是传址?

    之前阅读<Head First Java>的时候,记得里面有提到过,Java在调用方法,传递参数的时候,采用的是pass-by-copy的方法,传递一份内容的拷贝,即传值.举一个最简单的例 ...

  6. TensorFlow高效读取数据的方法——TFRecord的学习

    关于TensorFlow读取数据,官网给出了三种方法: 供给数据(Feeding):在TensorFlow程序运行的每一步,让python代码来供给数据. 从文件读取数据:在TensorFlow图的起 ...

  7. Preface Numbering序言页码

    题面 (preface.pas/c/cpp) 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 V 5 X 10 L 50 C 100 D 500 M ...

  8. C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法

    连载目录    [已更新最新开发文章,点击查看详细] 介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的.但是在编译代码时,查询语法必须转换为针对 .NET ...

  9. 【译】宣告推出.NET Core 3.0 Preview 7(英雄的黎明)

    今天,我们宣布推出.NET Core 3.0 Preview 7.我们已经从创建新特性阶段过渡到了完善版本阶段.对于其余的预览版,我们将把重点放在质量(改进)上. 在Windows,macOS和Lin ...

  10. HPU暑期集训积分赛2

    A. 再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z ...