TestFixtureTearDown:标记在类中所有测试方法执行之后再执行的方法。在NUnit 2.5之前只能在类中将此标记多使用于一个实例方法,在NUnit 2.5之后则可以标记多个方法,而且不限于实例方法还可以用于静态方法。
Timeout:标记被测试的方法大的执行时间,如果超出标记的时间,则会被取消执行并且被标记为测试失败。
Values:标记作为测试方法的一系列的参数。前面的代码实例中有用法实例。
NUnit的断言(Assertions)
断言是所有基于xUnit单元测试系列的核心,NUnit通过NUnit.Framework.Assert类提供了丰富的断言。具体说来,NUnit总共提供了11个类别的断言,它们是:
Equality Asserts:用于断言对象是否相等方面的断言,主要表现为两个方法的重载:Assert.AreEqual()和Assert.AreNotEqual()两种形式的重载,重载参数包括了常见的基本数值类型(int/float/double等)和引用类型(表现为使用object作为参数).
Identity Asserts:用于判断引用类型的对象是否是同一个引用的断言及断言对象是否存在于某个集合中,如Assert.AreSame、Assert.AreNotSame及Assert.Contains。
Condition Asserts:用于某些条件的断言,如:Assert.IsTrue、Assert.True、Assert.IsFalse、Assert.False、Assert.IsNull、Assert.Null、Assert.IsNotNull、Assert.NotNull、Assert.IsNaN、Assert.IsEmpty及Assert.IsNotEmpty。
Comparisons Asserts:用于数值及实现了IComparable接口的类型之间的断言,如Assert.Greater(大于)、Assert.GreaterOrEqual(大于或等于)、Assert.Less(小于)、Assert.LessOrEqual(小于或等于)。
Type Asserts:用于类型之间的判断,比如判断某个实例是否是某一类型或者是从某个类型继承,如:Assert.IsInstanceOfType、Assert.IsNotInstanceOfType、Assert.IsAssignableFrom、Assert.IsNotAssignableFrom。在NUnit 2.5之后增加了泛型方法,如Assert.IsInstanceOf<T>、Assert.IsNotInstanceOf<T>、Assert.IsAssignableFrom<T>、Assert.IsNotAssignableFrom<T>。。
Exception Asserts:有关异常方面的断言,如Assert.Throws/Assert.Throws<T>、Assert.DoesNotThrow、Assert.Catch/Assert.Catch<T>。
Utility Methods:用于精确控制测试过程,总共有四个方法,分别是:Assert.Pass、Assert.Fail、Assert.Ignore、Assert.Inconclusive。Assert.Pass和Assert.Fail是相反的,前者是表示将立即终止测试并将测试结果标识为成功通过测试,后者是立即终止测试并将测试结果标识为测试失败。Assert.Ignore表示忽略测试,这个标记可以用于标识测试方法或者测试的类。
StringAssert:用于字符串方面的断言,提供的方法有StringAssert.Contains、StringAssert.StartsWith、StringAssert.EndsWith、StringAssert.AreEqualIgnoringCase及StringAssert.IsMatch。
CollectionAssert:关于集合方面的断言,提供的方法有CollectionAssert.AllItemsAreInstancesOfType、CollectionAssert.AllItemsAreNotNull、CollectionAssert.AllItemsAreUnique、CollectionAssert.AreEqual、CollectionAssert.AreEquivalent、CollectionAssert.AreNotEqual、CollectionAssert.AreNotEquivalent、CollectionAssert.Contains、CollectionAssert.DoesNotContain、CollectionAssert.IsSubsetOf、CollectionAssert.IsNotSubsetOf、CollectionAssert.IsEmpty、CollectionAssert.IsNotEmpty和CollectionAssert.IsOrdered。
FileAssert:用于文件相关的断言,主要提供两个方法:FileAssert.AreEqual和FileAssert.AreNotEqual。
DirectoryAssert:用于文件夹的断言,提供的方法有:DirectoryAssert.AreEqual、DirectoryAssert.AreNotEqual、DirectoryAssert.IsEmpty、DirectoryAssert.IsNotEmpty、DirectoryAssert.IsWithin和DirectoryAssert.IsNotWithin。
NUnit的使用
第一次打开NUnit时会是一个空白界面,如下图所示:
首先我们需要创建一个NUnit项目,点击[File]->[New Project]会弹出一个保存NUnit项目的对话框,选择合适的路径并输入合适的名称(注意文件后缀名为.nunit),然后点击保存按钮,这样创建了一个NUnit测试项目。以后我们可以再次打开这个项目了。
此时这个NUnit项目中还不包含任何单元测试用例,我们需要创建包含测试用例的项目。打开Visual Studio创建一个类库项目(在真实项目中通常做法是向当前解决方案中添加类库项目,这样便于解决dll引用问题),接着我们需要添加NUnit的引用,这取决于我们是采用安装方式还是免安装方式,通常情况下我们只需要添加对nunit.framework(对应的dll是unit.framework.dll)的引用够了。
这里周公采用的示例代码如下:
[csharp] view plaincopy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace UnitTestDemo
{
[TestFixture]
public class NUnitTestDemo
{
private IList<int> intList = new List<int>();
[SetUp]
[Category("NA")]
public void BeforeTest()
{ Console.WriteLine("BeforeTest"); }
[TestFixtureSetUp]
[Category("NA")]
public void BeforeAllTests()
{ Console.WriteLine("BeforeAllTests"); }
[TearDown]
[Category("NA")]
public void AfterTest()
{ Console.WriteLine("AfterTest"); }
[TestFixtureTearDown]
[Category("NA")]
public void AfterAllTests()
{ Console.WriteLine("AfterAllTests"); }
[Test]
[Category("NA")]
public void Test1()
{ Console.WriteLine("Test1"); }
[Test]
[Category("NA")]
public void Test2()
{ Console.WriteLine("Test2"); }
[Test]
public void TestFloat()
{
float value = 0.9999999999999999999999999999f;
//value = 0.9999999999999999999999999999;
Console.WriteLine("float value:" + value);
Assert.AreEqual(value, 1f);
Console.WriteLine("TestFloat");
}
[Test]
public void TestDouble()
{
double value = 0.9999999999999999999999999999d;
Console.WriteLine("double value:" + value);
Assert.AreEqual(value, 1d);
Console.WriteLine("Test2");
}
[Test]
public void TestDecimal()
{
decimal value = 0.9999999999999999999999999999M;
Console.WriteLine("decimal value:" + value);
Assert.AreEqual(value, 1M);
Console.WriteLine("Test2");
}
[Test,Repeat(3)]
public void TestIntList2()
{
Assert.AreEqual(0, intList.Count);
}
[Test]
public void TestIntList1()
{
intList.Add(1);
Assert.AreEqual(1, intList.Count);
}
[TestCase(12, 3, 4)]
[TestCase(12, 2, 6)]
[TestCase(12, 4, 3)]
public void DivideTest(int n, int d, int q)
{
Assert.AreEqual(q, n / d);
}
[Test, Combinatorial,Description("This is used for show Combinatorial")]
public void MyTest(
[Values(1, 2, 3)] int x,
[Values("A", "B")] string s)
{
string value = x + s;
Assert.Greater(2, value.Length);
}
[Test]
public void TestDemo1(
[Values(1, 2, 3)] int x,
[Random(-10,10,2)] int y)
{
Assert.Greater(x + y, 0);
}
[Test]
public void TestDemo2(
[Range(0, 11, 4)] int x)
{
Assert.AreEqual(x%3,0);
}
}
}