【问题标题】:Debugging tests running under NUnit调试在 NUnit 下运行的测试
【发布时间】:2012-03-07 01:36:07
【问题描述】:

我有一个带有测试项目的 .NET 4.0 C# 解决方案,该项目在 NUnit 下运行单元测试。 NUnit 二进制文件是 v3.5。

我可以很好地运行测试,但我无法在 Visual Studio 中设置断点和单步。我猜这是由 .NET 版本不匹配引起的。有没有办法使用 NUnit for v3.5 单步执行 v4.0 测试程序集?

【问题讨论】:

  • 在这种情况下你应该可以设置断点。你是如何运行测试的,你是如何附加调试器的?
  • @FrankSchwieterman 我项目的调试属性有一个启动操作,它指向 nunit-console.exe 和包含 nunit 参数的命令行参数。我正在设置断点,然后在解决方案资源管理器中为测试 csproj 选择调试。调试器运行,断点状态发生变化,出现错误“无法加载符号”
  • 嗯,这听起来不像 Visual Studio 已附加到运行您的测试的进程(它将附加到您按 f5 的任何应用程序,尽管该应用程序具有启动 NUIt 的构建步骤)
  • 如果您在 VS 之外运行 NUnit GUI 应用程序,您可以加载您的测试 DLL,然后从 Visual Studio 附加到该进程。 (在调试菜单中,点击“附加到进程”,然后找到nunit进程)
  • @FrankSchwieterman 感谢您的建议,但 Visual Studio 仍然无法加载调试符号(从与它找到的测试程序集位于同一位置的 pdb)

标签: c# nunit


【解决方案1】:

我的答案是另一个完整版本的 NUnit。但是,对于像我这样的人来说,这只是发现我通过管理 NuGet 包安装了 NUnit 和 NUnit 控制台...(屏幕截图中的第一个和第三个选项)。

因此,我在 Visual Studio 2015 社区版中配置了我的测试项目属性“调试”选项卡(请参见下面的下一个屏幕截图)以运行 nunit3-console.exe,该文件位于您的 \packages 文件夹中,该文件夹在您使用时自动创建安装“NUnit Console”并为参数我添加了我的测试库 DLL 文件和命令行开关--wait(它提示开发人员“按任意键关闭”,所以它可以让你看到结果),更重要的是@ 987654326@ 自动附加您的测试库 .NET 代码,以便您的断点被命中。

注意要运行 NUnit 3 控制台应用程序,请将您的测试项目设置为启动项目。

【讨论】:

  • 正是我想要的谢谢
【解决方案2】:

另一种选择是使用http://testdriven.net/ 通过 Visual Studio 运行测试。您可以在测试上设置断点并右键单击 → 运行测试使用调试器

【讨论】:

    【解决方案3】:

    ReSharper 允许您在调试时逐步完成单元测试。但我不认为你可以用 Visual Studio 做同样的事情。尝试安装 ReSharper 试用版,然后尝试调试测试。

    【讨论】:

    • Resharper 有时也表现不佳 - 当您尝试执行单个步骤时,它会直接突破到下一个断点。有时会发生这种情况。不知道为什么=)
    • 谢谢,效果很好。我确信我以前也可以使用 Visual Studio 来执行此操作,但通过 ReSharper 运行也可以!
    • 如果你想在没有 Resharper 的情况下使用 Visual Studio,你最好使用 MSTest 而不是 NUnit。语法差异非常小。
    【解决方案4】:

    问题在于,除非您另有说明,否则 NUnit 会在确定有必要时生成一个子进程来运行测试。如果您在Process Explorer 中观看它,您会看到“nunit-console.exe”* 生成了“nunit-agent.exe”*。 Visual Studio 调试器不会自动附加到子进程。

    在这种情况下,我相信版本不匹配是它选择启动子进程的原因。解决此问题的最简单方法是编辑“nunit-console.exe.config”* 以更改 <supportedRuntime> 值集。那里应该已经有一个注释,标记了您应该注释掉的行,以强制它作为 .NET 4.0 运行:

    <startup useLegacyV2RuntimeActivationPolicy="true">
      <!-- Comment out the next line to force use of .NET 4.0 -->
      <supportedRuntime version="v2.0.50727" />
      <supportedRuntime version="v4.0.30319" />
    </startup>
    

    一旦你改变了它,第一个 NUnit 进程就已经是 .NET 4.0 并且它不应该需要产生一个子进程。如果您想确定,请指定/process=Single,NUnit 将在单个进程中运行,如果不能,则立即失败。

    * - 如果您需要使用 x86 版本,请替换:

    nunit-console.exe        -> nunit-console-x86.exe
    nunit-agent.exe          -> nunit-agent-x86.exe
    nunit-console.exe.config -> nunit-console-x86.exe.config
    

    【讨论】:

    • 太棒了,谢谢。我看到你应该添加 supportedRuntime 元素,但没有奏效。我没有注意到我使用的是 x86 版本,并且它有自己的配置文件。
    • @bmargulies - 我不认为这会有所帮助,因为当 NUnit 解析其参数时,为时已晚 - 它已经作为 .NET 2.0 进程启动,需要生成一个子进程来满足您对 .NET 4.0 进程的要求。
    • 我们是否必须重新编译它才能让它像 4.0 一样运行?
    • 不,这就是编辑配置文件的作用——它在决定使用哪个运行时之前由 .NET 读取。
    • 谢谢,问题解决了!我通过piggy-backing on top of NUnit console runner 采取了稍微不同的路线,同时将必要的命令行选项注入其中以使其使用单个进程。要将所有 NUnit 的东西正确部署到输出目录,运行程序的项目文件中还需要 two tweaks
    【解决方案5】:

    我注意到控制台应用程序,但您应该发现您可以手动启动 NUnit 的 GUI 版本,然后从 Visual Studio 中的调试器附加到 nunit-agent 进程。

    【讨论】:

    • 谢谢,你知道这在 nunit 2.6 中是否仍然可用?我可以看到 nunit-gui 的代码,但在预构建的二进制文件中看不到 exe
    • nunit.exe 是 GUI 版本。 nunit-console.exe 是控制台版本。运行 nunit.exe 将生成 nunit-agent 进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2018-08-30
    相关资源
    最近更新 更多