單元測試
我們以LogAnalyzer專案為例(註記:自單元測試的藝術)
public class LogAnalyzer01Tests
{
[SetUp]
public void Setup()
{
}
[Test]
public void IsValidLogFileName_BadExtension_ReturnFalse()
{
LogAnalyzer analyzer = new LogAnalyzer();
bool result = analyzer.IsValidLogFileName("filewithbadextension.foo");
Assert.False(result);
}
[Test]
public void IsValidLogFileName_goodExtensionUppercase_ReturnsTrue()
{
LogAnalyzer analyzer = new LogAnalyzer();
bool result = analyzer.IsValidLogFileName("filewithbadextension.log");
Assert.True(result);
}
}
//專案代碼
class LogAnalyzer
{
public bool IsValidLogFileName(string fileName)
{
if (!fileName.EndsWith(".log",System.StringComparison.CurrentCultureIgnoreCase))
{
return false;
}
return true;
}
}
一個單元測試包含三種行為
- 準備 (Arrange) 物件、建立物件、進行必要的設定
- 操作 (Act) 物件
- 驗證 (Assert) 某件事符合預期
首先來看單元測試的命名部分:[UnitOfWorkName]_[ScenarioUnderTest]_[ExpectedBehavior]
範例
[Test]
public void IsValidLogFileName_BadExtension_ReturnFalse()
{
//Arrange
LogAnalyzer analyzer = new LogAnalyzer();
//Act
bool result = analyzer.IsValidLogFileName("filewithbadextension.foo");
//Assert
Assert.False(result);
}
- UnitOfWorkName:被測試的方法、一組方法或一組類別,EX:IsValidLogFileName
- ScenarioUnderTest:測試進行的假設條件,常見案例:登入成功,EX:BadExtension
- ExpectedBehavior:測試場景指定條件下,對於被測試方式的預期,EX:ReturnFalse。
以這個為例IsValidLogFileName_BadExtension_ReturnFalse,就可以從字面上翻譯成是否為log檔案名稱,測試使用錯誤資料,預期回傳false。
例如:Member_LoginSuccess_ReturnTrue 字面翻譯成會員登入成功,回傳true。
元哥的筆記