2009-06-16 14 views
7

¿Hay alguna manera de mostrar el progreso de un solo TestMethod en Visual Studio 2008?¿Es posible mostrar el progreso durante la ejecución de un Visual Studio TestMethod?

Dentro de un conjunto de pruebas unitarias, tengo un único TestMethod que funciona durante mucho, mucho tiempo, normalmente tomará entre 30 y 60 minutos. Establecí el Tiempo de espera utilizando el atributo [Tiempo de espera], no hay problema allí. Pero me gustaría poder obtener una indicación visual del progreso de la prueba.

Sé que la ventana Resultados de la prueba proporciona una actualización del progreso visual de todos los métodos de prueba. Lo que quiero es una actualización de progreso visual de un único método. En una aplicación WinForms, mostraría un control ProgressBar. En una aplicación de consola, colocaría el cursor y mostraría un mensaje de estado. Pero esta es una prueba unitaria. Puedo escribir en TestContext, pero esa ventana no se puede ver hasta que finalice la prueba.


EDITAR: Sé que hay una manera de hacerlo; todo es solo software, entonces siempre hay una manera. Pero, ¿qué es una manera simple y práctica?

Una forma de hacerlo es crear una aplicación TestMethodProgressMonitor.exe, que se lee desde una tubería con nombre, y actualiza una barra de progreso en función de los mensajes que llegan a través de la tubería. TestMethod puede ejecutar ShellExec TestMethodProgressMonitor.exe, luego escribir en la tubería con nombre. Cuando termine, tal vez haya un comando de apagado conocido que TestMethod envía a la aplicación TestMethodProgressMonitor.exe.

Otra opción es construir TestMethodProgressMonitor.exe como un servidor COM, y TestMethod puede usar COM (DCOM) para actualizar una barra de progreso alojada dentro de la aplicación.

Otra opción es utilizar el método SendMessage() de user32.dll para enviar un mensaje WM_COPYDATA a la aplicación del monitor. Esto a veces se hace para el control remoto de aplicaciones.

Esas son algunas de las posibilidades. Antes de comenzar a construir uno de ellos, me gustaría saber si hay una manera más simple.

+0

una prueba unitaria que toma tanto tiempo, no es una prueba unitaria por definición. ¿Qué causa que tome tanto tiempo? –

+2

Es una prueba de crear un archivo ZIP64; La prueba encripta un conjunto de archivos que dan como resultado un archivo zip de más de 4 gb. Luego, el archivo zip se actualiza y se guarda de nuevo (dos veces). El código tiene alrededor de 5 líneas rodeadas por un bucle. Pero hay muchas E/S y mucha DEFLATE. ¿De verdad estás diciendo que la definición de prueba unitaria incluye un límite de tiempo? ¿Cuál es el límite de tiempo? – Cheeso

Respuesta

5

acabo de empezar un hilo de interfaz gráfica de usuario con una ventana que tiene el progressbar.

Aquí hay un fragmento para empezar. Simplemente aparece MyProgressWindow en otro hilo (en lugar de otro proceso).

[ClassInitialize()] 
static public void MyClassInitialize(TestContext testContext) 
{ 
    start_app_in_gui_thread(); 
} 

static Thread t; 

private static void start_app_in_gui_thread() 
{ 
    t = new Thread(() => { 
     var w = new MyProgressWindow(); 
     var app = new App(); 
     app.ShutdownMode = ShutdownMode.OnMainWindowClose; 
     app.Run(w); 
    }); 
    t.SetApartmentState(ApartmentState.STA); 
    t.Start(); 
} 
+0

Doh! Qué significa eso? Whadaya significa "iniciar un hilo GUI"? – Cheeso

+0

Perdón por la jerga. Aquí hay un código. Disfrutar. – Ray

-1

no, pero me gustaría que hubiera

1

Para mis pruebas de larga duración utilizo las API Trace para adjuntar un detector de trazas (DbgView o algo personalizado).

Hace que sea muy fácil ver lo que está pasando sin tener que pasar por ningún aro.

Esto no le dará una experiencia de barra de progreso (aunque podría escribir una muy fácilmente).

+1

¡Genial! Por cierto, el uso de System.Diagnostics.Debug incluso te permite ver el resultado en la ventana de salida – sinelaw

0

No estoy seguro de que esta sea la manera más fácil, pero esto es lo que hice. Corté una clase que envía y recibe WM_COPYDATA. Es un transceptor. Esto permite que una aplicación de Windows se comunique con otra, en la misma máquina, bastante baja latencia. Lo empaqué como un conjunto.

Luego construí una aplicación de winforms (UnitTestProgressMonitor.exe) que crea uno de esos transceptores y actualiza su UI en función de los mensajes que recibe. Los mensajes son solo cadenas.Esto es lo que hacen:

  • barras 3 - La interfaz de usuario crea y muestra 3 barras de progreso
  • PB 0 max 100 - establece el máximo de la barra de progreso # 0 a 100
  • PB 0 valor de 28 - conjuntos el valor para la barra de progreso # 0 a 28
  • stop - exit.

Luego, dentro de [TestMethod], guardo el UnitTestProgressMonitor.exe, luego creo un transceptor y envío los mensajes de la aplicación.

El código de prueba envía "barras 3" a la aplicación del monitor de progreso, para indicarle que cree 3 barras de progreso. El primero sigue los 7 pasos en la prueba. La 2ª barra de progreso mide el progreso en el archivo zip; cada entrada en el archivo es un paso a lo largo de la barra. La tercera barra es el progreso de una entrada individual. Algunos de estos son archivos de varios gigabytes, por lo que comprimirlos puede llevar un tiempo. Durante la ejecución de la prueba, la prueba envía un "paso pb 0" o lo que sea, en los momentos apropiados. Estos mensajes provocan que las barras de progreso se actualicen. Al final de la prueba, el código de prueba envía un "alto" a la aplicación del monitor. En respuesta a eso, la aplicación del monitor de progreso desaparece. La prueba termina.

Unit Test Progress Monitor http://www.freeimagehosting.net/uploads/45b4979b92.jpg

1

me encontré con el mismo requisito, pero cualquier nuevo archivo ejecutable o suena demasiado para mí: estoy escribiendo prueba de unidad, no una aplicación. El siguiente código escribe el progreso en la ventana de salida de depuración:

[TestMethod] 
    public void ProgressTest() 
    { 
     int nLastWritten = -1, nTotal = 10000; 

     for (int i = 0; i < nTotal; i++) 
     { 
      int nProgress = 100 * i/nTotal; 
      if (nProgress > nLastWritten) 
      { 
       System.Diagnostics.Trace.WriteLine("Progress: " + nProgress + "%"); 
       nLastWritten = nProgress; 
      } 
     } 
    } 
Cuestiones relacionadas