¿Cómo ejecuto NUnit en modo de depuración desde Visual Studio?

120

Recientemente he estado creando un marco de prueba para un poco de C # en el que he estado trabajando. He configurado NUnit y un nuevo proyecto dentro de mi espacio de trabajo para probar el componente. Todo funciona bien si cargo mis pruebas unitarias desde Nunit (v2.4), pero he llegado al punto en el que sería realmente útil ejecutarlo en modo de depuración y establecer algunos puntos de interrupción.

Probé las sugerencias de varias guías que sugieren cambiar las propiedades de 'Depuración' del proyecto de prueba:

Start external program: C:\Program Files\NUnit 2.4.8\bin\nunit-console.exe
Command line arguments: /assembly: <full-path-to-solution>\TestDSP\bin\Debug\TestDSP.dll

Estoy usando la versión de consola allí, pero también he intentado llamar a la GUI. Ambos me dan el mismo error cuando intento comenzar a depurar:

Cannot start test project 'TestDSP' because the project does not contain any tests.

¿Es esto porque normalmente cargo \ DSP.nunit en la GUI de Nunit y ahí es donde se llevan a cabo las pruebas?

Estoy empezando a pensar que el problema puede ser que VS quiere ejecutar su propio marco de prueba y por eso no puede encontrar las pruebas NUnit.

Editar : Para aquellos que preguntan sobre accesorios de prueba, uno de mis archivos .cs en el proyecto TestDSP se ve más o menos así:

namespace Some.TestNamespace
{
    // Testing framework includes
    using NUnit.Framework;

    [TestFixture]
    public class FirFilterTest
    {
        [Test]
        public void Test01_ConstructorTest()
        {
            ...some tests...
        }
    }
}

... Soy bastante nuevo en C # y el marco de prueba NUnit, por lo que es muy posible que me haya perdido información crucial ;-)

Solución final : El gran problema fue el proyecto que usé. Si elige Other Languages -> Visual C# -> Test -> Test Project... cuando elija el tipo de proyecto, Visual Studio intentará usar su propio marco de prueba, por lo que yo sé. Debería elegir un proyecto de biblioteca de clase C # normal en su lugar y luego las instrucciones en mi respuesta seleccionada funcionarán.

Jon Cage
fuente
Su clase de dispositivo de prueba me parece bien, por lo que debe ser algo en el proyecto como lo sugirió.
Patrick McDonald
2
Mira como esta pregunta: stackoverflow.com/questions/247900/… La respuesta es la misma ...
Patrick Desjardins

Respuestas:

46

Utilizo la misma técnica que estás probando Jon, sin el indicador / assembly, es decir

Start External Program: C:\Program Files\NUnit 2.4.8\bin\nunit.exe

Command line arguments: "<path>\bin\Debug\Quotes.Domain.Tests.dll"

¿TestDSP.dll contiene todos sus TestFixtures?

Como mi proyecto de prueba no es el proyecto de inicio de la solución, ejecuto mis pruebas haciendo clic con el botón derecho en el proyecto de prueba y seleccionando Depurar -> Iniciar nueva instancia

Patrick McDonald
fuente
1
Probé lo que sugirió (eliminar el ensamblaje /) pero no hace ninguna diferencia. Cuando comienzo una nueva instancia, produce el error. Creo que tiene que ver principalmente con el hecho de que cuando creé el proyecto TestDSP lo creé a partir de la plantilla de proyecto de prueba de VisualStudio incorporada, por lo que está buscando el marco de prueba incorrecto.
Jon Cage
3
Finalmente lo hice funcionar. Tenía razón en tanto que eran las opciones del proyecto las que lo detenían: volver a crear el proyecto de prueba utilizando la plantilla de clase estándar solucionó el problema.
Jon Cage
1
Ayuda si también agrega /runa su * línea de comandos argumentos que automáticamente comenzarán a ejecutar pruebas ... También lo he resumido todo (usando imágenes) en mi publicación de blog .
Robert Koritnik
6
En caso de que la gente no consulte la publicación de blog (muy útil) de Robert ( erraticdev.blogspot.com/2012/01/… ): para .NET 4.0 y posterior, creo que también debe agregar esto a nunit.exe.config : <startup> <supportedRuntime version = "4.0" /> </startup>.
devuxer
3
Seguimiento: en versiones posteriores de NUnit (la última versión a partir de hoy es v2.6.1), debe comentar <supportedRuntime version="v2.0.50727" />en nunit.exe.config.
devuxer
102

