¿Puedo escribir en la consola en una prueba unitaria? En caso afirmativo, ¿por qué no se abre la ventana de la consola?

148

Tengo un proyecto de prueba en Visual Studio. Yo uso Microsoft.VisualStudio.TestTools.UnitTesting .

Agrego esta línea en una de mis pruebas unitarias:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Cuando ejecuto la prueba, la prueba pasa, pero la ventana de la consola no se abre en absoluto.

¿Hay alguna manera de hacer que la ventana de la consola esté disponible para interactuar a través de una prueba unitaria?

lápiz de pastel
fuente
1
Realmente depende del corredor. Puede usar TestDriven.Net (un excelente, gratuito para uso personal, corredor de prueba) - Console.WriteLine escribirá en el panel de salida VS.
2012
1
Gracias por
correr la voz
NCrunch también tiene esta característica, que solo hace que valga la pena el precio IMO. Tengo un Dumpmétodo de extensión que genera el contenido del objeto en la consola, lo que hace que las cosas sean mucho más fáciles de depurar. i.imgur.com/MEZwy7X.png
DharmaTurtle

Respuestas:

125

NOTA: La respuesta original a continuación debería funcionar para cualquier versión de Visual Studio hasta Visual Studio 2012. Visual Studio 2013 ya no parece tener una ventana de Resultados de prueba. En cambio, si necesita resultados específicos de la prueba, puede usar la sugerencia de @ Stretch de Trace.Write()escribir resultados en la ventana Resultados.


El Console.Writemétodo no escribe en la "consola": escribe en lo que esté conectado al controlador de salida estándar para el proceso en ejecución. Del mismo modo, Console.Readlee la entrada de lo que esté conectado a la entrada estándar.

Cuando ejecuta una prueba unitaria a través de Visual Studio 2010, el arnés de prueba redirige la salida estándar y se almacena como parte de la salida de prueba. Puede ver esto haciendo clic con el botón derecho en la ventana Resultados de la prueba y agregando la columna denominada "Salida (StdOut)" a la pantalla. Esto mostrará todo lo que se escribió en la salida estándar.

Usted podría abrir manualmente una ventana de la consola, utilizando P / Invoke como dice sinni800 . Al leer la AllocConsoledocumentación, parece que la función se restablecerá stdiny se stdoutmanejará para apuntar a la nueva ventana de la consola. (No estoy 100% seguro de eso; me parece un poco incorrecto si ya he redirigido stdoutpara que Windows me lo robe, pero no lo he intentado).

En general, sin embargo, creo que es una mala idea; si todo lo que desea usar para la consola es volcar más información sobre la prueba de su unidad, la salida está ahí para usted. Siga utilizando Console.WriteLinela forma en que está y compruebe los resultados de salida en la ventana Resultados de la prueba cuando haya terminado.

Michael Edenfield
fuente
Intente abrir una nueva aplicación de Windows, utilizando AllocConsole para asignar una consola y escribirá allí. No sé lo que realmente hace, pero podría no funcionar en un entorno de Prueba de Unidad. Realmente sería bueno saber ...
sinni800
hrm. volviendo a leer la AllocConsoledocumentación, puede que sea incorrecta, pero tendría que probarla.
Michael Edenfield
2
Para mí, este comentario de Michael dijo todo lo que necesitaba pensar: "Cuando ejecuta una prueba unitaria a través de VS2010, el arnés de prueba redirige la salida estándar y se almacena como parte de la salida de prueba".
Robert Patterson el
55
en VS2013, si escribe en la Consola, habrá una etiqueta de enlace [Salida] en TestExplorer / Test / Summary. Haga clic en él y obtendrá el resultado deseado. ¿Espere? También quieres llamar a Console.ReadLine () ??
Visar
3
En V2017 (Comunidad), vaya a "explorador de prueba", seleccione el elemento del resultado de la prueba en la lista, luego haga clic en el enlace "salida" en la otra ventana (¿ventana de resultados de la prueba?). Como probablemente se truncará, use la opción "copiar todo" y pasar a otro lugar.
heringer
180

