推行單元測試的目的:
1、 減少BUG提高項目的品質
2、 養成良好的編碼習慣,提高開發人員編碼水準
要測什麼What?
最小的可測試軟體元素(單元), 包括單元的内部結構(如邏輯和資料流)以及單元的功能和可觀測的行為.
由于開發方式的不同,單元測試一般劃分方法如下:
1. 面向對象的軟體開發:以Class(類)作為測試的最小單元。以方法的内部結構作為測試的重點。
2. 結構化的軟體開發:以子產品(函數、過程)作為測試的最小單元。
如何測試How?
白盒測試方法:測試單元的内部結構, Nunit Nmock
黑盒測試方法:測試單元的功能和可觀測的行為 《通用測試用例》
步驟:
一、如何設計單元測試
需要弄清楚被測試代碼實作的功能和相應的邏輯關系;
If…else…
Switch..case…
While...
同時還要考慮到測試的輸入内容,以及傳回的結果;
用例的設計要保證面面俱到,是否覆寫了每一條路徑。
而如何做到面面俱到這就需要惡我們對每個函數進行詳細的分析,将分析和讨論的結果歸入相關的測試庫中。初期工作的進度慢并不要緊,隻要能做得很詳細對于以後的測試還是有很大的幫助。或許以後的測試中,隻要直接調用原來寫過的測試類庫,修改部分簡單的語句就可以實作新子產品的單元測試了
[TestFixture]表示:類包含了測試代碼(這個特性可以被繼承)。這個類必須是公有的,這個類還必須有一個預設構造函數。
[Test]表示它是一個測試方法。測試方法的傳回值必須為void并且不能帶有參數
[SetUp]屬性:用來辨別方法,在開始所有測試之前執行,用來在測試前初始化一些資源,比如初始化類。
[TearDown]屬性:用來辨別方法,在所有測試完成之後執行,用來釋放一些資源。
[Ignore]屬性:用來辨別方法,訓示這個方法由于某些原因暫時不需要測試(比如沒有完成相關代碼)
二、Nunit工具的使用
三、Nunit常用類和方法
Assert(斷言):
如果斷言失敗,方法将沒有傳回,并且報告一個錯誤。
如果一個方法中包括了多個斷言,在失敗的斷言之後的所有斷言将不會被執行。基于這個原因,最好是為每個測試的斷言使用try語句。
1、法測試二個參數是否相等
Assert.AreEqual( int expected, int actual );
Assert.AreEqual( decimal expected, decimal actual );
。。。。
2、測試二個參數是否引用同一個對象
Assert.AreSame( object expected, object actual );
Assert.AreNotSame( object expected, object actual );
3、測試一個對象是否被一個數組或清單所包含
Assert.Contains( object anObject, IList collection );
比較斷言:
4、測試一個對象是否大于另一個對象
Assert.Greater( int arg1, int arg2 );
5、法測試一個對象是否小于另一個對象
Assert.Less( int arg1, int arg2 );
類型斷言:
Assert.IsInstanceOfType( Type expected, object actual );
條件測試:
Assert.IsTrue( bool condition );
Assert.IsFalse( bool condition);
Assert.IsNull( object anObject );
Assert.IsNotNull( object anObject );
Assert.IsNaN( double aDouble );
Assert.IsEmpty( string aString );
Assert.IsNotEmpty( string aString );
Assert.IsEmpty( ICollection collection );
Assert.IsNotEmpty( ICollection collection );
字元串斷言(StringAssert):提供了許多檢驗字元串值的有用的方法
StringAssert.Contains( string expected, string actual );
StringAssert.StartsWith( string expected, string actual );
StringAssert.EndsWith( string expected, string actual );
StringAssert.AreEqualIgnoringCase( string expected, string actual );
四、屬性(Attribute):
TestFixtureAttribute (NUnit 2.0)
此特性标記一個類包含有測試方法,以及可選的安裝(setup)和解除安裝(teardown)方法。
必須是一個公開類型,否則NUnit将無法查找到它;
必須帶有一個預設構造函數,否則NUnit将不能構造它;
構造函數不能帶有任何副作用,因為NUnit在一個會話的過程中也許會多次構造類。
TestAttribute (NUnit 2.0)
Test特性标記一個在标記為TestFixture的類中指定的方法為測試方法
SetUpAttribute (NUnit 2.0)
這個特性在一個TestFixture中提供一個通用的功能集,這個功能集在每個測試方法調用前執行。一個TestFixture 隻能有一個SetUp方法。如果定義了多個SetUp方法,TestFixture可以成功編譯,但是它的測試将不會運作。
TearDownAttribute (NUnit 2.0)
這個特性在一個TestFixture中提供一個通用的功能集,這個功能集在每個測試方法運作後執行。一個TestFixture隻能有一個TearDown方法。如果定義了多個TearDown方法,TestFixture可以成功編譯,但是它的測試将不會運作。
ExpectedExceptionAttribute (NUnit 2.0 / 2.2.4)
這是一種指定一個測試的運作将抛出一個異常。特性有二個構造函數,第一個構造函數(NUnit 2.0)接收一個表示精确的期望的異常的Type。第二個構造函數(NUnit 2.2.4)接受期望的異常的類型全名字元串。二種情況下,運作程式(runner)将運作測試,隻有抛出指定異常的測試才能通過。如果測試抛出了不同的異常,測試将失敗,這對于繼承自期望異常的異常一樣适用。
[TestFixture]
public class SuccessTests
{
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void ExpectAnExceptionByType()
{ /* ... */ }
[ExpectedException("System.InvalidOperationException")]
public void ExpectAnExceptionByName()
}
/*以下方法不會講解BEGIN*/
PlatformAttribute (NUnit 2.2.2)
Platform特性用于指定一個測試或套件(fixture)運作的平台,平台用大小寫不敏感的字元串值指定,并且分别用Include和 Exclude來将測試包含在運作中或排除在外。平台被包含還可以做為一個參數指定給PlatformAttribute的構造函數,無論哪種情況,都可以指定多個以逗号分隔的值。
[Platform("NET-2.0")]
public class DotNetTwoTests
// ...
ExplicitAttribute (NUnit 2.2)
除非明确的選擇運作,Explicite特性将導緻一個測試或測試元件(fixture)被忽略。如果test或fixture在GUI中被選擇、在控制台運作程式的指令行中被指定或者被Category過濾器所包括,它将運作。
如果在運作測試期間遇到一個帶有Explicit特性的測試或測試元件(fixtrue),運作程式将認為它已被忽略。這時,進度條将變成黃色,同時測試被列出在未運作的測試的報告中。
[TestFixture, Explicit]
public class ExplicitTests
SuiteAttribute (NUnit 2.0)
Suite特性用于定義基于使用者優先級的套件子集。由這個版本的開發者所相信的是,這方面的需要将減少,因為framework提供了動态建立的機制。無論如何,它提供了向後相容性。
public class AllTests
[Suite]
public static TestSuite Suite
get
TestSuite suite = new TestSuite("All Tests");
suite.Add(new OneTestCase());
suite.Add(new Assemblies.AssemblyTests());
suite.Add(new AssertionTest());
return suite;
CategoryAttribute (NUnit 2.2)
Category特性提供了套件(suites)分組測試的可選方法,任何一個單獨的測試用例或元件(fixture)都可以指定屬于一個特定的類别。GUI或例行運作程式都允許指定一個包含在運作内或排除在運作外的分類清單。當分類被指定時,隻在被選擇的分類中的測試會運作。那些在分類中,而沒有被選擇的測試,将根本不會被報告。這個特征可以在指令行中使用/include或/exclude參數來通路,或者在GUI中通過一個分離的"Categories"标簽來通路。在任何時候,GUI都提供一個可見的指出哪些分類被選擇的訓示。
[Category("LongRunning")]
public class LongRunningTests
版權
作者:靈動生活 郝憲玮
如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。