在前面的入門中,每個測試類別運行良好。但是大家有沒有發現代碼的重複性太多了。
每一個測試類別中都是先建立一個 Calculate 類的對象,然後 測試每個方法,再然後設定斷言。
有沒有方法可以設定得簡單些呢?有!NUnit 中有一個屬性可以完成這個任務。
[SetUp]
被這個屬性修飾的方法會在每個測試方法運行前都執行一遍。
[SetUp] public void init() { Console.WriteLine("init"); }
我們運行 NUnit 看看效果吧。在Console.Out欄裡打出了四個init
下面我們可以改進一下之前的測試方法的寫法了。
namespace NunitTest{ [TestFixture] public class CalculateTest { private int a; private int b; private Calculate cal; [SetUp] public void init() { a = 10; b = 2; cal = new Calculate(); Console.WriteLine("init"); } [Test] public void TestAdd() { int result = cal.Add(a, b); Assert.AreEqual(12, result); } [Test] //[ExpectedException(typeof(DivideByZeroException))] public void TestDivide() { int result = cal.Divide(a, b); Assert.AreEqual(5, result); } [Test] public void TestMinus() { int result = cal.Minus(a, b); Assert.AreEqual(8, result); } [Test] public void TestMultiply() { int result = cal.Multiply(a, b); Assert.AreEqual(20, result); } }}
怎麼樣簡潔多了吧。運行NUnit,測試通過。!!!
一般[SetUp]用來進行一些資料的初始化等操作,他在每個測試方法執行之前執行。
與此對應的還有一個屬性,在每個測試方法執行之後執行,用於回收等一些操作,他就是
[TearDown]
我們在測試方法中添加一個試試效果吧:
[TearDown] public void Destory() { Console.WriteLine("Destory !!!"); }
運行NUnit,
上面兩個方法屬性,分別是在每個測試方法的前後執行,也就是說這個測試類別中有多少個測試方法他們就要執行多少次了。
那麼在測試中有這麼一種情況,如果我們要測試資料庫,用上面的兩個屬性我們可以完成這個測試工作。首先在SetUp中初始化資料庫連接,然後在TearDown中釋放串連。這樣雖然可行,但是如果每個測試方法運行時串連一次資料庫,然後釋放,然後在串連,在釋放。如果次數少還好,如果次數很多,資料庫連接又是遠端話,那麼這樣是很浪費時間的了。
NUnit還為我們提供了下面兩個屬性:
[TestFixtureSetUp] public void TestFixtureSetUp() { Console.WriteLine("TestFixtureSetUp RUN !!!"); } [TestFixtureTearDown] public void TestFixtureTearDown() { Console.WriteLine("TestFixtureTearDown RUN !!!"); }
運行,效果如下了:
不用多說了吧,看看效果就知道了。[TestFixtureSetUp] 和 [TestFixtureTearDown] 分別是指在測試類別運行前和執行後調用的方法了。這樣我們可以很好的解決測試資料庫遇到的尷尬境地了……