[Testing] 使用 Object Exporter 輸出單元測試之情境物件

在除錯模式下,使用 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


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !