单元测试,NUnit还是Visual Studio?


114

我正在使用Visual Studio(有时是harshaper)来运行我的单元测试。

我听说过NUnit,但我对此并不了解...

我应该在乎吗?它可以提供比Visual Studio更好的东西吗?

我应该使用NUnit吗?为什么?


12
也考虑使用xunit,但是无论您做什么,都请看一下TestDriven.net
Ian Ringrose,


尝试xunit.net。它是.net应用程序的开源和不错的单元测试框架。
Mukesh Arora

Answers:


100

NUnit与MS-Test相比没有什么优势

  1. 套件属性-可以汇总测试并分别执行(例如,对于具有快速和慢速测试的大型项目很有用)
  2. 可读的Assert方法,例如Assert.AreEqual(expected, actual)vsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit的版本更新频繁-MS-Test的每个VS版本只有一个。
  4. 许多集成的运行器,包括Resharper和TestDriven.NET
  5. 预期的异常消息声明-可以使用NUnit中的属性完成,但必须使用MS-Test中的Try-Catch完成
  6. [TestCase]!NUnit允许进行参数化测试。

32
异常也可以通过MS-Test中的属性断言:ExpectedExceptionAttribute。
Stefan Steinegger,2009年

9
我将NUnit与Assert.Throws <>()一起使用,因为它遵循AAA原理,这不是通过属性的方式。
奥利弗·哈纳皮

25
#3不是功能,这是一个问题,而#5是100%错误;MS Test具有ExpectedException属性,并且始终具有
Randolpho

4
@Elisha我记得,他们故意不支持消息文本检查,因为文本不被认为是重要的并且可以是任意的。也就是说,它不会影响程序的流程。
罗伯·肯特

7
“#3不是功能,这是个问题” –听起来不像是一种非常敏捷的思维方式……
SamuelKDavis

72

从我当前的角度来看(经过8个月的开发,平均大约有10个开发人员),出于以下原因,我建议不要使用MSTest

  • 该框架本身非常慢。我并不是说您编写的测试代码-在您的控制之下。我的意思是,无论运行测试套件,单个测试等,运行这些测试的框架都很慢。
  • 保留Test-Metadata文件的需求在多个开发人员对其进行处理(例如重新创建元数据等)时总是会带来麻烦。其他所有测试套件都不需要元数据文件。组织测试是一种很好的方式,但是您可以通过名称空间,类和方法名称来实现相同的目的。
  • 在进行持续集成时,如果要在构建计算机上运行单元测试,则需要在该计算机上安装Visual Studio。

换句话说,如果我必须在8个月前再次做出决定,我可能会选择NUnit。我可能没有集成的测试结果报告,但是开发人员将拥有更加无缝的测试体验。


6
+1,除非没有选择,否则避免使用MSTest。各种开源框架都更好(xUnit,NUnit,MbUnit等)。
布兰农

49

这是我对MS Test的经验

  • 我们正在运行3800测试左右的MS测试。
  • 测试仅需要很长时间才能开始执行,这在运行单个测试时很痛苦。
  • 执行测试大约需要1GB内存。不,这不是由于我们测试中的内存泄漏。通常,我们会遇到OutOfMemoryExceptions。
  • 因为它使用了那么多资源,所以我们开始从批处理文件执行测试。那么整个集成有什么好处呢?
  • 这是越野车,不稳定:
    • 例如,如果您从测试中删除[忽略]属性,它将无法识别它,因为它会将有关测试的信息缓存在某个地方。您需要刷新测试列表(有时可以解决问题)或重新启动VS。
    • 它随机不将参考程序集复制到out目录。
    • 部署项目(要使用的其他文件)只是无法正常工作。它们被随机忽略。
  • vsmdi和testrunco​​nfig文件中有隐藏的信息(在测试代码中不可见)。如果您不关心它,则可能不起作用。
  • 从功能上讲,它可以与NUnit媲美,但是如果您考虑使用VS测试器版本,则价格昂贵。

