NUnit-GUI界面如图5-2:
图5-2:使用Catagories属性的界面
Explicit属性
本属性忽略一个test和test fixture,直到它们显式的选择执行。如果test和test fixture在执行的过程中被发现,就忽略他们。所以,这样一来进度条显示为黄色,因为有test或test fixture忽略了。
例如:
1
2 [Test,Explicit]
3 [Category("Exception")]
4 [ExpectedException(typeof(DivideByZeroException))]
5 public void DivideByZero()
6 {
7 int zero = 0;
8 int infinity = a/zero;
9 Assert.Fail("Should have gotten an exception");
10 }
11 为什么会设计成这样呢?原因是Ingore属性忽略了某个test或test fixture,那么他们你再想调用执行是不可能的。那么万一有一天我想调用被忽略的test或test fixture怎么办,就用Explicit属性了。我想这就是其中的原因吧。
Expected Exception属性
期望在运行时抛出一个期望的异常,如果是,则测试通过,否则不通过。
参看下面的例子:
1[Test]
2[ExpectedException(typeofInvalidOperationException))]
3public void ExpectAnException()
4 {
5 int zero = 0;
6 int infinity = a/zero;
7 Assert.Fail("Should have gotten an exception");
8
9 }
10
在本测试中,应该抛出DivideByZeroException,但是期望的是InvalidOperationException,所以不能通过。如果我们将[ExpectedException(typeof(InvalidOperationException))]改为[ExpectedException(typeof(DivideByZeroException))],本测试通过。
5 . 测试生命周期合约
如果记得test case的定义,其中一个属性是测试的独立性或隔离性.SetUp/TearDown方法提供达到测试隔离性的目的.SetUp确保共享的资源在每个测试运行前正确初始化,TearDown确保没有运行测试产生的遗留副作用. TestFixtureSetUp/TestFixtureTearDown同样提供相同的目的,但是却在test fixture范围里,我们刚才描述的内容组成了测试框架的运行时容器(test runner)和你写的测试之间的生命周期合约(life-cycle contract).
为了描述这个合约,我们写一个简单的测试来说明什么方法调用了,怎么合适调用的.这里是代码:
1using System;
2using NUnit.Framework;
3[TestFixture]
4public class LifeCycleContractFixture
5{
6 [TestFixtureSetUp]
7 public void FixtureSetUp()
8 {
9 Console.Out.WriteLine("FixtureSetUp");
10 }
11
12 [TestFixtureTearDown]
13 public void FixtureTearDown()
14 {
15 Console.Out.WriteLine("FixtureTearDown");
16 }
17
18 [SetUp]
19 public void SetUp()
20 {
21 Console.Out.WriteLine("SetUp");
22 }
23
24 [TearDown]
25 public void TearDown()
26 {
27 Console.Out.WriteLine("TearDown");
28 }
29
30 [Test]
31 public void Test1()
32 {
33 Console.Out.WriteLine("Test 1");
34 }
35
36 [Test]
37 public void Test2()
38 {
39 Console.Out.WriteLine("Test 2");
40 }
41
42}
43
44当编译和运行这个测试,可以在System.Console窗口看到下面的输出:FixtureSetUp
SetUp
Test 1
TearDown
SetUp
Test 2
TearDown
FixtureTearDown可以看到, SetUp/TearDown方法调用在每个测试方法的前后. 整个fixture调用一次TestFixtureSetUp/TestFixtureTearDown方法.