我们必须决定使用哪种技术进行单元测试。目前我们使用的是Visual Studio 2010,并不满意MSTest。它是错误的,部署较差(例如,测试设置输出目录无法正确识别),并且在尝试测试32位和64位版本的程序集时有几个问题。最糟糕的是,MSTest与我们的Jenkins构建系统没有很好的阻抗匹配。因此我们考虑进入NUnit。但是,我们团队中没有人对NUnit有很好的了解。此外,我们将很快进入Visual Studio 2012.
我需要了解Visual Studio 2012 MSTest与Nunit最新版本的优缺点。由于堆栈溢出的大多数文章都与旧版本的VS相关,因此它们与我们无关。我想微软自2010年以来已经对MSTest进行了大量改进。请提供与两种技术中所遇到的详细技术问题的公正比较(仅限新版本)
答案 0 :(得分:27)
我现在正在使用MSTest和NUnit。恕我直言NUnit仍然是一个更好的解决方案。如果您有Visual Studio 2012 Premium版本,那么它实际上非常好,除了您似乎无法将测试组合在一起这一事实。我喜欢它集成到Visual Studio中的事实,但缺乏分组和运行测试子集而无需手动选择它们的能力是一个巨大的问题。
Premium中的覆盖率分析也非常简洁。它速度快,可以快速满足您的需求。这是一个高级功能。
由于MSTest中仍然缺少功能(甚至自vs2010以来删除了功能),我仍然建议使用NUnit进行单元测试。其优点包括按命名空间进行测试分组,添加测试用例注释的能力(使用不同参数多次运行相同的测试),并且与Opencover和Report Generator进行覆盖分析非常有效。引用的主要内容是它没有像MSTest那样集成,所以它真的取决于你对这是否是一个骗局的重要程度。
答案 1 :(得分:10)
@Biranchi:在Visual Studio 2012(以及更高版本)中使用哪个单元测试框架并不重要。请参阅我的博客文章,这是您所参考的续集。 http://blogs.msdn.com/b/visualstudioalm/archive/2012/11/20/part-2-using-traits-with-different-test-frameworks-in-the-unit-test-explorer.aspx
您甚至可以混合和匹配来自不同框架的测试,您甚至可以将其降低到方法级别! 这意味着您甚至可以将遗留代码从一个代码转移到另一个代码,而且没有不良副作用。
另请参阅此内容,了解如何使用Nuget将NUnit适配器安装到解决方案中,从而使开发人员可以自行安装。 http://blogs.msdn.com/b/visualstudioalm/archive/2013/06/11/part-3-unit-testing-with-traits-and-code-coverage-in-visual-studio-2012-using-the-tfs-build-and-the-new-nuget-adapter-approach.aspx
@Sriwantha:MSTest是一个比NUnit更简单的框架。 NUnit(以及XUnit)为您提供了更大的灵活性,这也减少了编写代码。一个例子:如果你正在使用类别(你应该),MSTest需要一个类别来装饰每个方法。 NUnit允许您装饰类 - 这将对该类中的所有方法生效。 NUnit还允许您使用强类型类别
public class Integration : Category {}
这足以声明您可以使用的类别而不是
Category("Integration");
冒着拼写错误的风险。
NUnit对数据驱动测试有更好的支持。 NUnit也支持theories
仅举几例。
答案 2 :(得分:1)
如果您有“Update 1”或更高版本,VS2012会允许将测试分类为组: http://msdn.microsoft.com/en-us/library/hh270865.aspx#BKMK_Grouping_and_filtering_the_test_list
答案 3 :(得分:1)
您是否研究过VS的Traits功能? http://blogs.msdn.com/b/visualstudioalm/archive/2012/11/09/how-to-manage-unit-tests-in-visual-studio-2012-update-1-part-1-using-traits-in-the-unit-test-explorer.aspx
与nunit相比,mstest(2012年更新1)中的分组要好得多。
答案 4 :(得分:0)
这里还要补充一点。在某些情况下,看起来MSTEST引擎与TFS Build不兼容。如果您正在使用TFS构建,则它不会报告跳过的测试(标记为忽略属性)。它只包括Assert.Inconclusive。如果这是一个问题,您应该使用NUnit而不是MSTest。