這里也許有人會問,如果我的項目很大,每個測試方法都需要連接數(shù)據(jù)庫,在每個方法執(zhí)行的時候進行連接再釋放,這樣是不是太耗資源太慢了,能不能在一個單元測試類實例化的時候運行一個指定的方法呢?
這是可以的。在NUnit中,我們使用[TestFixtureSetUp]和[TestFixtureTearDown]可以實現(xiàn)這樣的功能。[TestFixtureSetUp]是指在這個測試類的整個生命周期中,它在所有的測試方法之前運行一次,而[TestFixtureTearDown]是在所有的測試方法都結束時運行。
這里要注意的,[TestFixtureSetUp]與構造函數(shù)是不一樣的,它標識的方法遲于構造函數(shù)運行。我們再對這個測試類進行重構:
	[TestFixture]
	public class CalculatorTest
	...{
	    private Calculator cal;
	    private int a, b, expected, actual;
	    public CalculatorTest()
	    ...{
	        Console.WriteLine("執(zhí)行構造函數(shù)");
	    }
	    [TestFixtureSetUp]
	    public void InitClass()
	    ...{
	        Console.WriteLine("執(zhí)行TestFixtureSetUp");
	        cal = new Calculator();
	        a = 10;
	        b = 2;
	    }
	    [TestFixtureTearDown]
	    public void FinalizeClass()
	    ...{
	        Console.WriteLine("執(zhí)行TestFixtureTearDown");
	    }
	    [SetUp]
	    public void InitMethod()
	    ...{
	        Console.WriteLine("執(zhí)行SetUp");
	    }
	    [TearDown]
	    public void FinalizeMethod()
	    ...{
	        Console.WriteLine("執(zhí)行TearDown");
	        a = 10;
	        b = 2;
	    }
	    [Test]
	    public void TestAdd()
	    ...{
	        Console.WriteLine("TestAdd() Begin");
	        expected = 12;
	        actual = cal.Add(a, b);
	        Assert.AreEqual(expected, actual);
	        Console.WriteLine("TestAdd() End");
	    }
	    [Test]
	    public void TestMinus()
	    ...{
	        Console.WriteLine("TestMinus() Begin");
	        expected = 8;
	        actual = cal.Minus(a, b);
	        Assert.AreEqual(expected, actual);
	        Console.WriteLine("TestMinus() End");
	    }
	    [Test]
	    public void TestMultiply()
	    ...{
	        Console.WriteLine("TestMultiply() Begin");
	        expected = 20;
	        actual = cal.Multiply(a, b);
	        Assert.AreEqual(expected, actual);
	        Console.WriteLine("TestMultiply() End");
	    }
	    [Test]
	    public void TestDivide()
	    ...{
	        Console.WriteLine("TestDivide() Begin");
	        expected = 5;
	        actual = cal.Divide(a, b);
	        Assert.AreEqual(expected, actual);
	        Console.WriteLine("TestDivide() End");
	    }
	}
在NUnit中,我們可以很清楚地看到這個類的執(zhí)行順序:
	
假如我們的測試項目中有使用到數(shù)據(jù)庫,可以把數(shù)據(jù)庫連接寫在[TestFixtureSetUp]中,把釋放的代碼寫在[TestFixtureTearDown]中。
我相信現(xiàn)在大家對NUnit的這4個屬性都應該有一個直觀的認識了吧。都是4個很簡單的屬性,但是在使用中用處卻是非常大的。