前言
上次使用 Unit Test 有注意到Assert的字眼,使用下來Assert主要判斷回傳值結果進行比較跟驗證,比較簡易的方式。
這次就來大概說幾個Assert method。
前置作業
使用方式
目前我寫以下方式是取得自定義連線字串,記得去 appsettings.json
新增連線資訊。
繼上次使用新增專案方式,這次使用的是 右鍵
> 建立單元測試
方式。
1 2 3 4 5 6 7 8 9 10 11
| public class Comm { public string ConnectionString(string Connect) { IConfiguration config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); return config.GetConnectionString(Connect); } }
|
下圖可以看到 [Project]Tests,[Project]會自動帶入你當前的Project名稱也相當的方便,其他欄位同等意思。
進行測試內容
1 2 3 4 5 6 7 8
| [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.AreEqual(result, str); }
|
Assert method
Assert 類別目的驗證特定功能。單元測試方法會執行應用程式程式碼中方法的程式碼,但只有在包含 Assert 時,才會報告程式碼行為的正確性。
Assert.AreEqual
這function是用來比較 str 、 result 是否相符,也是上次使用第一個method。
1 2 3 4 5 6 7 8
| [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.AreEqual(result, str); }
|
Assert.AreNotEqual
剛好是AreEqual的相反意思,可以用來測試有沒有null或是””。
1 2 3 4 5 6 7 8
| [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.AreNotEqual(result, str); }
|
Assert.AreSame
這邊AreSame比較物件屬性,但如果分別Option、Result一起比較會發生錯誤。
這邊特點是物件相同外、記憶體位置也必須要相同才可以。
1 2 3 4 5 6 7 8
| [TestMethod()] public void TestSame() { List<string> option = new List<string>() { "Hello", "UnitTest" }; List<string> Result = new List<string>() { "Hello", "UnitTest" }; Assert.AreSame(option, option); }
|
Assert.AreNoSame
這邊如同上面一樣,當初以為會以物件屬性以及內值比較差異o( ̄┰ ̄*)ゞ。
1 2 3 4 5 6 7
| [TestMethod()] public void TestSame() { List<string> option = new List<string>() { "Hello", "UnitTest" }; List<string> Result = new List<string>() { "Hello", "UnitTest" }; Assert.AreNotSame(option, Result); }
|
Assert.Fail
Fail 為失敗意思。使用這方發可能遇到null或是Exception使用,可以配合try{}catch{}使用。
Assert.Inconclusive
這邊主要是忽略功能,如果從Test Explorer 打開,可以發現有驚嘆號,代表已經被忽略過了。
Assert.IsFalse && Assert.IsTrue
下方範例判斷為是否為False。當然也會有IsTrue。
1 2 3 4 5 6 7 8
| [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.IsFalse((str!=result)); }
|
Assert.IsInstanceOfType
這邊主要驗證對方預期類型的執行個體。
1 2 3 4 5 6 7 8 9 10 11 12
| [TestClass()] public class CommTests { [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.IsInstanceOfType(str,typeof(string)); } }
|
Assert.IsNotInstanceOfType
這與上方相反,這兩種反而比較常會用到。
1 2 3 4 5 6 7 8 9 10 11 12
| [TestClass()] public class CommTests { [TestMethod()] public void ConnectionStringTest() { Comm comm = new Comm(); string str = comm.ConnectionString("Dev"); string result = "Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"; Assert.IsNotInstanceOfType(str,typeof(int))); } }
|
Assert.IsNotNull && Assert.IsNull
這邊主要判斷使否為Null狀況,這也常常會用上。
Assert.ThrowsException
測試委派 action 所指定的程式碼會擲回 T 類型的確切指定例外狀況
Assert.ReferenceEquals
判斷指定的 Object 執行個體是否為相同的執行個體。
別懷疑內值並不會去做檢查。
1 2 3 4 5 6 7 8
| [TestMethod()] public void ExceptionReuslt() { object a_obj = new List<string>() { "1","5"}; List<string> b_obj =new List<string>() { "3", "5" }; object c_obj = new object(); Assert.ReferenceEquals(a_obj, b_obj); }
|