在.NET开发中的单元测试工具之(2)——xUnit.Net
在上一篇《在.NET开发中的单元测试工具之(1)——NUnit》中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xUnit.Net来进行单元测试。
xUnit.Net介绍
xUnit.net的创造者的创造者是Jim Newkirk和Brad Wilson从包括NUnit及其它单元测试框架的使用经验中总结出来的一个新框架,相比于NUnit,xUnit.net有如下特点:
为每个测试方法产生一个对象实例
取消了[SetUp]和[TearDown]
取消了[ExpectedException]
类似于Aspect的功能
减少了自定义属性(Attribute)的数目
采用泛型
匿名委托
可扩展的断言
可扩展的测试方法
可扩展的测试类
xUnit.net的官方网站是:http://xunit.codeplex.com,下面是xUnit.net的运行界面:

注意在下载的xUnit.net压缩包内有4个支持GUI方式运行的exe文件,分别是:
xunit.gui.clr4.exe:用于在x64及.Net4.0下运行xUnit.net。
xunit.gui.clr4.x86.exe:用于在x86及.Net4.0下运行xUnit.net。
Xunit.gui.exe:用于在x64及.Net4.0以下版本运行xUnit.net。
xunit.gui.x86.exe:用于在x86及.Net4.0以下版本运行xUnit.net。
xUnit.Net下载与安装
xUnit.Net的常用Attribute标记
如果以前使用过NUnit或者VS自带的MSTest测试工具,下面的对比表格会让你很容易上手xUnit.net:
|
NUnit 2.2 |
MSTest |
xUnit.net |
备注 |
|
[Test] |
[TestMethod] |
[Fact] |
标记为测试方法 |
|
[TestFixture] |
[TestClass] |
n/a |
包含有测试方法的类,在xUnit.net中无需标记,它会查找程序集中所有的public的测试方法 |
|
[ExpectedException] |
[ExpectedException] |
Assert.Throws/ Record.Exception |
期望抛出异常 |
|
[SetUp] |
[TestInitialize] |
Constructor(即构造函数) |
在每个测试方法执行之前用于初始化的方法 |
|
[TearDown] |
[TestCleanup] |
IDisposable.Dispose |
在每个测试方法执行之后用于结束的方法 |
|
[TestFixtureSetUp] |
[ClassInitialize] |
IUseFixture<T> |
在所有测试方法执行之前用于初始化的方法 |
|
[TestFixtureTearDown] |
[ClassCleanup] |
IUseFixture<T> |
在所有测试方法执行之后用于结束的方法 |
|
[Ignore] |
[Ignore] |
[Fact(Skip="reason")] |
临时忽略被标记的方法 |
|
n/a |
[Timeout] |
[Fact(Timeout=n)] |
用于指定被测试方法的最大执行时间(单位毫秒),如果超过指定时间则会被标记为测试失败 |
|
[Property] |
[TestProperty] |
[Trait] |
Set arbitrary metadata on a test |
|
n/a |
[DataSource] |
[Theory], [XxxData] |
xUnit.Net的断言(Assertions)
下面的表格也是一个关于NUnit、MSTest及xUnit.Net断言的对比。
|
NUnit 2.2 |
MSTest |
xUnit.net |
备注 |
|
AreEqual |
AreEqual |
Equal |
相等比较 |
|
AreNotEqual |
AreNotEqual |
NotEqual |
不相等比较 |
|
AreNotSame |
AreNotSame |
NotSame |
不相同比较 |
|
AreSame |
AreSame |
Same |
相同比较 |
|
Contains |
Contains (on CollectionAssert) |
Contains |
|
|
DoAssert |
n/a |
n/a |
|
|
n/a |
DoesNotContain (on CollectionAssert) |
DoesNotContain |
|
|
n/a |
n/a |
DoesNotThrow |
|
|
Fail |
Fail |
n/a |
可用Assert.True(false, "message")替代 |
|
Greater |
n/a |
n/a |
可用Assert.True(x > y)替代 |
|
Ignore |
Inconclusive |
n/a |
|
|
n/a |
n/a |
InRange |
|
|
IsAssignableFrom |
n/a |
IsAssignableFrom |
|
|
IsEmpty |
n/a |
Empty |
|
|
IsFalse |
IsFalse |
False |
|
|
IsInstanceOfType |
IsInstanceOfType |
IsType |
|
|
IsNaN |
n/a |
n/a |
可用Assert.True(double.IsNaN(x))替代 |
|
IsNotAssignableFrom |
n/a |
n/a |
可用Assert.False(obj is Type)替代 |
|
IsNotEmpty |
n/a |
NotEmpty |
|
|
IsNotInstanceOfType |
IsNotInstanceOfType |
IsNotType |
|
|
IsNotNull |
IsNotNull |
NotNull |
|
|
IsNull |
IsNull |
Null |
|
|
IsTrue |
IsTrue |
True |
|
|
Less |
n/a |
n/a |
可用Assert.True(x < y)替代 |
|
n/a |
n/a |
NotInRange |
确保数据在某个范围内 |
|
n/a |
n/a |
Throws |
确保会抛出异常 |
xUnit.Net的项目文件结构
因为在可视化方面xUnit.Net不如NUnit,所以这里有必要介绍一下它的项目文件.xunit的组成元素。.xunit实际上也是一个xml文件,它的根节点是<xunit>,<xunit>有<assemblies>子节点,<assemblies>下可以有多个<assembly>节点。<assembly>节点包含以下属性:
filename:这是必须属性,用于指定包含在项目中的绝对或者相对路径的文件。
config-filename:这个是非必须属性,用于指定测试时所使用的config文件,默认是none,表示不适用任何配置文件。
shadow-copy:运行测试时是否对dll进行shadow-copy,默认是true,这个咱还不清楚true/false对程序的影响。
下面就是一个例子,在例子中执行指明了测试中使用的config文件:
- <?xml version="1.0" encoding="utf-8"?>
- <xunit>
- <assemblies>
- <assembly filename="bin\Debug\XunitDemo.exe" config-filename="bin\Debug\XunitDemo.exe.config" shadow-copy="true"/>
- <assembly filename="bin\Debug\xunit.dll" shadow-copy="true" />
- </assemblies>
- </xunit>
xUnit.Net的使用
xUnit.Net的常见用法很简单,对于属性NUnit的筒子们来说,轻松掌握xUnit.net的常见用法不在话下,下面就是一个简单例子(实现添加了config文件并做了相应配置,详情见本系列之一):
- using System;
- using Xunit;
- using System.Configuration;
- namespace XunitDemo
- {
- public class XunitDemo:IDisposable
- {
- public XunitDemo()
- {
- //在这里可以做测试开始前的初始化工作
- System.Console.WriteLine("Init");
- }
- [Fact]
- public void TestAdd()
- {
- Assert.Equal<int>(5, 2 + 3);
- }
- [Fact(Timeout=900)]//指定超时为900ms
- public void TestTimeout()
- {
- System.Threading.Thread.Sleep(1000);
- Assert.InRange<double>(new Random().NextDouble()*10,5,10);
- }
- [Fact]
- public void Test0_51CTOBlog()
- {
- //不区分大小写等值判断
- Assert.Equal<bool>(true,string.Equals(ConfigurationManager.AppSettings["51ctoBlog"], "http://zhoufoxcn.blog.51cto.com",StringComparison.InvariantCultureIgnoreCase);
- }
- [Fact]
- public void Test0_CSDNBlog()
- {
- Assert.Equal<string>(ConfigurationManager.AppSettings["CSDNBlog"], "http://blog.csdn.net/zhoufoxcn");
- }
- [Fact]
- public void Test0_SinaWeiBo()
- {
- Assert.Equal<string>(ConfigurationManager.AppSettings["SinaWeiBo"], "http://weibo.com/zhoufoxcn");
- }
- public void Dispose()
- {
- //在这里可以做测试结束后的收尾工作
- System.Console.WriteLine("Dispose");
- }
- }
- }
程序运行效果如下:

总结
作为NUnit的改进版,xUnit.Net确实克服了NUnit的不少缺点(关于NUnit的缺点和不足之处请见上一篇《在.NET开发中的单元测试工具之(1)——NUnit》),和NUnit的Assert API相比,xUnit.Net的Assert更精简但是又足以满足单元测试的需要,相比之下NUnit的Assert API略显臃肿(这可能是跟它是从.Net1.1一直支持过来并且要保持向下兼容有关),但在GUI的易用性方面xUnit.Net不如NUnit,NUnit的GUI提供了很多配置界面,使配置工作可以通过界面设置完成,但相同的工作在xUnit.Net中则需要在项目文件中通过配置节点实现(比如指定config文件)。
此外,NUnit和xUnit.Net都在一定程度上支持VS,比如可以使用xUnit.Net同一目录下的xunit.installer.exe来配置对VS的支持,下图是运行xunit.installer.exe时的界面:

周金桥
2013-04-06
在.NET开发中的单元测试工具之(2)——xUnit.Net的更多相关文章
- 在.NET开发中的单元测试工具之(1)——NUnit
NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...
- 在.NET开发中的单元测试工具之——NUnit
NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...
- iOS开发中的单元测试(三)——URLManager中的测试用例解析
本文转载至 http://www.cocoachina.com/cms/plus/view.php?aid=8088 此前,我们在<iOS开发中的单元测试(一)&(二)>中介绍 ...
- 【Unity游戏开发】浅谈Unity游戏开发中的单元测试
一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...
- Android开发中的logcat工具使用
http://os.51cto.com/art/200905/126051.htm 用adb直接查看log: adb logcat 清除之前的log: adb logcat -c 加过滤查看lo ...
- Java开发中模拟接口工具moco的使用
场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...
- Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector
那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...
- java开发中的一些工具软件
1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...
- Cocos开发中性能优化工具介绍之使用Windows任务管理器
说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...
随机推荐
- SVD/SVD++实现推荐算法
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域. ...
- idea中war和war exploded的区别及修改jsp必须重新启动tomcat才能生效的问题
刚开始使用idea,发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能有这么不方便的功能存在. 需要在Tomca ...
- Promise学习笔记
Promise对象 Promise 表示一个异步操作的最终结果,与之进行交互的方式主要是 then 方法,该方法注册了两个回调函数,用于接收 promise 的终值或本 promise 不能执行的原因 ...
- SQL Data Discovery and Classification
The new version of SQL Server Management Studio (v17.5) brings with it a new feature: SQL Data Disco ...
- Codechef April Challenge 2019 Division 2
Maximum Remaining 题意:给n个数,取出两个数$a_{i}$,$a_{j}$,求$a_{i}\% a_{j}$取模的最大值 直接排个序,第二大(严格的第二大)模第一大就是答案了. #i ...
- Flask的插件session、SQLAlchemy、Script、Migrate
一.flask-session 1.为什么要使用flask-session 因为flask默认的session是通过请求上下文放入到Local中的,是存在内存的,而使用flask-session可以更 ...
- 解决Docker中运行的MySQL中文乱码
docker exec -it mysql bash 如果没有安装vim,请参考 解决Docker容器中不能用vim编辑文件 vim /etc/mysql/mysql.conf.d/mysql.cnf ...
- 倍增\ tarjan求lca
对于每个节点v,记录anc[v][k],表示从它向上走2k步后到达的节点(如果越过了根节点,那么anc[v][k]就是根节点). dfs函数对树进行的dfs,先求出anc[v][0],再利用anc[v ...
- opencv 图片旋转
import cv2 as cv import numpy as np # 图片旋转 img = cv.imread('../images/face.jpg', flags=1) # flags=1读 ...
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...