只有累積,沒有奇蹟

2019年3月21日 星期四

[UnitTest] 如何測試目標方法中 Guid 型別的代碼 ?

情境
如果要產生一個亂數時很常會想到 Guid 方法解決,在 C# 使用 Guid 的方式相當簡單僅要透過  Guid.NewGuid  靜態方法產生一組 Guid 使用,在目前公司很常看到使用 Guid 作為識別碼,今天在重構舊代碼時忽然想到如果遇到 Guid 該如何進行加上單元測試,以下就目前想到的解法進行測試與說明,如果各位高手們有更好的方法歡迎高抬貴手一起討論研究。

解決方案
寫個簡單的 Sample 方法讓整個情境可以更容易了解,舉個例子來說有個 Generator 類別提供 NewGuidToken 方法產生 Guid 資料並回傳給呼叫端,Sample Code 如下
public static class Generator
{
    public static Guid NewGuidToken()
    {
        return Guid.NewGuid();
    }
}
第一時間讓我想到之前上 TDD 遇到測試今天是不是聖誕節案例時很像,但特別為了 Guid 寫一個介面讓使用的 class 實做,在透過建構子注入就可以斷開其依賴關係,但這 case 算是很單純個人覺得沒必要做這麼複雜的工,忽然想到在 C# 中每個資料型別物件大多都提供  TryParse  進行轉換,且該方法回傳結果為 true / fales bool型別,與 UnitTest 中的 Assert 搭配使用相當方便,單元測試 Sample Code 如下
[TestFixture()]
public class GeneratorTests
{
    [Test()]
    public void Input_NewGuid_Return_True()
    {
        // act 
        var input = Generator.NewGuidToken();

        // assert
        Assert.IsTrue(Guid.TryParse(input.ToString(), out Guid output));
    }
    [TestCase("Teset123")]
    [TestCase("Marcus")]
    public void Input_FakeGuid_Return_True(string input)
    {
        Assert.IsFalse(Guid.TryParse(input, out Guid output));
    }
} 
當你的情境只需要驗證產生出來的是否符合 Guid 時,就可以直接透過  Assert.IsTrue(your guid string)   來確認 Guid 格式是否正確 (第 11 行 );反之,如果要驗證格不符合時透過不是時用 Guid.TryParse + Assert.IsFalse 即可 ( 第17行 ),相當容易上手且閱讀性很高。

接著在來確認單元測試後的結果,其單元測試結果都執行正常
三份測試都通過且驗證無誤,綠燈 Pass 測試成功 !!

Summary
以上就是針對 Guid 型別寫單元測試的方法,也是小弟的矬見,如果各位大大有更好的方式歡迎一起討論跟溝通 :)


0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com