做过单元测试的同学大概都知道以上几种测试框架,但我一直很好奇它们到底有什么不同,然后搜到了一篇不错的文章清楚地解释了这几种框架的最大不同之处。
地址在这里: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下个包,换下特性而已。
的确是这样,所以不必在这方面劳力伤神,如果自己对单元测试框架没有什么经验,那就选择官方的吧,如果某一天真的碰见了瓶颈,切换就好。