Cuando necesito depurar mis pruebas de NUnit, simplemente lo adjunto a la aplicación GUI de NUnit nunit-agent.exeusando "Debug | Attach to Process" y ejecuto las pruebas desde la GUI. Se alcanza cualquier punto de interrupción en mis pruebas (o el código que están probando). ¿Estoy entendiendo mal su pregunta o funcionará para usted?

Matt Hamilton
fuente
7
Para su información (y la de otros): Debug | Attach no está disponible en las ediciones Express de VS.
Richard
15
Tenga en cuenta que debe seleccionar "Habilitar compatibilidad con Visual Studio" en el cuadro de diálogo Configuración de NUnit -> Compatibilidad con IDE
Julio García
8
Para .NET 4.0 y posterior, creo que también hay que añadir esto a nunit.exe.config: <startup> <supportedRuntime version="4.0" /> </startup>.
devuxer
1
Este es un atajo rápido para adjuntar al proceso correcto (ejecutar en la Consola del Administrador de paquetes): ($ dte.Debugger.LocalProcesses |? {$ _. Name.EndsWith ("nunit-agent.exe")}). Attach ()
Bart
7
Para su información: debe adjuntar la depuración al proceso llamado "nunit-agent.exe" y NO "nunit.exe". De lo contrario, sus puntos de interrupción se ignoran y se pregunta por qué ...
Jenny O'Reilly
21

Simplemente elimine la línea que parece

