c# - unitarias - ¿Puedo escribir en la consola en una prueba unitaria? En caso afirmativo, ¿por qué la ventana de la consola no está abierta?
pruebas unitarias visual basic net (10)
Alguien comentó sobre esta funcionalidad aparentemente nueva en VS2013. No estaba seguro de lo que quería decir al principio, pero ahora que lo hago, creo que se merece su propia respuesta.
Podemos usar Console.WriteLine normalmente y la salida se muestra, pero no en la ventana de resultados, sino en una nueva ventana después de hacer clic en "Salida" en los detalles de la prueba.
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?
Como se dijo, las pruebas unitarias están diseñadas para funcionar sin interacción.
Sin embargo, puede depurar las pruebas unitarias, como cualquier otro código. La forma más fácil es usar el botón Depurar en la pestaña Resultados de la prueba.
Poder depurar significa poder usar puntos de interrupción. Poder usar puntos de ruptura, entonces, significa poder usar Tracepoints , que considero extremadamente útil en la depuración diaria.
Básicamente, los Tracepoints le permiten escribir en la ventana de Salida (o, más exactamente, en la salida estándar). Opcionalmente, puede seguir ejecutándose o puede detenerse como un punto de interrupción regular. 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 "Cuándo golpear ...":
Lo cual abre el diálogo:
Algunas cosas a tener en cuenta:
- Observe que el punto de interrupción ahora se muestra como un diamante, en lugar de una esfera, lo que indica un punto de rastreo
- Puede generar el valor de una variable encerrándola como {this}.
- Desmarque la casilla "Continuar ejecución" para que el código se rompa en esta línea, como cualquier punto de interrupción regular
- Usted tiene la opción de ejecutar una macro. Tenga cuidado: puede causar efectos secundarios nocivos.
Ver la documentación para más detalles.
Debug.WriteLine () también se puede usar.
En primer lugar, se supone que las pruebas unitarias se ejecutan completamente sin interacción.
Con eso aparte, no creo que haya una posibilidad en la que se pensó.
Podría intentar piratear con AllocConsole P / Invoke, que abrirá una consola incluso cuando su aplicación actual sea una aplicación GUI. La clase de la Console
se publicará en la consola ahora abierta.
En visual Studio 2017, "TestContext" no muestra el enlace Salida en Test Explorer. Sin embargo, Trace.Writeline () muestra el enlace Ouput.
Esto no es exactamente una solución, sino un enfoque del libro
arte de pruebas unitarias por Roy Osherove
necesitamos stubs para romper estas dependencias, como escribir en FileSystem o escribir en Event Log o Writing to Console -
Stub podría pasarse a Main Class y si stub no es nulo, escribir en Stub. Sin embargo, puede cambiar la API (como ahora el constructor tiene un stub como parámetro). El otro enfoque es heredar y crear un objeto simulado. que se describe a continuación.
namespace ClassLibrary1
{
// TO BE TESTED
public class MyBusinessClass
{
ConsoleStub myConsoleForTest;
public MyBusinessClass()
{
// Constructor
}
// This is test stub approach - 2
public MyBusinessClass(ConsoleStub console)
{
this.myConsoleForTest = console;
}
public virtual void MyBusinessMethod(string s)
{
// this needs to be unit tested
Console.WriteLine(s);
// Just an example - you need to be creative here
// there are many ways
if (myConsoleForTest !=null){
myConsoleForTest.WriteLine(s);
}
}
}
public class ConsoleStub
{
private string textToBeWrittenInConsole;
public string GetLastTextWrittenInConsole
{
get
{
return this.textToBeWrittenInConsole;
}
}
public void WriteLine(string text)
{
this.textToBeWrittenInConsole = text;
}
}
public class MyBusinessClassMock :MyBusinessClass
{
private ConsoleStub consoleStub;
public MyBusinessClassMock()
{
// Constructor
}
public MyBusinessClassMock(ConsoleStub stub)
{
this.consoleStub = stub;
}
public override void MyBusinessMethod(string s)
{
// if MOCK is not an option then pass this stub
// as property or parameter in constructor
// if you do not want to change the api still want
// to pass in main class then , make it protected and
// then inherit it and make just a property for consoleStub
base.MyBusinessMethod(s);
this.consoleStub.WriteLine(s);
}
}
[TestClass]
public class ConsoleTest
{
private ConsoleStub consoleStub;
private MyBusinessClassMock mybusinessObj
[TestInitialize]
public void Initialize()
{
consoleStub = new ConsoleStub();
mybusinessObj = new MyBusinessClassMock(consoleStub);
}
[TestMethod]
public void TestMyBusinessMethod()
{
mybusinessObj.MyBusinessMethod("hello world");
Assert.AreEqual(this.consoleStub.GetLastTextWrittenInConsole,"hello world" );
}
}
}
// Approach - 2
[TestClass]
public class ConsoleTest
{
private ConsoleStub consoleStub;
private MyBusinessClass mybusinessObj
[TestInitialize]
public void Initialize()
{
consoleStub = new ConsoleStub();
mybusinessObj = new MyBusinessClass(consoleStub);
}
[TestMethod]
public void TestMyBusinessMethod()
{
mybusinessObj.MyBusinessMethod("hello world");
Assert.AreEqual(this.consoleStub.GetLastTextWrittenInConsole,"hello world" );
}
}
Hay varias maneras de escribir el resultado 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 prueba y haga clic en el enlace de Salida. No se muestra en la ventana de resultados de Visual Studio cuando se ejecuta o se depura una prueba unitaria (podría decirse que es un error).
- Debug.Write: el arnés de prueba de Visual Studio capturará esto y lo mostrará en el resultado de la prueba. Aparece en la ventana de salida de Visual Studio al depurar una prueba de unidad, a menos que las opciones de depuración de Visual Studio estén configuradas para redirigir la salida a la ventana Inmediato. Nada aparecerá en la Ventana de Salida (o Inmediato) si simplemente ejecuta la prueba sin depuración. Por defecto, 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 el resultado de la prueba. Aparece en la ventana Salida de Visual Studio (o Inmediato) al depurar una prueba unitaria (pero no cuando simplemente se ejecuta la prueba sin depuración). Por defecto, está disponible tanto en compilaciones de Debug como de Release (es decir, cuando se define la constante TRACE).
Confirmado en Visual Studio 2013 Professional.
NOTA: La respuesta original a continuación debería funcionar para cualquier versión de VS hasta VS2012. VS2013 ya no parece tener una ventana de resultados de prueba. En cambio, si necesita un resultado específico para la prueba, puede usar la sugerencia de @ Stretch de Trace.Write()
para escribir la salida para escribir en la ventana de Salida.
El método Console.Write
no se escribe en la "consola": se escribe en lo que esté conectado al identificador de salida estándar para el proceso en ejecución. Del mismo modo, Console.Read
lee la entrada de lo que está conectado a la entrada estándar.
Cuando ejecuta una prueba unitaria a través de VS2010, la salida estándar es redireccionada por el arnés de prueba y almacenada como parte de la salida de prueba. Puede ver esto haciendo clic con el botón derecho en la ventana Resultados de prueba y agregando la columna llamada "Salida (StdOut)" a la pantalla. Esto mostrará todo lo que se escribió en stdout.
Puedes abrir manualmente una ventana de consola, usando P / Invoke como dice @ sinni800. AllocConsole
leer la documentación de AllocConsole
, parece que la función restablecerá los identificadores stdin
y stdout
para que apunten a la nueva ventana de la consola. (No estoy 100% seguro de eso, me parece un poco malo si ya he redirigido stdout
para que Windows me lo robe, pero no lo he intentado).
En general, sin embargo, creo que es una mala idea; si lo único que desea utilizar para la consola es descargar más información sobre su prueba de unidad, la salida está ahí para usted. Siga usando Console.WriteLine
tal como está y verifique los resultados en la ventana Resultados de la prueba cuando esté listo.
Puedes usar
Trace.WriteLine()
escribir en la ventana Salida al depurar una prueba de unidad.