Depuración de pruebas xUnit in.NET Código Core y Visual Studio


Estoy en un Mac, ejecutando.NET Core 1.0 y Visual Studio Code.

Tengo un proyecto de consola y un proyecto de prueba. Tengo puesta en marcha.json para que pueda depurar el proyecto de consola.

¿Cómo puedo configurar una configuración de lanzamiento que inicie mis pruebas unitarias y adjunte el depurador?

Author: Peter Mortensen, 2016-07-01

4 answers

Ver La respuesta de Tyler Long. Los pasos a continuación no son necesarios en las versiones más recientes de Visual Studio Code:)


Hice un repositorio para demostrar.

En primer lugar, la única manera que podía conseguir que el depurador para golpear la prueba era añadir un archivo, Programa.cs, tomar el control del punto de entrada de xUnit, y añadir manualmente el código a la prueba. No es ideal, pero me imagino que no vas a hacer esto muy a menudo, y es fácil volver a darle la vuelta normal.

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

        }
    }
}

Siguiente, en el proyecto.json añádase lo siguiente:

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

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

Esto le permitirá depurar un proyecto de prueba de unidad xUnit.

 10
Author: Nick Acosta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 11:42:19

Si instala el software y la biblioteca más recientes, es súper fácil de depurar:

introduzca la descripción de la imagen aquí

Como puede ver en la captura de pantalla, simplemente haga clic en "debug test" y depure!

 87
Author: Tyler Long,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-14 11:10:20

Pude ejecutar el depurador en todo un proyecto xUnit con la siguiente complicada configuración de lanzamiento. Inspeccioné las llamadas que el enlace "debug test" (en la respuesta larga de @Tyler arriba) estaba haciendo a través de la extensión C# (Omnisharp) VS Code para averiguar esto. Cosas a tener en cuenta: 1) debe proporcionar la ruta absolute al programa dotnet 2) debe proporcionar la ruta absolute (es decir, no puede usar ~/ o $HOME/) para .nuget / packages folders 3) en el ejemplo a continuación, el nombre del espacio de nombres de mi proyecto de prueba es Tests. Una vez que tenga esta configuración de lanzamiento en su lugar, puede colocar puntos de interrupción, iniciar el depurador usando esta configuración y debería golpear todos los puntos de interrupción.

{
  "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
Author: Brady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-18 18:48:27

La respuesta de Tyler de hacer clic en los iconos de lente de código debug test es la forma más fácil de depurar una sola prueba.

Una forma de probar todas las pruebas unitarias sería agregar while(!Debugger.IsAttached) Thread.Sleep(500); dentro de las pruebas. Esto hará que las pruebas esperen hasta que adjunte un depurador.

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

Esto le permite adjuntar el depurador de código de Visual Studio al testhost en ejecución.DLL. Simplemente seleccione .NET Core Attach y luego el dotnet testhost.dll.

Debug. NET Core Attach

 9
Author: PiTrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 11:44:56