【问题标题】:Which Unit Test framework should I start with for C# in Visual Studio 2008? (Windows Forms app)对于 Visual Studio 2008 中的 C#,我应该从哪个单元测试框架开始? (Windows 窗体应用程序)
【发布时间】:2010-12-04 20:19:49
【问题描述】:

问题 - 如果我使用 Visual Studio 2008 在 C# 中启动 Windows 窗体应用程序,我应该使用哪个单元测试框架?

VS2008 中似乎有一个版本?或者我应该研究像 NUnit 这样的东西吗?还是引擎盖下VS2008中使用的NUnit?什么最流行。

如果有一些允许: (a) 模拟/存根,和 (b) 断言异常的能力

谢谢

【问题讨论】:

    标签: c# visual-studio-2008 unit-testing nunit


    【解决方案1】:

    我建议您将 NUnit 用于您的测试框架。如果您需要在构建服务器上设置它,它非常轻巧且易于运输。这不是使用 MSTest 的情况。至于模拟/隔离框架,Rhino Mocks 拥有最大的用户群,您可能会使用 Rhino Mocks 最快地找到问题的答案。

    【讨论】:

    • MSTest 最大的缺点是一旦你开始走这条路,就很难改变主意。 NUnit 更容易转换为 MSTest。两个都试试。
    【解决方案2】:

    如果它只是一个简单的应用程序,VS2008 内置的 MSTest 框架应该勾选所有框。它与 NUnit 不同,尽管很多人(错误地)将其称为同一事物。

    我从来没有用它来模拟,所以也许其他人可以详细说明。它会在您的解决方案中生成一个单独的项目,仅用于测试目的。 This is a good explanation of how to use it.


    (来源:geekzone.co.nz

    编辑: 进一步挖掘,我遇到了 MSTest 和 NUnit 的 this comparison

    NUnit 框架的缺点:

    • 在单独的 MSI 中安装 NUnit。
    • 不与 Visual Studio 集成。
    • 需要手动编写测试用例。
    • 不自动生成代码。
    • 需要打开单独的窗口(NUnit 控制台或 GUI)来执行测试用例。
    • 测试用例执行顺序不可用。
    • 没有用于调试测试用例的内置功能。
    • 没有启用/禁用测试用例的内置功能。
    • 没有提供额外测试用例信息的内置功能,如堆栈跟踪、跟踪信息等。
    • 没有根据计算机名称、类名称和主机类型等对测试用例进行排序的内置功能。

    这是我链接到的比较文章。

    我从未使用过 NUnit,只使用过 C# 的 MSTest 和 Java 的 JUnit,所以我在这方面有点偏见。 MSTest 一直对我WinForms 非常有效,具有能够单独运行测试、显示非常详细的报告(带有单独的跟踪日志)和自动生成所有样板测试代码并执行所有这些功能等功能使 VS2008 成为如此出色的 IDE 的东西。听上去,NUnit 对其他人来说效果很好,他们喜欢它是有原因的。

    除非您有特殊的理由采用 NUnit/Testdriven.NET 方法,例如您需要某个功能,或者您只是更喜欢这种设置测试并尝试将其集成回 VS 的方式,否则我不会查看任何不使用开箱即用的 MSTest 的理由。

    【讨论】:

    • 当很多人使用 TestDriven.NET 来驱动 NUnit 时,这似乎是不公平的。这提供了很好的集成并消除了您提到的大部分缺点。 NUnit [Ignore] 属性禁用 [Test] 方法或 [TestFixture] 类。另外,恕我直言,订购测试用例有点臭:)
    • 哎哟。 600 个字符是不够的。 1. 那很好。我可以在任何(构建/QA)机器上运行我的测试,而无需安装 VSTS。 2. 如果要右键单击并运行测试,请获取 Resharper/TestDriven.Net 插件。另请参阅 SO q#196740。 #3,4,6,10 - 没有意义。我相信程序员比 VS 更了解他们的代码。因此,他们可以更好地确定要编写哪些测试。但后来我被测试感染了(阅读 TDD 狂热者)。测试用例不应该依赖于顺序 - 所以不确定为什么这是一个缺点。
    • Contd... 可以调试测试用例(添加 nunit 作为外部 exe 以调试您的测试 dll);尽管这意味着您不再了解您的代码。对测试用例进行排序 - 再次不确定为什么需要它。但是您可以将测试分组为 [Category("Slow Tests")] 等类别,然后在测试运行中包含或排除它们。您还有一个复选框视图,您可以在其中手动勾选您想要运行的测试。最后 9. stacktrace - nunit 在第一个选项卡中执行此操作。如果单元测试框架没有指向测试失败的确切位置,它就会有点瘫痪!
    • "NUnit 安装在一个单独的 MSI 中。"您可以只从项目中引用程序集。这就是我一直使用它的方式。
    • 我也是一个 TDD 人,我看到这个答案被多次否决。我并不是要让独眼的 NUnit 狂热者感到不安,只是解释一下我使用了什么以及为什么它对我特别适用于 Winforms 应用程序。比较来自我链接到的网站。除了 Gishu 说 NUnit 确实可以在测试失败时打印堆栈跟踪(这似乎有点关键)之外,其余的只是 NUnit 以不同方式做事的意见或理由。
    【解决方案3】:

    我们已经开始使用 MSTest。它有一个(稍微)难以在 NUnit 中复制的优势。它允许您访问类的私有成员。当您检查状态时,这是非常宝贵的。例如,假设我有一个函数可以将条目放入未公开的字典中。我的理解是,对于 NUnit,您必须使用反射来访问字典,或者添加一个 getter 来进行测试。在这里,你可以只查字典。很容易也很干净。它还允许您测试我喜欢的私有函数(我知道有些人不相信这一点)。虽然我不喜欢 MSTest,但该功能使测试变得更加容易。

    VS 集成也不错。

    【讨论】:

    • MSTest 如何实现“访问私有成员”Steve 你知道吗?只是对为什么 MSTest 人员很容易提供这个而不是 NUnit 人员感兴趣
    • 我的理解是 nunit 的人不相信它。使用 MSTest,您只需右键单击要测试的类并选择“添加类访问器”。然后,您在测试中以 Foo_Accessor 的身份访问类 Foo。
    • 我的小组对单元测试比较陌生,我们喜欢 NUnit 的很多地方,但私有访问器的东西是一个交易破坏者。
    • 这也是一个封装破坏者。你正步入反模式 - 访问stackoverflow.com/questions/333682/tdd-anti-patterns-catalogue 并寻找检查员。 NUnit 不支持这一点是正确的。
    • 我们可以同意不同意这一点。我的班级有东西,有状态。我需要找到一种方法来检查该状态而不调用其他函数(如果我能提供帮助的话)。我已经编写了“完美”的类,其中每个函数都是自包含的,并且几乎没有/没有状态,但是对于实际执行某些操作的类,我无法做到这一点。
    【解决方案4】:

    使用 MSTest。它内置在 VS2008 中,并在 IDE 中支持创建测试功能。如果并且当您“超越” MSTest,那么您应该查看 NUnit 或更现代的 xUnit。通过使用 ExpectedException 属性进行装饰,您可以期待 MSTest 中的异常。

    [Test]
    [ExpectedException(typeof(ArgumentNullException))]
    public void Should_throw_ArgumentNullException_when_the_Order_is_null()
    {
        OrderProcessor processor = new OrderProcessor();
        processor.ProcessOrder(null);
    }
    

    模拟框架独立于您选择的测试框架。模拟框架的流行选择是:MoqRhino Mocks

    【讨论】:

    • 当然。如果你有 resharper,你也可以在 Visual Studio 中运行 NUnit。
    • MSTest 不使用 [Test] 属性。这在 NUnit 和 MbUnit 中使用,这使得这两个可以互换,也是不使用 MSTest 的一个好处,你更紧密地绑定到一个框架中。
    【解决方案5】:

    我想说,为简单起见,从 Visual Studio 2008 中内置的那个开始。NUnit 非常棒,我经常使用它,所以一旦你对编写单元测试感到满意,你就可以继续使用 NUnit。

    【讨论】:

    • VS2008 单元测试是否允许您断言应该发生异常?连这个都看不出来?
    • 是的,尽管您使用属性([ExpectedAssertion()] 我相信)
    【解决方案6】:

    你没有提到你是否要测试驱动代码..

    • 如果您不熟悉任何 xUnit 框架,请使用 NUnit。最小的学习曲线。它已经存在了更长的时间。 Charlie Poole 在 NUnit(开源)上很活跃,并且有很好的更新历史。
    • VS2008 内部集成了 MSTest。它与 NUnit 不同。我从来没有理由从 NUnit 切换。我认为 NUnit 绝对拥有最大的用户群。
    • NUnit 为 Mocks 捆绑了一些东西,但我肯定会指给你 MoqRhino Mocks 已经有一段时间了,但 Moq 的学习曲线更容易(来自在线文档),尽管它可能并不总是能处理边缘场景......但恕我直言
    • 两者都支持断言异常。

    我建议买一本薄薄的书 'Pragmatic Unit Testing in C# with NUnit' 并至少通读一遍。

    关于 NUnit v MSTest 行,我不适合发表评论。 0 飞行时间与 MSTest。

    • 虽然我听说 VS2010 将提供诸如自动代码覆盖率报告之类的小玩意。如果您进行了 MSTest 测试。但这是我在 MSTests 中一直听到的那种论点。更多关于 IDE 支持和集成的内容。有一些很棒的插件,比如 Resharper 和 TestDriven,可以修补它,但要付出一定的代价。
    • 另外,恕我直言,Microsoft 的单元测试工具有一种微妙的方式引导您走上黑暗的道路。所以要小心。请参阅我在此线程上对 Dale 的评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多