使用Xunit來進行單元測試


不管你愛與不愛,單元測試對於一個軟件的長治久安還是必不可少的一環。在Visual Studio 2012后,VS中的測試瀏覽器也能與第三方的集成了,用起來還是非常方便的。目前在.Net框架下的測試工具主要有Nunit、內置的MSTest以及Xunit這三個工具,本文就簡單的介紹一下如何在VS中使用XUnit這個測試框架的后起之秀。

 

安裝Xunit:

Xunit的安裝現在不需要插件支持了,直接使用NuGet安裝如下兩個庫即可:

  • PM> Install-Package xunit
  • PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio測試瀏覽器支持, VS2015目前必須裝Pre的)

 

編寫測試用例:

一個簡單的測試用例如下:

    public class TestClass1
    {
        [Fact]
        public void testMax()
        {
            Assert.Equal(3, Math.Max(3, 2));
        }

        [Fact]
        public void testFail()
        {
            Assert.Equal(2, Math.Max(3, 2));
        }
    }

 

執行測試用例

在測試瀏覽器中執行RunAll即可(修改后不用編譯,它會自動編譯)

    

 

測試方式說明:

聲明測試用例:

Xunit里面不需要TestClass之類Attribute來標記測試用例類,只需要滿足如下條件即可:

  • 測試類必須是public的
  • 測試用例用 FactAttribute 標記

 

斷言:

Assert類用來驗證測試測試函數的輸出結果。

    Assert.Equal(3, Math.Max(3, 2));

也可以使用一些擴展的斷言庫,常用的就是xunit.should庫,它是以擴展函數的方式進行驗證,看起來更加舒服。

PM> Install-Package xunit.should

    Math.Max(3, 2).ShouldBe(3);

 

不過,這個庫和新版本的XUnit適配不是很好,我這里寫了一個簡單的版本: 

    static class AssertExtension
    {
        public static void ShouldBe<T>(this T value, T exprected)
        {
            if(Equals(value, exprected))
                return;

            var msg = $"與預期結果不一致,當前值是 '{format(value)}', 期望值是 '{format(exprected)}'";
            throw new InvalidOperationException(msg);
        }

        public static void ShouldNotBe<T>(this T value, T notExprected)
        {
            if (!Equals(value, notExprected))
                return;

            var msg = $"與預期結果不一致,當前值不應該是 '{format(notExprected)}' ";
            throw new InvalidOperationException(msg);
        }
static string format(object value) { return value == null ? "NULL" : value.ToString(); } }

 

構建和析構:

Xunit里面並不是通過SetUp和TearDown標記來表明測試用例的構建和析構操作,它每次執行測試用例的時候都會插件測試用例類,執行完成后,如果其實現了IDispose接口,則會調用Dispose函數,更加簡潔明了。也就是說:

  • 在測試用例類的構造函數指向數據構建操作
  • 在Dispose函數中指向數據清理操作

 

異常測試

Xunit並不是通過Attribute來標記異常捕獲的,而是直接使用Assert.Throws斷言函數來驗證異常。

    public class TestClass1
    {
        [Fact]
        public void testException()
        {
            Assert.Throws<InvalidOperationException>(() => operation());
        }

        void operation()
        {
            throw new InvalidOperationException();
        }
    }

 

更改測試用例名稱:

     [Fact(DisplayName = "Max函數測試")]

 

跳過測試用例:

     [Fact(Skip ="重構未完成")]

 

分組:

     [Trait("Group", "Category")]

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM