在除錯模式下,使用 Object Exporter 輸出單元測試之情境物件
前言
發生不預期的錯誤,往往因為當下物件的設定值剛好落於邊界,或是特定參數組合所引發,而此時是否會很想將這個物件完整資訊儲存下來? 並希望於錯誤修正後重新以此相同條件再次進行測試,驗證錯誤是否已排除? 我們可以利用 Object Exporter 來輸出錯誤當下的物件建立程式碼,以此作為測試情境來補上單元測試。
安裝
請先下載及安裝 Object Exporter
安裝完畢開啟VS後並無任何改變,因為該功能只有在Debug的時候才會出現。
使用情境
假設系統目前存在一種演算法,會透過Algorithm類別及SubAlgorithm類別中的各項參數來計算,因此類別約略如下,就只是一些加減乘除的運算而已,最後會使用 GetResult 方法取得運算結果。
public class Algorithm
{
public decimal Param1 { get; set; }
public decimal Param2 { get; set; }
public SubAlgorithm SubAlgorithm { get; set; }
public decimal GetResult()
{
var result = Param1 / ((SubAlgorithm.SubParam1 + Param2) - (Param1 + SubAlgorithm.SubParam2));
return System.Math.Round(result, 2);
}
}
public class SubAlgorithm
{
public decimal SubParam1 { get; set; }
public decimal SubParam2 { get; set; }
}
對應測試案例如下 (測試已通過)
[TestClass]
public class AlgorithmTest
{
[TestMethod]
public void GetResultTest()
{
// Arragen
var expected = -0.75m;
var algorithm = new Algorithm
{
Param1 = 33,
Param2 = 22,
SubAlgorithm = new SubAlgorithm()
{
SubParam1 = 11,
SubParam2 = 44
}
};
// Act
var actual = algorithm.GetResult();
// Assert
Assert.AreEqual(expected, actual);
}
}
筆者在某種情境下,會使用迴圈來跑出個別數值的結果
internal class Program
{
private static void Main(string[] args)
{
var algorithm = new Algorithm
{
Param1 = 33,
Param2 = 22,
SubAlgorithm = new SubAlgorithm()
{
SubParam1 = 11,
SubParam2 = 44
}
};
for (int i = 0; i < 10; i++)
{
algorithm.SubAlgorithm.SubParam1 += 11;
var result = algorithm.GetResult();
Console.WriteLine("result: " + result);
}
Console.Read();
}
}
程式執行下去,悲劇發生了;演算法最容易發生錯誤的地方多為數值邊界與特定參數組合之巧合,而此例就是沒有考慮到分母為零的情況,因此在特定參數組合中會造成錯誤的發生。
這時就可以點選 工具
中的 Export Objects
畫面上會顯示所有變數清單。由於中斷點在 Algorithm 中,因此想要取得 Algorithm 當下的數值狀態就需要點選 this 選項;因為筆者想將這個案例加入至單元測試中,因此會選擇輸出 C# Object 作為單元測試的條件。
點選 Export
後,就可以看到建立該物件實體的程式碼
取得代碼後,以此迅速地補上新測試單元
[TestMethod]
public void GetResultTest_分母為零()
{
// Arragen
var expected = 0;
var algorithm = new ObjectExporterSample.Algorithm
{
Param1 = 33m,
Param2 = 22m,
SubAlgorithm = new ObjectExporterSample.SubAlgorithm
{
SubParam1 = 55m,
SubParam2 = 44m
}
};
// Act
var actual = algorithm.GetResult();
// Assert
Assert.AreEqual(expected, actual);
}
執行測試後可重現失敗情境
接著修改代碼,將錯誤修正
再次執行測試,通過所有測試,表示錯誤修正完畢無誤
參考資訊
https://github.com/OmarElabd/ObjectExporter
希望此篇文章可以幫助到需要的人
若內容有誤或有其他建議請不吝留言給筆者喔 !