Alguien comentó sobre esta funcionalidad aparentemente nueva en Visual Studio 2013. No estaba seguro de lo que quería decir al principio, pero ahora que lo hago, creo que merece su propia respuesta.

Podemos usar Console.WriteLine normalmente y la salida se muestra, no solo en la ventana Salida, sino en una nueva ventana después de hacer clic en "Salida" en los detalles de la prueba.

Ingrese la descripción de la imagen aquí

Tiago Duarte
fuente
2
Excelente solucion. Confirme que funciona en VS2015 Enterprise.
garfbradaz
66
Desafortunadamente, uno no puede seleccionar ningún texto en esa área de salida para copiar y pegar :( ¡¿Qué estaban pensando ?!
O Mapper
3
@ORMapper, haga clic con el botón derecho en el área "Salida estándar" y elija copiar todo
tal vez el
2
@ Ovi-WanKenobi intenta generar algo con Console.Write
Tiago Duarte
55
En vs 2017, debe seleccionar CADA prueba que se ejecuta, luego hacer clic en la salida, lo que no es muy útil cuando tiene muchas pruebas. Quiero ver todos los resultados juntos, no en ventanas separadas.
inliner49er
37

Puede usar esta línea para escribir en la ventana de salida de Visual Studio:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Debe ejecutarse en modo de depuración.

Dmitry Pavlov
fuente
77
No escribe en mi VS
Luis Filipe
1
revise este hilo para más detalles - stackoverflow.com/questions/1159755/…
Dmitry Pavlov
1
Esto funcionó muy bien para mí usando MSTest y R # para ver la salida. ¡Gracias!
Isaac Baker,
2
@William se muestra si depura una prueba, pero no si simplemente la ejecuta sin depurar.
yoyo
29

Como se indicó, las pruebas unitarias están diseñadas para ejecutarse sin interacción.

Sin embargo, puede depurar pruebas unitarias, como cualquier otro código. La forma más fácil es usar el Debugbotón en la pestaña Resultados de la prueba.

Poder depurar significa poder usar puntos de interrupción. Ser capaz de usar puntos de interrupción, entonces, significa poder usar Tracepoints , lo que encuentro extremadamente útil en la depuración diaria.

Esencialmente, los puntos de seguimiento le permiten escribir en la ventana Salida (o, más exactamente, en la salida estándar). Opcionalmente, puede continuar ejecutándose o puede detenerse como un punto de interrupción normal. Esto le brinda la "funcionalidad" que está solicitando, sin la necesidad de reconstruir su código o llenarlo con información de depuración.

Simplemente agregue un punto de interrupción y luego haga clic derecho en ese punto de interrupción. Seleccione la opción "Cuando se golpea ...":

Al presionar la opción

Lo que abre el diálogo:

Cuando se alcanza un punto de interrupción

Algunas cosas a tener en cuenta:

  1. Observe que el punto de ruptura ahora se muestra como un diamante, en lugar de una esfera, lo que indica un punto de rastreo
  2. Puede generar el valor de una variable encerrándola como {this}.
  3. Desmarque la casilla de verificación "Continuar ejecución" para que el código se rompa en esta línea, como cualquier punto de interrupción normal
  4. Tienes la opción de ejecutar una macro. Tenga cuidado: puede causar efectos secundarios nocivos.

Consulte la documentación para más detalles.

Wonko el cuerdo
fuente
24

Hay varias formas de escribir la salida de una prueba de unidad de Visual Studio en C #:

  • Console.Write: el arnés de prueba de Visual Studio capturará esto y lo mostrará cuando seleccione la prueba en el Explorador de pruebas y haga clic en el enlace Salida. hace no mostrará en la ventana de resultados de Visual Studio cuando se ejecuta o la depuración de una prueba unitaria o bien (podría decirse que este es un error).
  • Debug.Write: el arnés de prueba de Visual Studio capturará esto y lo mostrará en la salida de prueba. Hace aparece en la ventana de resultados de Visual Studio cuando se depura una prueba de unidad, a menos que las opciones de depuración de Visual Studio están configurados para salida de redirección a la ventana Inmediato. No aparecerá nada en la ventana Salida (o Inmediato) si simplemente ejecuta la prueba sin depurar. De forma predeterminada, solo está disponible en una compilación de depuración (es decir, cuando se define la constante DEBUG).
  • Trace.Write: el arnés de prueba de Visual Studio capturará esto y lo mostrará en la salida de prueba. No aparece en la ventana de resultados de Visual Studio (o inmediata) al depurar una prueba de unidad (pero no cuando simplemente correr la prueba sin depurar). De forma predeterminada, está disponible en las versiones de depuración y lanzamiento (es decir, cuando se define la constante TRACE).

Confirmado en Visual Studio 2013 Professional.

yoyó
fuente
1
Tenga en cuenta que las reglas son ligeramente diferentes si usa NUnit y la extensión del Adaptador de prueba NUnit para Visual Studio en lugar del marco de prueba incorporado de Microsoft.
yoyo
9

Puedes usar

Trace.WriteLine()

escribir en la ventana Salida al depurar una prueba unitaria.

Sturla
fuente
5

En Visual Studio 2017, "TestContext" no muestra el enlace de salida en Test Explorer.

Sin embargo, Trace.Writeline () muestra el enlace Salida.

naz hassan
fuente
Solo un FYI, es Trace.WriteLine
TroySteven
4

En primer lugar , se supone que , por diseño , las pruebas unitarias se ejecutan completamente sin interacción.

Con eso a un lado, no creo que haya una posibilidad que se haya pensado.

Podría intentar hackear con AllocConsole P / Invoke, que abrirá una consola incluso cuando su aplicación actual sea una aplicación GUI. La Consoleclase luego publicará en la consola ahora abierta.

sinni800
fuente
1
Hmm .. Mi motivo principal es escribir algunos datos adicionales en la consola para ver algunos detalles más profundos. Será una cosa ad hoc que quizás no necesite más tarde.
pencilCake
3

Debug.WriteLine () también se puede usar.

Jackie
fuente
1
o Debug.Print ()
Mohamed Selim
2

En mi humilde opinión, los mensajes de salida son relevantes solo para casos de prueba fallidos en la mayoría de los casos. Creé el siguiente formato, y tú también puedes hacer el tuyo. Esto se muestra en la ventana del Visual Studio Test Explorer.

¿Cómo podemos lanzar este mensaje en la ventana de Visual Studio Test Explorer?

Un código de muestra como este debería funcionar:

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Puede tener una clase separada dedicada a esto para usted.

DevCod
fuente
Me pareció que también agregaría esto. En Visual Studio 2019 con XUNIT puede hacer lo siguiente: Assert.True (éxito, "BORRAR REGISTRO FALLIDO"); ELIMINAR REGISTRO FALLIDO aparecerá en VS 2019 Test Explorer. Nuevamente, al igual que la respuesta anterior, esto solo funciona cuando la prueba de la unidad ha fallado la condición esperada.
TroySteven
1

Tengo una solución más fácil (que utilicé recientemente, por muchas razones flojas). Agregue este método a la clase en la que está trabajando:

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

Entonces ... abra el directorio AdHocConsole, y ordene por tiempo creado. Asegúrese de agregar sus "declaraciones de impresión". Sin embargo, son distintos, de lo contrario habrá malabares.

Juan
fuente
0

Visual Studio para Mac

Ninguna de las otras soluciones funcionó en Visual Studio para Mac

Si está utilizando NUnit , puede agregar un pequeño .NET proyecto de consola a su solución y luego hacer referencia al proyecto que desea probar en las referencias de ese nuevo proyecto de consola .

Lo que estaba haciendo en sus [Test()]métodos se puede hacer en la Mainaplicación de consola de esta manera:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

Usted es libre de usar Console.Writey Console.WriteLineen su código bajo estas circunstancias.

Arquitecto Swift
fuente