本文
單元測試方法命名
單元測試的藝術內簡單得規範出一種一目了然的命名方式。
分為三個部分:
名稱 | 解釋 |
---|---|
1、UunitOfWorkName(單元測試名稱) | 被測試的方法、一組方法或一組類別。 |
2、Scenario(情境) | 要測試的情境,例如:傳入 NULL、傳入字串。 |
3、ExpectedBehavior(預期的行為) | 在測試情境指定的條件下,我們對測試結果的預期 |
單元測試名稱_情境_預期的行為,三個組成就是一個完整的句子。
接著我們就可以修改一下前次練習的測試方法名稱。
常用到的 Attribute
接下來介紹幾個比較常用到的 Attribute:
Attribute | 用途 |
---|---|
[TestMethod] | 表示這是一個測試方法。 |
[OwnerName] | 此測試方法的建立者。 |
[TestCategory] | 測試的方法在哪個類別。 |
[TestProperty] | 表示該方法是在哪個類別內的測試方法。 |
[Ignore] | 驗證測試時會忽略該方法。 |
[ExpectedException] | 驗證例外處理的 Attribute。 |
用法示範:
[TestMethod()] //這是一個測試方法
[Owner("Sian")] //此方法由Sian建立
[TestCategory("Class1")] //此測試方法在Class1這個類別
[TestProperty("Class1", "GetUserName")] //此測試方法是Class1類別內的GetUserName
public void GetUserName_輸入的UserName為空值_應回傳提示訊息()
{
//arrange
var target = new Class1();
var name = string.Empty;
//act
var actual = target.GetUserName(name);
//assert
Assert.AreEqual("請輸入使用者姓名!",actual);
}
建立一個會有例外狀況的 Class。
public string ExceptionTest(string name)
{
if (string.IsNullOrWhiteSpace(name))
{
throw new ArgumentNullException();
}
return $"Hi!{name},歡迎使用";
}
撰寫測試方法。
[TestMethod()]
[Owner("Sian")]
[TestCategory("Class1")]
[TestProperty("Class1", "ExceptionTest")]
[ExpectedException(typeof(ArgumentNullException))]
public void ExceptionTest_輸入的UserName為空_應回傳ArgumentNullException()
{
//arrange
var target = new Class1();
string name = string.Empty;
//act
var actual = target.ExceptionTest(name);
}
結果:
常見 Assert 類別
因為要介紹更好用的工具,這邊就跳過不介紹啦~~~~~
有興趣的同學請上MSDN參考。
Assert 連結
StringAssert 連結
FluentAssertions
到了此篇的重頭戲,FluentAssertions是一個超級好用的工具,可以讓程式碼變得更口語化,當然也可以讓測試方法可讀性更佳。
看到介紹心不心動啊,寫測試就是可以這麼簡單。
接下來就實際用在我們的測試練習。
先到 Nuget 安裝 FluentAssertions 至我們的測試專案。
接著就可以動手改寫我們的測試程式。
[TestMethod()]
[Owner("Sian")]
[TestCategory("Class1")]
[TestProperty("Class1", "GetUserName")]
public void GetUserName_輸入的UserName為空值_應回傳提示訊息()
{
//arrange
var target = new Class1();
var name = string.Empty;
var expected = "請輸入使用者姓名!";
//act
var actual = target.GetUserName(name);
//assert
actual.Should().Be(expected);
}
[TestMethod()]
[Owner("Sian")]
[TestCategory("Class1")]
[TestProperty("Class1", "GetUserName")]
public void GetUserName_輸入的UserName為Null_應回傳提示訊息()
{
//arrange
var target = new Class1();
string name = null;
var expected = "請輸入使用者姓名!";
//act
var actual = target.GetUserName(name);
//assert
actual.Should().Be(expected);
}
[TestMethod()]
[Owner("Sian")]
[TestCategory("Class1")]
[TestProperty("Class1", "GetUserName")]
public void GetUserName_輸入的UserName不為空_應回傳正確訊息()
{
//arrange
var target = new Class1();
string name = "Sian";
var expected = $"Hi!{name},歡迎使用";
//act
var actual = target.GetUserName(name);
//assert
actual.Should().Be(expected);
}
查看測試結果。