做過單元測試的同學大概都知道以上幾種測試框架,但我一直很好奇它們到底有什么不同,然后搜到了一篇不錯的文章清楚地解釋了這幾種框架的最大不同之處。
地址在這里:http://www.tuicool.com/articles/F3eEn2j
簡而言之,除了標注測試類和方法的特性用的不一樣之外,XUnit 和 NUnit 是非常相似的,而它們比MSTest最大的不同處就是多了傳值測試,如下所示:
[TestCase(1)] [TestCase(2)] [TestCase(3)] [TestCase(4)] public void FireMultipleTimes(int fireCount) { Bug bug = new Bug(); Raygun gun = new Raygun(); for(int i = 0; i < fireCount; i++) { gun.FireAt(bug); } if (fireCount >= 3) { Assert.IsFalse(gun.HasAmmo()); } else { Assert.IsTrue(gun.HasAmmo()); } }
上面是NUnit的,XNunit也有類似的方法。
這篇文章非常適合剛入門單元測試的同學看,有空的話我會翻譯一下(不過其實里面都有源碼截圖,不看文章光看圖也沒什么問題)。
個人常用的是MSTest,不過包括Abp在內的開源框架用的都是XUnit或NUnit,
在網上調查了一下,關於MSTest的負面評論還是比較多的,最主要的問題就在於MSTest的彈性不夠好,
它無法在非微軟的平台上運行單元測試,不過在 .Net Core日漸成熟的今天,我覺得現在已經不是問題了。
補充:又去StackOverflow轉了一圈,發現其實MSTest也添加了類似的功能如下
[TestClass] public class UnitTest1 { [DataTestMethod] [DataRow(1, 2, 2)] [DataRow(2, 3, 5)] [DataRow(3, 5, 8)] public void AdditionTest(int a, int b, int result) { Assert.AreEqual(result, a + b); } }
現在來看,幾乎這些框架都沒差了,在StackOverflow看到一條我很贊同的看法:
其實不用顧慮那么多,隨便選擇吧,MSTest對Vs的集成是最好的,而且也很容易上手,如果哪一天碰到它所無法解決的事情,切換到其他框架也非常簡單,僅僅只是Nuget下個包,換下特性而已。
的確是這樣,所以不必在這方面勞力傷神,如果自己對單元測試框架沒有什么經驗,那就選擇官方的吧,如果某一天真的碰見了瓶頸,切換就好。