web-dev-qa-db-fra.com

Débogage des tests xUnit dans le code .NET Core et Visual Studio

Je suis sur un Mac, exécutant .NET Core 1.0 et Visual Studio Code.

J'ai un projet de console et un projet de test. J'ai configuré launch.json pour pouvoir déboguer le projet de console.

Comment configurer une configuration de lancement qui lance mes tests unitaires et attache le débogueur?

39
driis

Voir réponse de Tyler Long . Les étapes ci-dessous ne sont pas nécessaires dans les dernières versions de Visual Studio Code :)


J'ai fait n référentiel pour démontrer.

Tout d’abord, la seule façon de faire en sorte que le débogueur passe au test consiste à ajouter un fichier, Program.cs, à prendre le contrôle du point d’entrée à partir de xUnit et à ajouter manuellement le code à tester. Ce n'est pas idéal, mais j'imagine que vous n'allez pas le faire très souvent, et il est facile de revenir à la normale.

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();

        }
    }
}

Ensuite, dans project.json, ajoutez ce qui suit:

  "buildOptions": {
    "emitEntryPoint": true,
    "debugType": "portable"
  },

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"
        }
      }
    }
  }
}

Cela vous permettra de déboguer un projet de test unitaire xUnit.

13
Nick Acosta

Si vous installez la dernière version du logiciel et de la bibliothèque, il est très facile de déboguer:

enter image description here

Comme vous pouvez le voir sur la capture d'écran, cliquez simplement sur "test de débogage" et déboguez-le!

130
Tyler Long

J'ai pu exécuter le débogueur sur un projet xUnit entier avec la configuration de lancement compliquée suivante (- === -). J'ai inspecté les appels passés par le lien "test de débogage" (dans la réponse @Tyler Long ci-dessus) via C # (Omnisharp) extension de code VS pour le comprendre. Choses à noter: 1) vous devez fournir le chemin absolu du programme dotnet 2) vous devez fournir le absolu chemin (vous ne pouvez pas utiliser ~/ ou $HOME/) dans les dossiers .nuget/packages 3) dans l'exemple ci-dessous, le nom de l'espace de noms de mon projet test est Tests. Une fois que cette configuration de lancement est en place, vous pouvez placer des points d'arrêt, lancer le débogueur à l'aide de cette configuration, qui devrait atteindre tous les points d'arrêt.

{
  "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
}
12
Brady Holt

La réponse de Tyler cliquer sur les icônes de lentille de code debug test Est le moyen le plus simple de déboguer un seul test.

Une façon de tester tous les tests unitaires serait d’ajouter while(!Debugger.IsAttached) Thread.Sleep(500); à l’intérieur des tests. Cela fera attendre les tests jusqu'à ce que vous attachez un débogueur.

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);
        }
    }
}

Cela vous permet ensuite d'attacher le débogueur de code Visual Studio au testhost.dll en cours d'exécution. Sélectionnez simplement .NET Core Attach Puis le dotnet testhost.dll.

Debug .NET Core Attach

10
PiTrick