热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在.NET开发中的单元测试工具之(2)——xUnit.Net

在上一篇《在.NET开发中的单元测试工具之(1)——NUnit》中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xU

 

在上一篇《在.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

在所有测试方法执行之前用于初始化的方法

[TestFixtureTearDown]

[ClassCleanup]

IUseFixture

在所有测试方法执行之后用于结束的方法

[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)

下面的表格也是一个关于NUnitMSTest及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&#xff0c;所以这里有必要介绍一下它的项目文件.xunit的组成元素。.xunit实际上也是一个xml文件&#xff0c;它的根节点是&#xff0c;子节点&#xff0c;下可以有多个节点。节点包含以下属性&#xff1a;

filename&#xff1a;这是必须属性&#xff0c;用于指定包含在项目中的绝对或者相对路径的文件。

config-filename&#xff1a;这个是非必须属性&#xff0c;用于指定测试时所使用的config文件&#xff0c;默认是none&#xff0c;表示不适用任何配置文件。

shadow-copy&#xff1a;运行测试时是否对dll进行shadow-copy&#xff0c;默认是true&#xff0c;这个咱还不清楚true/false对程序的影响。

下面就是一个例子&#xff0c;在例子中执行指明了测试中使用的config文件&#xff1a;

 




 

xUnit.Net的使用

xUnit.Net的常见用法很简单&#xff0c;对于属性NUnit的筒子们来说&#xff0c;轻松掌握xUnit.net的常见用法不在话下&#xff0c;下面就是一个简单例子&#xff08;实现添加了config文件并做了相应配置&#xff0c;详情见本系列之一&#xff09;&#xff1a;

 

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(5, 2 &#43; 3);}[Fact(Timeout&#61;900)]//指定超时为900mspublic void TestTimeout(){System.Threading.Thread.Sleep(1000);Assert.InRange(new Random().NextDouble()*10,5,10);}[Fact]public void Test0_51CTOBlog(){//不区分大小写等值判断Assert.Equal(true,string.Equals(ConfigurationManager.AppSettings["51ctoBlog"], "http://zhoufoxcn.blog.51cto.com",StringComparison.InvariantCultureIgnoreCase);}[Fact]public void Test0_CSDNBlog(){Assert.Equal(ConfigurationManager.AppSettings["CSDNBlog"], "http://blog.csdn.net/zhoufoxcn");}[Fact]public void Test0_SinaWeiBo(){Assert.Equal(ConfigurationManager.AppSettings["SinaWeiBo"], "http://weibo.com/zhoufoxcn");}public void Dispose(){//在这里可以做测试结束后的收尾工作System.Console.WriteLine("Dispose");}}
}

 

 

程序运行效果如下&#xff1a;

 

总结

作为NUnit的改进版&#xff0c;xUnit.Net确实克服了NUnit的不少缺点&#xff08;关于NUnit的缺点和不足之处请见上一篇《在.NET开发中的单元测试工具之(1)——NUnit》&#xff09;&#xff0c;和NUnitAssert API相比&#xff0c;xUnit.NetAssert更精简但是又足以满足单元测试的需要&#xff0c;相比之下NUnitAssert API略显臃肿&#xff08;这可能是跟它是从.Net1.1一直支持过来并且要保持向下兼容有关&#xff09;&#xff0c;但在GUI的易用性方面xUnit.Net不如NUnit&#xff0c;NUnitGUI提供了很多配置界面&#xff0c;使配置工作可以通过界面设置完成&#xff0c;但相同的工作在xUnit.Net中则需要在项目文件中通过配置节点实现&#xff08;比如指定config文件&#xff09;。

此外&#xff0c;NUnitxUnit.Net都在一定程度上支持VS&#xff0c;比如可以使用xUnit.Net同一目录下的xunit.installer.exe来配置对VS的支持&#xff0c;下图是运行xunit.installer.exe时的界面&#xff1a;

 

周金桥

2013-04-06

 

 

 



推荐阅读
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 折腾个半死,数据库初始化设置不当报错 ORA01078: failure in proces...
    2019独角兽企业重金招聘Python工程师标准[oraclelocalhost~]$sqlplusassysdba提示Connectedtoanidleinstance.连 ... [详细]
author-avatar
小庄2502921871
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有