最近有機會使用 Fluent Assertions 這個套件來寫單元測試,感覺不錯....
Roy Osherove 在《單元測試的藝術》這本書裡面不斷強調,單元測試的程式碼要盡量易讀易懂,最好是讓人不用多想,一眼就看得懂某個測試方法要測的是什麼,以及怎麼驗證測試結果。
使用 NUnit 來撰寫單元測試時,儘管 Assert.That() 方法不難理解,但如果有其他寫法能夠進一步提高測試程式碼的可讀性,當然是更好。Fluent Assertions 便有這個好處。
底下是一個 NUnit 的測試程式碼範例:
比較看看改用 Fluent Assertions 之後的寫法:
是不是覺得更口語化,也更容易解讀呢?
運行測試時,如果上面的測試方法失敗了,失敗的訊息也很平易近人。下圖是用 Resharper 所附的測試運行器(test runner)來執行測試的結果:
Fluent Assertions 提供了許多擴充方法,以便應付各式各樣的驗證邏輯。底下再貼一例:
官網有更多範例可以參考:https://github.com/dennisdoomen/fluentassertions/wiki
Fluent Assertions 支援多種測試框架,包括:MSTest、NUnuit、XUnit、NSpec 等等。用法很簡單,只要透過 NuGet 把 Fluent Assertions 套件加入你的測試專案,然後在你的測試類別中引用命名空間 FluentAssertions,就可以開始撰寫行雲流水般的驗證邏輯了。運行測試時,Fluent Assertions 會自動尋找並且辨識它所在的測試專案用的是哪一套測試框架,以便在測試失敗時拋出符合該測試框架的異常(exception)。
本文的範例程式已上傳至 GitHub。
Happy Coding!
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!
沒有留言: