• 单元测试工具之Xunit


    在.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="binDebugXunitDemo.exe" config-filename="binDebugXunitDemo.exe.config" shadow-copy="true"/> 
    5.     <assembly filename="binDebugxunit.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.     public class XunitDemo:IDisposable 
    6.     { 
    7.         public XunitDemo() 
    8.         { 
    9.             //在这里可以做测试开始前的初始化工作 
    10.             System.Console.WriteLine("Init"); 
    11.         } 
    12.         [Fact] 
    13.         public void TestAdd() 
    14.         { 
    15.             Assert.Equal<int>(5, 2 + 3); 
    16.         } 
    17.         [Fact(Timeout=900)]//指定超时为900ms 
    18.         public void TestTimeout() 
    19.         { 
    20.             System.Threading.Thread.Sleep(1000); 
    21.             Assert.InRange<double>(new Random().NextDouble()*10,5,10); 
    22.         } 
    23.         [Fact] 
    24.         public void Test0_51CTOBlog() 
    25.         { 
    26.             //不区分大小写等值判断 
    27.             Assert.Equal<bool>(true,string.Equals(ConfigurationManager.AppSettings["51ctoBlog"], "http://zhoufoxcn.blog.51cto.com",StringComparison.InvariantCultureIgnoreCase); 
    28.         } 
    29.         [Fact] 
    30.         public void Test0_CSDNBlog() 
    31.         { 
    32.             Assert.Equal<string>(ConfigurationManager.AppSettings["CSDNBlog"], "http://blog.csdn.net/zhoufoxcn"); 
    33.         } 
    34.         [Fact] 
    35.         public void Test0_SinaWeiBo() 
    36.         { 
    37.             Assert.Equal<string>(ConfigurationManager.AppSettings["SinaWeiBo"], "http://weibo.com/zhoufoxcn"); 
    38.         } 
    39.         public void Dispose() 
    40.         { 
    41.             //在这里可以做测试结束后的收尾工作 
    42.             System.Console.WriteLine("Dispose"); 
    43.         } 
    44.     } 
    45. }
    总结
    作为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时的界面:
     
  • 相关阅读:
    时隔三个月,不言谢归来了。学习播客继续更新日常所学。
    一个网易云音乐的外链URL简单的获取方法
    VisualStudioCode常用主题,与插件设置
    页面a标签统一跳转方法:base 标签
    Web前端开发规范(记录一):团队约定-基本原则
    JS中,正则表达式:match(/^(.*)(.)(.{1,8})$/)[3]分析
    Morgan模块使用
    Config模块使用
    MongoDB安装
    JSP-九大内置对象
  • 原文地址:https://www.cnblogs.com/elim/p/3643958.html
Copyright © 2020-2023  润新知