一、xUnit.Net介绍
xUnit.net的创造者的创造者是Jim Newkirk和Brad Wilson从包括NUnit及其它单元测试框架的使用经验中总结出来的一个新框架,相比于NUnit,xUnit.net有如下特点:
为每个测试方法产生一个对象实例
取消了[SetUp]和[TearDown]
取消了[ExpectedException]
类似于Aspect的功能
减少了自定义属性(Attribute)的数目
采用泛型
匿名委托
可扩展的断言
可扩展的测试方法
可扩展的测试类
xUnit.net的官方网站是:https://github.com/xunit/xunit,下面是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的常用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>