讓單元測試代碼更好寫、好讀:Fluent Assertions

最近有機會使用 Fluent Assertions 這個套件來寫單元測試,感覺不錯....

Roy Osherove 在《單元測試的藝術》這本書裡面不斷強調,單元測試的程式碼要盡量易讀易懂,最好是讓人不用多想,一眼就看得懂某個測試方法要測的是什麼,以及怎麼驗證測試結果。

使用 NUnit 來撰寫單元測試時,儘管 Assert.That() 方法不難理解,但如果有其他寫法能夠進一步提高測試程式碼的可讀性,當然是更好。Fluent Assertions 便有這個好處。

底下是一個 NUnit 的測試程式碼範例:

[TestFixture]
public class MyClassTests
{
    [Test]
    public void Should_Add_Two_Numbers()
    {
        var sut = new MyClass();

        int result = sut.Add(10, 20);

        Assert.That(result, Is.EqualTo(30));
    }        
}


比較看看改用 Fluent Assertions 之後的寫法:

[TestFixture]
public class MyClassTests
{
    [Test]
    public void Should_Add_Two_Numbers()
    {
        var sut = new MyClass();
        
        int result = sut.Add(10, 20);
        
        result.Should().Be(30, "because 10+20=30."); // 讀作:結果應該是 30,因為....
    }
}    

是不是覺得更口語化,也更容易解讀呢?

運行測試時,如果上面的測試方法失敗了,失敗的訊息也很平易近人。下圖是用 Resharper 所附的測試運行器(test runner)來執行測試的結果:


Fluent Assertions 提供了許多擴充方法,以便應付各式各樣的驗證邏輯。底下再貼一例:

[Test]
public void Should_Get_Hello_String()
{
    var sut = new MyClass();
    string result = sut.GetHelloString("Michael");

    result.Should().StartWith("Hello").And.EndWith("Michael");
}

官網有更多範例可以參考:https://github.com/dennisdoomen/fluentassertions/wiki

Fluent Assertions 支援多種測試框架,包括:MSTest、NUnuit、XUnit、NSpec 等等。用法很簡單,只要透過 NuGet 把 Fluent Assertions 套件加入你的測試專案,然後在你的測試類別中引用命名空間 FluentAssertions,就可以開始撰寫行雲流水般的驗證邏輯了。運行測試時,Fluent Assertions 會自動尋找並且辨識它所在的測試專案用的是哪一套測試框架,以便在測試失敗時拋出符合該測試框架的異常(exception)。

本文的範例程式已上傳至 GitHub

Happy Coding!

Post Comments

技術提供:Blogger.