【问题标题】:How to debug Nunit test in Visual Studio 2010如何在 Visual Studio 2010 中调试 Nunit 测试
【发布时间】:2011-10-12 00:41:38
【问题描述】:

我在从 VisualStudio 调试 NUnit 测试时遇到问题。我创建了一个空项目(Console Application),然后添加了对 NUnit 库的引用并编写了一个简单的测试。

namespace ReimplementingLinq.Tests
{
    [TestFixture]
    public class WhereTest
    {
        [Test]
        public void SimpleFiltering()
        {
            int[] source = { 1, 2, 3, 4, 2, 8, 1 };
            var result = source.Where(val => val < 4);
            int[] expected = {1,2,3,4};
            CollectionAssert.AreEqual(expected, result);
        }
    }
}

接下来,我遵循了此链接中给出的建议 How do I run NUnit in debug mode from Visual Studio? 但该主题中的任何解决方案都不适合我。在执行测试时,我的任何断点都没有被命中。我尝试通过附加到流程以及使用带有参数的外部程序运行项目来测试解决方案。

我可以做些什么来调试我的单元测试?

【问题讨论】:

标签: c# unit-testing testing nunit


【解决方案1】:

直接使用 Visual Studio 运行或调试 NUnit 测试

看起来没有扩展!

只需配置您的测试项目,当您点击 F5(开始调试)或 Ctrl-F5(不调试开始)时,它会自动启动 NUnit GUI 并执行所有在里面进行测试。如果遇到任何断点,您还可以简单地调试您的测试代码。

step-by-step guide with images 向您展示了具体的操作方法。

懒惰是一切发明之母 :-)

【讨论】:

  • 谢谢!我在 nunit.exe.config 中缺少supportedRuntime 元素。
  • 我有正确的supportedRuntime 元素,但它只有在我注释掉v2 并强制它使用v4 后才有效
  • 由于我不能使用 TestDriven.NET,这是一个了不起的解决方案。谢谢
  • 这应该是选择的答案。
  • 这根本不适用于 2010 Express:它没有在其设置中启动外部程序的选项——既不是库程序集也不是控制台应用程序。
【解决方案2】:

假设您使用的是除 Express Edition 以外的 Visual Studio 版本,那么TestDriven.NET 可能会有所帮助。

安装后

  1. 在测试方法中设置断点
  2. 右键单击并从“测试方式”菜单中选择“调试器”
  3. 调试器应该启动并命中您的断点

很遗憾,您不能将此方法用于 Visual Studio 的 Express 版本,因为 TestDriven.NET 是 Visual Studio 的插件,而 Express 版本不支持使用插件

在控制台应用中运行测试

您还可以通过控制台应用程序在调试器中运行测试:

  1. 创建一个新的控制台应用程序
  2. 参考您的单元测试项目
  3. 在控制台应用程序的 Main 方法中创建一个新的测试装置实例,然后调用其中一个测试方法。例如,如果我有一个名为 MyTests 的夹具和一个名为 Test1 的测试,我会写:

    var myTests = new MyTests();
    myTests.Test1();
    
  4. 在创建MyTests 类实例的行设置断点并按F5

  5. 调试器将触发您的断点,然后您可以使用 F11 进入 TestFixture 的构造函数,或跨步进入测试本身

【讨论】:

  • 感谢您的回答,但是否有针对我的问题的免费解决方案?
  • TestDriven.NET 是免费供个人使用的,没有说明这是否是商业的,我会编辑并提供另一个可能有效的解决方案。
  • -1 因为它没有回答问题。 OP 专门询问了 NUnit。
  • @erict 你能澄清你的推​​理吗? OP 询问“我能做些什么来调试我的单元测试???”讨论的两种方法都将根据问题标题在 Visual Studio 调试器中执行 NUnit 测试。测试本身仍然像往常一样使用 NUnit 框架,所以我不确定你的意思,因为上面的解决方案仍然使用 NUnit。
  • @crippledsmurf 我很抱歉。我只是快速查看了 testdriven.net,并认为它是一个类似于 NUnit 的竞争测试包。我没有意识到它实际上是一种让在 VS 中更容易使用 NUnit 的方法。不幸的是,我无法撤消-1,我希望我在此评论上方给您的查询提供的+1 具有相同的效果。我确实遇到了与 OP 相同的问题,对我来说,解决方案是在配置文件中强制使用 .net 4(我认为这是正确的答案)
【解决方案3】:

如果您使用的是 NUnit 2.4,您可以将以下代码放入您的 SetUpFixture 类中。 (您可以使用旧版本执行此操作,但您需要执行与 SetUpFixture 等效的任何操作,或将其复制到测试本身。)

[SetUpFixture]
public class SetupFixtureClass
{
    [SetUp]
    public void StartTesting()
    {
        System.Diagnostics.Debugger.Launch();
    }
}

Debugger.Launch() 所做的是,当您在 NUnit 中单击“运行”时,会显示以下对话框。

然后,您在打开项目的情况下选择正在运行的 Visual Studio 实例(我的屏幕截图中的第二个),然后将附加调试器,并且任何断点或异常都将显示在 Visual Studio 中。

【讨论】:

    【解决方案4】:

    看看NHarness on CodePlex。

    这是一个非常简单的基于反射的测试运行器库,可识别 NUnit 属性,并且可以从 Visual Studio Express 中的项目运行,从而允许调试测试。

    它目前有一个测试类级别的粒度,但是方法级别的调用,据说很快就会被添加。

    【讨论】:

      【解决方案5】:

      在 NUnit 2.5.3 上遇到了同样的问题,最终找到了不同的解决方案。看看这是否适合你:

      打开 NUnit GUI 并进入工具菜单设置...对话框。在设置树中选择 Test Loader 部分的 Assembly Isolation 子部分。将默认进程模型设置为直接在 NUnit 进程中运行测试。

      我将它设置为在一个单独的进程中运行测试,这就是为什么调试器无法将我的被测 dll 链接到用于调试它的符号的原因。我仍在为我的默认域使用使用每个程序集使用一个单独的 AppDomain。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        相关资源
        最近更新 更多