在.NET Core和Visual Studio Code中调试xUnit测试

dri*_*iis 40 debugging .net-core visual-studio-code

我在Mac上运行.NET Core 1.0和Visual Studio Code.

我有一个控制台项目和一个测试项目.我已经设置了launch.json,以便我可以调试控制台项目.

如何设置启动单元测试并附加调试器的启动配置?

Tyl*_*ong 133

如果您安装了最新的软件和库,则调试非常简单:

在此输入图像描述

从截图中可以看到,只需单击"debug test"并进行调试即可!

  • 你如何进行debgu和/或运行所有测试? (4认同)
  • @ gerrard00我不知道如何调试所有测试.要运行所有测试,`dotnet test`. (4认同)
  • 只是在测试项目的project.json中添加它,您可能希望将其添加到buildOptions部分."debugType":"便携式".这将解决"为此文档加载无符号"的问题 (4认同)
  • 我真的希望这也适用于VSCode中的F#.:'( (3认同)
  • 在将我的项目作为解决方案的一部分并将测试项目添加到解决方案(在 Linux 上,fwiw)之前,我无法看到“运行/调试测试”选项。https://github.com/OmniSharp/omnisharp-vscode/issues/3753#issuecomment-624176681 (3认同)
  • @RyanWalls坦率地说我不知道​​.我担心在VSCode中还没有非常无缝的NUnit集成.这就是我学习xUnit的原因. (2认同)
  • 我对“csproj”不起作用。根据微软官方页面:“在 .NET Core 工具的开发过程中,进行了一项重要的设计更改,不再支持 project.json 文件,而是将 .NET Core 项目移动到 MSBuild/csproj 格式。” (2认同)
  • VSCode 的 Linux 版本有什么区别。我有最新的 deb 和最新版本的 C# 扩展,但仍然没有出现调试按钮。 (2认同)

Nic*_*sta 13

请参阅Tyler Long的回答.最新版本的Visual Studio Code中不需要以下步骤:)


我做了一个存储库来演示.

首先,我可以让调试器进入测试的唯一方法是添加一个文件,Program.cs,控制xUnit的入口点,并手动添加代码进行测试.这并不理想,但我想你不会经常这样做,并且很容易将它恢复正常.

Program.cs中:

using System;
namespace XUnitDebugging
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var test = new TestClass();
            test.PassingTest();
            Console.WriteLine("Enter text...");
            Console.ReadLine();

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,在project.json中添加以下内容:

  "buildOptions": {
    "emitEntryPoint": true,
    "debugType": "portable"
  },
Run Code Online (Sandbox Code Playgroud)

project.json:

{
  "version": "1.0.0-*",
  "testRunner": "xunit",
  "buildOptions": {
    "emitEntryPoint": true,
    "debugType": "portable"
  },
  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0"
    },
    "xunit": "2.2.0-beta2-build3300",
    "dotnet-test-xunit": "2.2.0-preview2-build1029"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将允许您调试xUnit单元测试项目.

  • 我会接受这个答案,因为在我发布问题时它是正确的 - 在VSCode 1.2中确实没有完善的调试单元测试方法. (3认同)
  • 这个对我有用.顺便说一下,你不需要评论/取消注释`"testRunner":"xunit"`它就可以了. (2认同)

Bra*_*olt 12

我能够使用以下复杂的启动配置在整个xUnit项目上运行调试器.我检查了调用"调试测试"链接(在上面的@Tyler Long响应中)正在通过C#(Omnisharp)VS Code扩展来解决这个问题.注意事项:1)您必须提供dotnet程序的绝对路径2)您必须在下面的示例中提供绝对路径(即您不能使用~/$HOME/)到.nuget/packages文件夹3),我的测试项目的名称命名空间是Tests.一旦你有这个启动配置,你可以放置断点,使用这个配置启动调试器,它应该击中所有断点.

{
  "name": "Debug xunit tests",
  "type": "coreclr",
  "request": "launch",
  "preLaunchTask": "build",
  "program": "/usr/local/share/dotnet/dotnet",
  "args": [
    "exec",
    "--runtimeconfig",
    "${workspaceRoot}/AppNameHere/bin/Debug/netcoreapp1.0/AppNameHere.runtimeconfig.json",
    "--depsfile",
    "${workspaceRoot}/AppNameHere/bin/Debug/netcoreapp1.0/AppNameHere.deps.json",
    "--additionalprobingpath",
    "/Users/jdoe/.nuget/packages",
    "/Users/jdoe/.nuget/packages/dotnet-test-xunit/1.0.0-rc2-build10015/lib/netcoreapp1.0/dotnet-test-xunit.dll",
    "${workspaceRoot}/AppNameHere/bin/Debug/netcoreapp1.0/AppNameHere.dll",
    "-namespace",
    "Tests"
  ],
  "cwd": "${workspaceRoot}",
  "stopAtEntry": false
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这很棒!我做的一件小事就是让它更容易与同事分享,就是在工作区的根目录中添加一个符号链接到.nuget目录:`ln -s~/.nuget`,然后改变`/用户/ jdoe`到`$ {workspaceRoot}` - 这不是理想的,但它是一次性的设置.(另外,记得在你的VCS配置中忽略`.nuget /`!!) (3认同)

小智 10

Tyler单击debug test代码镜头图标的答案是调试单个测试的最简单方法.

测试所有单元测试的方法是while(!Debugger.IsAttached) Thread.Sleep(500);在测试中添加.这将使测试等到您附加调试器.

using System;
using System.Diagnostics;
using System.Threading;
using NUnit.Framework;

namespace SomeNamespace
{
    [TestFixture]
    public class SomeClassTests
    {
        [Test]
        public void ShouldDoTest()
        {
            while(!Debugger.IsAttached) Thread.Sleep(500);
            Assert.That(true, Is.True);
        }

        [Test]
        public void ShouldDoTest2()
        {
            while(!Debugger.IsAttached) Thread.Sleep(500);
            Assert.That(true, Is.True);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,这允许您将Visual Studio代码调试器附加到正在运行的testhost.dll.简单选择.NET Core Attach然后dotnet testhost.dll.

调试.NET Core Attach