在目前公司的開發流程中,測試階段都是人工去測試,但用人工測不但耗時外,還有可能會有疏漏。若每次調整程式時都要人工測試是否有影響到其他功能,累積下來花費的時間很可觀。若能使用自動測試的話,不但可以節省測試花費的時間,還能確保程式的品質。
首先建一個class project作為單元測試對象
public class PrimeService
{
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
if (candidate == 2)
{
return true;
}
throw new NotImplementedException("Please create a test first.");
}
}
接著開始撰寫單元測試的程式,微軟文件中建議測試function的命名可以分成三塊:被測試的function名稱、測試案例以及期望的結果
以2測試,期望回傳的結果是true
[Test]
public void IsPrime_InputIs2_ReturnTrue()
{
var result = _primeService.IsPrime(2);
Assert.IsTrue(result, "1 should not be prime");
}
參數也能直接寫在Attribute上,這樣就能用同一個測試方法傳入不同的案例做測試,這次傳入幾個小於2的數字,期望得到false的結果
[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_InputLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.IsFalse(result, "1 should not be prime");
}
另外還能測試程式是否有如預期拋出exception
[TestCase(3)]
public void IsPrime_InputGreaterThan2_ReturnNotImplement(int value)
{
var actual = Assert.Catch<NotImplementedException>(() => _primeService.IsPrime(value));
StringAssert.Contains("Please create a test first.", actual.Message);
}
最後測試結果:
自動測試比自己人工測方便太多了,接下來我會先拿我維護的系統試著加入NUnit,節省日後增修後測試花費的時間。