Nunit与Xunit介绍
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
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介绍的更多相关文章
- 舍弃Nunit拥抱Xunit
前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...
- MSTest、NUnit、xUnit.net 属性和断言对照表
MSTest.NUnit.xUnit.net 属性对照表 MSTest NUnit xUnit.net Comments [TestMethod] [Test] [Fact] Marks a test ...
- Xunit和Nunit的区别
https://www.cnblogs.com/Leo_wl/p/5727712.html 舍弃Nunit拥抱Xunit 前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试 ...
- Nunit工具做C#的单元测试
Nunit工具做C#的单元测试 学习心得 编写人:罗旭成 时间:2013年9月2日星期一 1.开发人员如何做单元测试 单元测试是针对最小的可测试软件元素(单元)的,它所测试的内容包括单元的内部结构 ...
- 单元测试与Nunit的基本使用
一.单元测试是什么 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,C# ...
- [小北De编程手记] : Lesson 01 玩转 xUnit.Net 之 概述
谈到单元测试,任何一个开发或是测试人员都不会觉得陌生.我想大多数的同学也都是接触过各种单元测试框架.关于单元测试的重要性,应该不会有太多的质疑.这个系列,我向大家介绍一下xUnit.Net的使用.就让 ...
- [转载]单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而又忐忑的心情点击界面上的 ...
- 单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...
- 单元测试工具之Xunit
在.NET开发中的单元测试工具之——xUnit.Net 原始出处 http://zhoufoxcn.blog.51cto.com/792419/1172320 在上一篇<在.NET开发中的单元 ...
随机推荐
- 包教包会之Open Live Writer设置代码样式
Open Live Writer(以下简称OLW),作为一个在本地写博文,然后发布到各个博客网站的客户端,在使用上个人觉得还是比较好用的.但是其对IT博文中代码部分的内容样式支持不是很友好.下面是本人 ...
- [译]试用新的System.Text.Json API
译注 可能有的小伙伴已经知道了,在.NET Core 3.0中微软加入了对JSON的内置支持. 一直以来.NET开发者们已经习惯使用Json.NET这个强大的库来处理JSON. 那么.NET为什么要增 ...
- 剑指offer第二版-2.实现单例模式
面试题2:实现单例模式 题目要求: 设计一个类,只能生成该类的一个实例. /** * 单例模式 * 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象 * 应用举例:windows的 ...
- Java 新特性总结——简单实用
lambda表达式 简介 lambda 表达式的语法 变量作用域 函数式接口 内置函数式接口 默认方法 Stream(流) 创建 stream Filter(过滤) Sorted(排序) Map(映射 ...
- k8s学习 - 概念 - ReplicaSet
k8s学习 - 概念 - ReplicaSet 首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别.(官网也是 ...
- 【题解】P1396 营救-C++
原题传送门 这道题目基本就是一个克鲁斯卡尔最小生成树的模板题,唯一不同的是,这道题目的最终目标不是所有点相连,而是只要s和t相连就可以了.还有就是这道题目求的是最小生成树中的最大边权值.但是,克鲁斯卡 ...
- QRowTable表格控件(三)-效率优化之-合理使用QStandardItem
目录 一.开心一刻 二.概述 三.效果展示 四.QStandardItem 1.QStandardItem是什么鬼 2.性能分析 3.QStandardItem使用上的坑 五.相关文章 原文链接:QR ...
- 洛谷P3905 道路重建
题目:https://www.luogu.org/problemnew/show/P3905 分析: 此题是显然的最短路算法,只是看到一起删掉的一堆边感到十分棘手,而且还要求出的是最短添加边的总长度 ...
- 小代学Spring Boot之自定义Starter
想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...
- Word公式显示为{EMBED Equation.DSMT4}
具体问题表现为: 添加了Mathtype公式后显示为{EMBED Equation.DSMT4}, 超链接显示为大花括号和描述文本, 页码显示为 page... 具体解决方法如下,(以Office2 ...