另外:我们现在还有更多测试,甚至无法说出多少。由于OutOfMemoryExceptions和其他不稳定问题,不可能再从Visual Studio中全部运行它们。我们从脚本运行测试。在Visual Studio中查看测试结果会很容易,但是当打开解决方案时,VS会崩溃(每次)。因此,我们需要使用文本搜索来搜索失败的测试。集成工具不再具有优势。


另一个更新:我们现在正在使用VS 2013。很多事情发生了变化。自从我们开始以来,他们第三次重写了MS Test测试运行程序。这引起了很多重大变化,但是没有一个新版本做得更好。我们很高兴我们没有使用MS Test的精美功能,因为它们不再受支持。真是可惜。我们仍在使用脚本来构建和运行所有单元测试,因为它更方便。Visual Studio需要几分钟来开始运行测试(编译后直到第一次测试开始为止的时间度量)。他们可能通过更新来修复它,这可能是我们项目的特定问题。但是,在运行相同的测试时,Resharper的速度要快得多。

结论:至少与Resharper结合使用,MS Test很有用。我希望他们最终能知道应该如何编写测试运行程序,并且在下次更新Visual Studio时不会进行这种重大更改。


我最近开始没有调试运行它们,使得很多更快,更像NUnit的是如何使用,但它仍然苏茨基。似乎性能不佳与调试时Visual Studio做一些时髦的事情有关。(也就是说,使用“ ctrl + F5”而不是“ F5”,您仍然可以与VS获得很好的“集成”)
Arafangion 2010年

好答案,节省了我的时间
FindOutIslamNow

18

NUnit可以与Visual Studio 结合使用。它是一个框架,而不是单独的程序。因此,您可以关心是否适合您:)。

替代文字http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

“安装插件后,您将在工具菜单下找到一个新的子菜单。”

有关导入它的更多信息,请参见http://nunitit.codeplex.com/

此外,使用SO可以找到很多东西。例如,本主题列出了NUnit相对于MS标准测试的优势。




1

我不确定其他人,但是NUnit提供了不错的GUI和控制台来运行您的单元测试,并且您还可以生成NUnit Test执行结果的报告,该报告将详细说明测试是否失败或通过以及何时进行测试参加单元测试


1

NUnit是一个单元测试框架,resharper也支持该框架。我认为您使用的是Microsoft的单元测试框架,因此NUnit只是Microsoft产品的替代方案;)

这是NUnit主页的链接:http : //nunit.org


因此,您的意思是nunit除了Microsoft单元测试框架外没有带来什么?
蒂姆

确实如此,请参阅我的帖子中的链接(如上)。
bastijn

我使用的是NUnit,但我并不真正了解Microsoft的单元测试框架,所以我不能说什么更好。我认为您很有可能在SO上找到有关差异的一些话题。
奥利弗·哈纳皮

它提供了一些有用的构造,例如[TestCase]用于运行具有不同args的一种测试方法,[Theory]-用于构建更详尽的规范,以及其他一些构造。它还支持断言非常好的流利语法。而且,最后但并非最不重要的一点是,它的使用范围比MSTest更广泛,因此,如果遇到麻烦,您将有更好的机会获得支持/信息。
elder_george,2009年

0

NUnit中,测试不是并行执行的。相反,似乎所有测试都在单个线程上执行。在MSTest中,每个测试都在单独的线程上实例化,这导致运行被交错。因此,如果测试A成功依赖于测试B,则它很可能会失败,因为测试B可能会随着测试A的运行而开始运行。


-12

如果使用的是Visual Studio,则必须使用NUnit进行单元测试;如果运行的是Java(Netbeans),则必须使用JUnit进行单元测试。

这是一个简单的计算器单元测试的示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}

4
当然,你必须使用NUnit的,它只是一个框架,没有人强迫你使用它。如果您觉得无聊,甚至可以自己写一个。
HimBromBeere's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.