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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <xunit>
  3. <assemblies>
  4. <assembly filename="bin\Debug\XunitDemo.exe" config-filename="bin\Debug\XunitDemo.exe.config" shadow-copy="true"/>
  5. <assembly filename="bin\Debug\xunit.dll" shadow-copy="true" />
  6. </assemblies>
  7. </xunit>

xUnit.Net的使用

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

  1. using System;
  2. using Xunit;
  3. using System.Configuration;
  4. namespace XunitDemo
  5. {
  6. public class XunitDemo:IDisposable
  7. {
  8. public XunitDemo()
  9. {
  10. //在这里可以做测试开始前的初始化工作
  11. System.Console.WriteLine("Init");
  12. }
  13. [Fact]
  14. public void TestAdd()
  15. {
  16. Assert.Equal<int>(5, 2 + 3);
  17. }
  18. [Fact(Timeout=900)]//指定超时为900ms
  19. public void TestTimeout()
  20. {
  21. System.Threading.Thread.Sleep(1000);
  22. Assert.InRange<double>(new Random().NextDouble()*10,5,10);
  23. }
  24. [Fact]
  25. public void Test0_51CTOBlog()
  26. {
  27. //不区分大小写等值判断
  28. Assert.Equal<bool>(true,string.Equals(ConfigurationManager.AppSettings["51ctoBlog"], "http://zhoufoxcn.blog.51cto.com",StringComparison.InvariantCultureIgnoreCase);
  29. }
  30. [Fact]
  31. public void Test0_CSDNBlog()
  32. {
  33. Assert.Equal<string>(ConfigurationManager.AppSettings["CSDNBlog"], "http://blog.csdn.net/zhoufoxcn");
  34. }
  35. [Fact]
  36. public void Test0_SinaWeiBo()
  37. {
  38. Assert.Equal<string>(ConfigurationManager.AppSettings["SinaWeiBo"], "http://weibo.com/zhoufoxcn");
  39. }
  40. public void Dispose()
  41. {
  42. //在这里可以做测试结束后的收尾工作
  43. System.Console.WriteLine("Dispose");
  44. }
  45. }
  46. }

程序运行效果如下:

总结

作为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的更多相关文章

  1. 在.NET开发中的单元测试工具之(1)——NUnit

    NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...

  2. 在.NET开发中的单元测试工具之——NUnit

    NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...

  3. iOS开发中的单元测试(三)——URLManager中的测试用例解析

    本文转载至 http://www.cocoachina.com/cms/plus/view.php?aid=8088   此前,我们在<iOS开发中的单元测试(一)&(二)>中介绍 ...

  4. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

  5. Android开发中的logcat工具使用

    http://os.51cto.com/art/200905/126051.htm 用adb直接查看log:    adb logcat 清除之前的log: adb logcat -c 加过滤查看lo ...

  6. Java开发中模拟接口工具moco的使用

    场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...

  7. Cocos开发中性能优化工具介绍之Visual Studio内存泄漏检测工具——Visual Leak Detector

    那么在Windows下有什么好的内存泄漏检测工具呢?微软提供Visual Studio开发工具本身没有什么太好的内存泄漏检测功能,我们可以使用第三方工具Visual Leak Detector(以下简 ...

  8. java开发中的一些工具软件

    1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...

  9. Cocos开发中性能优化工具介绍之使用Windows任务管理器

    说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...

随机推荐

  1. mybatis返回结果封装为map的探索

    需求 根据课程id 列表,查询每个课程id的总数,放到一个map里 最简单的就是循环遍历,每一个都查询一次网上说mybatis可以返回Map 和 List<Map>两种类型 尝试 直接返回 ...

  2. 省市区JSON

    行政编码 ViewBag.CssLinks = ""; 行政编码 中国和韩国行政编码选择.数据来自json文件,但在前端通过json对象调用. 注意本地方式,是将json文件作为对 ...

  3. Python【初识篇】简介

    python是什么? 为什么学python? python在权威语言排序网站上的热度 python历史排名 python应用领域 哪些公司在用python python官方简介 上面的话简单的总结来说 ...

  4. CF209C Trails and Glades

    题目链接 题意 有一个\(n\)个点\(m\)条边的无向图(可能有重边和自环)(不一定联通).问最少添加多少条边,使得可以从\(1\)号点出发,沿着每条边走一遍之后回到\(1\)号点. 思路 其实就是 ...

  5. 金融量化分析【day112】:股票数据分析Tushare1

    目录 1.使用tushare包获取某股票的历史行情数据 2.输出该股票所有收盘比开盘上涨3%以上的日期 3.输出该股票所有开盘比前日收盘跌幅超过2%的日期 4.假如我从2010年1月1日开始,每月第一 ...

  6. array_slice()函数造成的一次sql注入

    HDwiki6.0 sql注入 下载连接http://kaiyuan.hoodong.com/download/ 漏洞出现在\control\edition.php的docompare()函数 !de ...

  7. MyBatis集成到Spring时配置MapperScannerConfigurer出错

    问题描述 在web项目中同时集成了spring mvc和mybatis. 将jdbc配置参数独立在外部配置文件中,然后通过<context:property-placeholder>引入. ...

  8. spark JAVA 开发环境搭建及远程调试

    spark JAVA 开发环境搭建及远程调试 以后要在项目中使用Spark 用户昵称文本做一下聚类分析,找出一些违规的昵称信息.以前折腾过Hadoop,于是看了下Spark官网的文档以及 github ...

  9. metasploit 教程之基本参数和扫描

    前言 首先我也不知道我目前的水平适不适合学习msf. 在了解一些msf之后,反正就是挺想学的.就写博记录一下.如有错误的地方,欢迎各位大佬指正. 感激不尽.! 我理解的msf msf全程metaspl ...

  10. 2.7 if应用:猜拳游戏

    应用:猜拳游戏 <1>运行效果: <2>参考代码: import random player = input('请输入:剪刀(0) 石头(1) 布(2):') player = ...