<ProjectTypeGuids>
    {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>

de su archivo de proyecto. Básicamente, esta línea le dice a VS.Net que es un proyecto de prueba, por lo tanto, "No se puede iniciar el proyecto de prueba". Para su información, aquí el primer Guid dice "es una prueba", el segundo dice "es C #". Para obtener información sobre esas Guías: http://www.mztools.com/Articles/2008/MZ2008017.aspx

usuario276648
fuente
18

Además de la respuesta proporcionada por @Justin, aquí hay algunos detalles más para NUnit 2.6.

Usando NUnit 2.6 adjúntelo a nunit.exe o nunit-console.exe y NO al agente. La configuración señalada por @Justin es ligeramente diferente. A continuación se muestra un ejemplo de nunit.exe.config (lo mismo para nunit-console.exe.config).

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

Para el proyecto de prueba .NET 4, para obtener puntos de interrupción, tendrá que comentar o eliminar la línea v2.0 como sugiere el comentario. Una vez que hice eso, pude depurar el proyecto de prueba .NET 4.0.

dblood
fuente
Tuve éxito solo con la v2.0.50727línea al depurar ensamblajes .NET 2 de VS2005 con nunit. (La v4línea impidió que el depurador de VS 2005 se adjuntara.)
Martin Ba
17

Si está usando NUnit 2.4 o más reciente, puede poner el siguiente código en su SetUpFixtureclase. (Puede hacer esto con versiones anteriores, pero deberá hacer cualquier equivalente que tenga SetUpFixture, o copiarlo en la prueba).

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

Lo que Debugger.Launch()hace es que aparezca el siguiente cuadro de diálogo al hacer clic en Ejecutar dentro de NUnit.

Diálogo del depurador JIT

Luego, elija su instancia en ejecución de Visual Studio con su proyecto abierto (el segundo en mi captura de pantalla), luego se adjuntará el depurador y los puntos de interrupción o excepciones se mostrarán en Visual Studio.

Scott Chamberlain
fuente
12

En Nunit 3.0.1 (estoy usando VS2013), abra desde el menú principal> Prueba> Windows> Explorador de pruebas. Luego, en "Explorador de prueba", haga clic con el botón derecho en el caso de prueba, es posible que vea: ingrese la descripción de la imagen aquí

Espero que esto ayude.

Quinn
fuente
2
Gracias por esta respuesta. Mucho más simple que todos los demás.
dano
Estoy usando NUnit 2.5.9 en VS 2015 y funcionó con una extensión VS llamada 'Adaptador de prueba NUnit 2'. Puede ejecutar la prueba en la ventana Explorador de pruebas.
mggSoft
6

Instale TestDriven.NET , que es un complemento para Visual Studio

Desde allí, puede hacer clic derecho en el ensamblaje de prueba de su unidad y hacer clic en Ejecutar pruebas para ejecutar todo el conjunto, hacer clic derecho en una clase TestFixture para ejecutar solo las pruebas en esa clase, o hacer clic derecho en un método de prueba para ejecutar solo ese método.

También tiene la opción de probar con depurador, si necesita interrumpir sus pruebas en modo de depuración.

Jon Limjap
fuente
2
$ 170 es ridículamente caro para una herramienta de este tipo. ¿Alguien quiere exagerar los precios?
Ben Hardy
Si. Por esa cantidad de dinero, prefiero invertir en JetBrains Resharper, que luego ofrece Test Runner de forma gratuita con integración de depuración y un montón de otras características de productividad.
Roman
Con Visual Studio 2012 puede obtener NUnit Test Runner con Nuget de forma gratuita.
Jon Limjap
6

Pruebe NUnitit, un complemento de Visual Studio de código abierto para depurar casos de prueba de NUnit

Página de inicio - http://nunitit.codeplex.com/

abhilash
fuente
Eso es bastante bueno, aunque no puedo encontrar una manera de decirle que ejecute una sola prueba (?)
Jon Cage
5

Elimine ProjectTypeGuids del archivo de proyecto.

Steve
fuente
+1 vea también esta publicación
Felice Pollano
3

Ahora con fotos:

  1. Ejecute NUnit gui ( descargue 2.6.2 desde aquí ) y luego vaya aFile -> Open Project

ingrese la descripción de la imagen aquí

  1. Seleccione su prueba .dllde la carpeta bin ( C:\......\[SolutionFolder][ProjectFolder]\bin\Debug\xxxxTests.dll)

  2. Vaya a Visual Studio Debug -> Attach to process(se abrirá la ventana Adjuntar al proceso)

  3. En la lista, desplácese hacia abajo y seleccione y nunit-agent.exeluego haga clic enAttach

ingrese la descripción de la imagen aquí

  1. En este punto, los puntos de interrupción en sus pruebas deberían volverse rojos maduros (desde huecos).

  2. Haga clic Runen Nunit Guiy debería obtener su punto de interrupción ...

Espero que esto te ahorre algo de tiempo.

Matas Vaitkevicius
fuente
2

Si puede hacer que la consola o la GUI funcionen, pero sus puntos de interrupción no se ven afectados, es posible que su aplicación esté ejecutando un tiempo de ejecución de .NET diferente al de NUnit. Verifique si su nunit-console.exe.config / nunit.exe.config tiene el tiempo de ejecución especificado (las configuraciones se encuentran en el mismo directorio que los ejecutables de nunit). Especifique el tiempo de ejecución usando el nodo de inicio:

<configuration>
    <startup>
       <supportedRuntime version="4.0" />
    </startup>
Justin Turner
fuente
2

Si la ruta del proyecto contiene espacios, por ejemplo, "Nuevo proyecto" en la ruta <path>\bin\Debug\New Project\Quotes.Domain.Tests.dll, escriba la opción Inicio -> Argumentos de la línea de comandos entre comillas dobles.

Pasé mucho tiempo para resolver esto.

Gyan Sada
fuente
1

Respecto a lo que dijo el Sr. Patrick McDonald

Como mi proyecto de prueba no es el proyecto de inicio de la solución, ejecuto mis pruebas haciendo clic con el botón derecho en el proyecto de prueba y seleccionando Depurar -> Iniciar nueva instancia

Intenté solicitar mi biblioteca de clases de prueba pero obtuve un error con respecto a la ruta, así que intenté eliminar los 'Argumentos de la línea de comandos', y afortunadamente funcionó bien y como se esperaba.

Abdul Rahman Kayali
fuente
0

Parece que está intentando utilizar la biblioteca incorrecta. NUnit solo puede iniciarse si la dll que está utilizando contiene TestFixtures.

+1 en TestDriven.Net. He tenido la oportunidad de usarlo varias veces. Puede descargar la versión personal con fines de evaluación de acuerdo con la licencia en http://testdriven.net/purchase_licenses.aspx .

Mike737
fuente
Vea la edición reciente: tengo un dispositivo de prueba, aunque es muy posible que no lo haya configurado correctamente.
Jon Cage
0

Recibí el mismo error con MSTest. Descubrí que en la ventana Salida de prueba , algunas de las pruebas tenían ID duplicados y no se podían cargar. Eliminé todas las pruebas duplicadas y ahora pude ejecutar las pruebas cuando inicio el proyecto.

Vijay
fuente
0

También hay una extensión ahora "Visual NUnit" que le permitirá ejecutar las pruebas desde dentro de Visual Studio de manera muy similar a la compilación en los identificadores del marco de prueba. Compruébalo en el administrador de extensiones.

iamkrillin
fuente
0

Abra Visual Studio ---> su proyecto ---> Seleccione 'Propiedades' ---> Seleccione 'Depurar' -> Seleccione 'Iniciar programa externo' y establezca la ruta de su NUnit allí (por ejemplo: Iniciar programa externo = C : \ Archivos de programa \ NUnit 2.6.2 \ bin \ nunit.exe) ----> Guardar

Después de configurar esto, simplemente haga clic en Depurar

Farija Khan
fuente
0

Para mí, la solución fue adaptar el archivo de configuración de nunit. Para usar nunit con 4.5-.Net framework y la opción de compilación x64, tuve que agregar una línea a la etiqueta de inicio (versión en tiempo de ejecución compatible).

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

Luego, podría comenzar haciendo clic con el botón derecho en Testproject Debug -> Start new instance. Antes, necesitaba volver a adjuntar manualmente el proyecto al proceso.

Mis propiedades de depuración fueron, C: \ Archivos de programa (x86) \ NUnit 2.6.4 \ bin \ nunit.exe con el argumento de la ubicación del .dll a probar.

Más información: nunit para probar con .NET 4.0

HauiB
fuente
-1

Vea si esto ayuda ... Cómo agregar NUnit en Visual Studio

(RighteousRant) Aunque personalmente no me gusta este enfoque ... Si necesita un depurador mientras está probando su código, es un "olor" ya que no tiene suficiente confianza / no sabe cómo funciona su código y necesita el depurador para decirte eso. TDD debería liberarlo de la necesidad de un depurador si se hace correctamente. Use 'Adjuntar depurador a NUNit' solo en casos excepcionales o cuando esté ingresando el código de otra persona.

Gishu
fuente
Probé las sugerencias allí sin éxito. Claramente tienes buen olfato. Sé que mi código no funciona porque el resultado que obtengo para el primer bloque de implementación está obteniendo respuestas muy diferentes a mi referencia de prueba. Así que ahora estoy tratando de profundizar más para encontrar la causa del problema. Prefiero hacerlo de forma aislada al resto del programa (de ahí la necesidad de ejecutar pruebas unitarias en modo de depuración). Para el registro, este es el código que otra persona escribió y que se convirtió a partir del algoritmo de otra persona: - /
Jon Cage
Así que eso cae en la última cláusula de mi última línea :) Es extraño que no puedas hacer que funcione ... lástima. Yo diría que simplemente adjuntar al proceso (Alt + D + P) sin insistir en ello ..
Gishu
No hay olor aquí: tengo un caso de prueba que falla en ciertos entornos (se devuelve un resultado muy incorrecto) y necesito averiguar por qué. Para hacer eso, quiero depurarlo y averiguar dónde está fallando en este entorno para poder corregir el código y hacer que la prueba pase en todas partes. Esto parece algo estándar de tipo rojo / verde ...
BrainSlugs83
@ BrainSlugs83 - mucho tiempo desde que escribí esto. Estoy (todavía) en contra de la depuración de sus pruebas como práctica de trabajo principal. Casos de borde: estoy de acuerdo con pasar al depurador. Incluso entonces probablemente inserte stmts de registro primero ... Creo que se debe al hecho de que he observado a demasiadas personas que usan un ciclo Code-Crash-Debug-Adjust que se simplifica al ciclo Code-Crash-Adjust con el depurador continuamente encendido.
Gishu