在.NET开发中的单元测试工具之——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压缩包内有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时的界面:
 

单元测试工具之Xunit的更多相关文章

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

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

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

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

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

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

  4. 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙

    1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...

  5. codeblocks+Mingw 下配置开源c++单元测试工具 google test

    google test 是google的c++开源单元测试工具,chrome的开发团队就是使用它. Code::Blocks 12.11(MinGW 4.7.1) (Windows版)Google T ...

  6. PHP单元测试工具PHPUnit初体验

    今天接到了个任务,需要对数字进行计算,因为涉及到整数,小数,和科学计数法等很多条件,所以人工测试非常麻烦,于是想到了PHP的单元测试工具PHPUnit,所以写个文档备查. 看了PHPUnit的文档之后 ...

  7. Java单元测试工具:JUnit4(一)(二)(三)(四)

    Java单元测试工具:JUnit4(一)--概述及简单例子 Java单元测试工具:JUnit4(二)--JUnit使用详解 Java单元测试工具:JUnit4(三)--JUnit详解之运行流程及常用注 ...

  8. 单元测试工具 SmokeTest

    .NET 程序集单元测试工具 SmokeTest Smoke Test(冒烟测试),也称Regression Test(回归测试),是对软件的安装和基本功能的测试.一般地我们使用脚本来实现Smoke ...

  9. Web Service单元测试工具实例介绍之SoapUI

    原文  Web Service单元测试工具实例介绍之SoapUI SoapUI是当前比较简单实用的开源Web Service测试工具,提供桌面应用程序和IDE插件程序两种使用方式.能够快速构建项目和组 ...

随机推荐

  1. python学习笔记23(时间与日期 (time, datetime包))

    Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime. time包 time包基于C语言的库函数(library functions).Python的解释器通 ...

  2. poj 3249 Test for Job (记忆化深搜)

    http://poj.org/problem?id=3249 Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissi ...

  3. 第一次写python

    这是一个在BJDP上学习Coding Kata的时候用到的一个练习,原来打算用Java写的,但是一想正好是学习的好机会. 就用Python了.第一次,写的有些复杂. 这个题目是关于购买图书的打折信息的 ...

  4. [转载]c# winform 获取当前程序运行根目录

    // 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.G ...

  5. 团体程序设计天梯赛-练习集L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...

  6. spoj 2178

    好水...... #include<cstdio> #include<cstdlib> #include<cstring> #include<algorith ...

  7. JSP中脚本、声明和表达式的本质区别

     JSP脚本元素 使用JSP脚本元素可以将Java代码嵌入到JSP页面里,这些Java代码将出现在由当前JSP页面生成的Servlet中,使JSP将静态内容与动态内容分离出来.脚本元素包含:  1. ...

  8. 1028-Digital Roots

    描述 The digital root of a positive integer is found by summing the digits of the integer. If the resu ...

  9. 使用QGridLayout布局实现翻页效果

    http://blog.csdn.net/u013704336/article/details/51474942

  10. Android 进程保活招式大全

    目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题.本文对 Android 进程拉活进行一个总结. Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被 ...