NUnit vs Visual Studio 2008's Test Projects for Unit Testing?
我将在工作中启动一个新项目,并希望进入单元测试。我们将使用VS 2008、C_和ASP.NET MVC工具。我正在考虑使用Nunit或VS2008的内置测试项目,但我愿意研究其他建议。一个系统比另一个更好,或者可能比另一个更容易使用/理解吗?我希望这个项目能成为我们未来发展努力的"最佳实践"。
感谢您的帮助和建议!!
daok把VS2008测试项目的所有pro命名为nunit的pro。
- 努尼特有一个嘲弄的框架。
- 努尼特可以跑出去IDE,如果你想的话,这很有用在非MS Build服务器上运行测试像cc.net
- 努尼特有更多版本而不是Visual Studio。你没有等了几年才有新版本您不必安装新版本的IDE获取新功能。
- 正在开发扩展如排练等。
- Visual Studio测试需要很长时间为了某种原因启动。这是2008年更好,但还是太慢了为了我的口味。快速运行测试看看你有没有弄坏什么东西可能需要太长时间。努尼特与有点像要运行的TestDriven.net实际上,来自IDE的测试非常多更快。尤其是跑步时单个测试。根据Kjetil Klaussen的说法,这是由Visual Studio TestRunner引起的,在testDriven.net中运行mstest测试可以使mstest的性能与nunit相当。
单元测试框架实际上并不重要,因为您可以使用单独的项目文件和条件编译来转换测试类。(像这样,vs->nunit):
1 2 3 4 5 6 7 8 9 10 11 | #if !NUNIT using Microsoft.VisualStudio.TestTools.UnitTesting; #else using NUnit.Framework; using TestClass = NUnit.Framework.TestFixtureAttribute; using TestMethod = NUnit.Framework.TestAttribute; using TestInitialize = NUnit.Framework.SetUpAttribute; using TestCleanup = NUnit.Framework.TearDownAttribute; using TestContext = System.String; using DeploymentItem = NUnit.Framework.DescriptionAttribute; #endif |
测试驱动的.NET插件很好,而且不是很贵…只有纯VS2008,您必须从测试类或测试列表中找到测试。使用TestDriven.NET,您可以直接从正在测试的类中运行测试。毕竟,单元测试应该易于维护,并且靠近开发人员。
VS2008内置单元测试框架的好处/变化
我用努尼特已经两年了。一切都很好,但我不得不说,在VS中的单元系统非常好,因为它在GUI中,可以更容易地进行私有功能的测试,而不必乱来。而且,Vs的单元测试让你可以做覆盖和其他Nunit不能做的事情。
Visual Studio的测试框架有一点烦人,那就是它将创建许多测试运行文件,这些文件往往会使项目目录混乱——尽管这不是什么大问题。
此外,如果缺少诸如testsdriven.net之类的插件,则无法在Visual Studio环境中调试nunit(或mbunit、xunit等)单元测试,就像使用内置的Microsoft vs测试框架一样。
稍微偏离主题,但是如果你使用nunit,我可以推荐使用resharper——它在vs用户界面上添加了一些按钮,使得在IDE中运行和调试测试更加容易。
这篇评论有点过时,但更详细地解释了这一点:
http://codebetter.com/blogs/paul.laudeman/archive/2006/08/15/using-resharper-as-an-essential-part-of-your-tdd-toolkit.aspx
我对nunit上的vs单元测试的主要观点是vs测试创建倾向于为私有成员访问注入一组生成的代码。
有些人可能想测试他们的私有方法,有些人可能不想,这是一个不同的主题。
我关心的是,当我编写单元测试时,它们应该受到非常严格的控制,这样我就能确切地知道我在测试什么,以及我是如何测试它的。如果有自动生成的代码,我将失去一些所有权。
我已经做了一些TDD同时使用和(也许我有点笨)尼特似乎是一个更快和更简单的使用我。当我说很多的时候,我的意思是很多。
在MS测试中,到处都有太多的属性——进行真正测试的代码就是您可能在这里或那里读到的微小的行。一团糟。在nunit中,进行测试的代码只是控制属性,正如它应该做的那样。
此外,在Nunit中,您只需单击要运行的测试(只有一个?所有的考试都包括一门课?集会?解决方案?)。单击。窗户又大又净。你会得到清晰的绿灯和红灯。你真的知道一眼就会发生什么。
在VSTS中,测试列表被卡在屏幕的底部,它又小又丑。你得看两遍才能知道发生了什么事。你不能只运行一个测试(好吧,我还没有发现!).
但我可能错了,当然-我刚刚读了21篇关于"如何使用VST做简单的TDD"的博客文章。我应该多读点,你说得对。
对于努尼特,我读了一本。那天我在打电话。玩得开心。
顺便说一下,我通常喜欢微软的产品。Visual Studio确实是开发人员可以购买的最佳工具,但在Visual Studio团队系统中,TDD和工作项管理真的很差劲。
一切顺利。西尔文。
Xunit是绿地项目的另一种可能性。它可能有一个更直观的语法,但并不真正与其他框架兼容。
http://www.codeplex.com/xunit
我收到消息说"nunit文件结构比vstest更丰富"…当然,如果您更喜欢nunit文件结构,您可以使用此解决方案来实现另一种方式,如(nunit->vs):
1 2 3 4 5 6 7 8 9 | #if !MSTEST using NUnit.Framework; #else using Microsoft.VisualStudio.TestTools.UnitTesting; using TestFixture = Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute; using Test = Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute; using SetUp = Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute; using TearDown = Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute; #endif |
或任何其他转换…:-)这里的用法只是编译器的别名。
首先,我想更正一个错误的语句:您可以使用命令行在Visual Studio外部运行MSTEST。尽管TeamCity等多个CI工具对Nunit有更好的支持(可能会随着MSTest越来越流行而改变)。在我当前的项目中,我们同时使用这两种方法,并且我们发现唯一的区别是,MSTEST总是以32位运行,而nunit是以32位或64位运行,这仅在您的代码使用32/64依赖的本机代码时才重要。
我从MSTEST开始,但出于一个简单的原因进行了切换。MSTest不支持从其他程序集继承测试方法。
我讨厌多次写同一个测试的想法。尤其是在一个大型项目中,测试方法很容易进行100次测试。
努尼特确实是我所需要的。nunit唯一缺少的是一个Visual Studio加载项,它可以显示每个测试的红/绿状态(如vsts)。
如果您考虑的是MSTEST或NUnit,那么我建议您查看MBUnit。我的理由是
我最初选择MBUnit是因为它的[行测试…]功能,我没有找到返回的单一原因。我把所有活跃的测试套件都从努尼特搬过来,再也没有回头看。从那时起,我已经将两个不同的开发团队转化为利益。
.NET测试框架建议和.NET单元测试包?.
据我所知,目前有四个框架可用于.NET的单元测试
- 单元测试
- 多单元
- 麦斯特
- 单元测试
努尼特一直在前面,但差距在过去一年左右已经缩小。我自己还是更喜欢nunit,特别是在不久前他们添加了一个流畅的接口,这使得测试非常可读。
如果您刚开始进行单元测试,可能不会有什么不同。一旦你达到速度,你将处于一个更好的位置来判断哪个框架最适合你的需要。
我不喜欢vs内置测试框架,因为它强制您创建一个单独的项目,而不是将测试作为您正在测试的项目的一部分。
MSTEST本质上是nunit的轻微修改,具有一些新特性(如装配设置和拆卸,而不仅仅是夹具和测试级别),并且缺少一些最佳位(如新的2.4约束语法)。Nunit更成熟,其他供应商对它的支持也更多;当然,因为它一直都是免费的(而MSTEST只将它变成了2008年的专业版,在此之前它是更昂贵的sku),大多数alt.net项目都使用它。
尽管如此,还是有一些公司非常不愿意使用没有微软标签的东西,特别是OSS代码。因此,拥有一个正式的MS测试框架可能是那些公司需要进行测试的动机;老实说,测试才是最重要的,而不是你使用的工具(并且使用上面的Tuomas Hietanen代码,你几乎可以使你的测试框架可互换)。
随着.NET 4.0中代码契约系统的发布和静态检查器的可用性,理论上您需要编写更少的测试用例,并且像pex这样的工具将帮助识别这些用例。把这和手头的讨论联系起来,如果你需要在单元测试上做的更少,因为你的契约覆盖了你的尾部,那么为什么不继续使用内置的部分,因为这是一个更少的管理依赖。这些天,我的一切都是简单的。-)
另请参见:
- Microsoft PEX–自动单元测试
- 使用Visual Studio 2010和C 4.0使用Pex生成单元测试
我更喜欢使用微软的小型测试框架,但目前仍坚持使用Nunit。MS的问题通常是(对我而言)
- 必须维护的共享"测试"文件(无意义)
- 测试列表导致与多个开发人员/VCS发生冲突
- 集成界面不好-设置混乱,测试选择繁重
- 没有好的外流道
注意事项-如果我测试一个ASPX站点,我肯定会使用MS的-如果我是单飞的话,女士也可以-如果我的技能有限,无法配置nunit:)
我发现只编写测试并启动nunitgui或其他前端(testdriven的定价要高得多)要容易得多。使用命令行版本设置调试也很容易。