2008-09-03 11 views
57

.NET Framework: 2.0 Idioma preferido: C#¿Cómo puedo probar la unidad de un servicio de Windows?

Soy nuevo en TDD (Prueba de desarrollo).

Antes que nada, ¿es posible probar el servicio de Windows?

clase de servicio de Windows se deriva de ServiceBase, que cuenta con métodos reemplazables,

  1. OnStart
  2. OnStop

¿Cómo puedo activar esos métodos a ser llamado como prueba de la unidad es una real servicio que llama a esos métodos en el orden correcto?

En este punto, ¿estoy haciendo una prueba unitaria? o una prueba de integración?

He visto la pregunta sobre el servicio WCF pero no tiene ningún sentido para mí ya que nunca he tratado con el servicio WCF.

Respuesta

80

Probablemente recomendaría diseñar su aplicación para que las anulaciones "OnStart" y "OnStop" en el Servicio de Windows simplemente llamen a métodos en un conjunto de biblioteca de clases. De esta forma, puede automatizar las pruebas unitarias contra los métodos de la biblioteca de clases, y el diseño también abstrae su lógica comercial de la implementación de un servicio de Windows.

En este escenario, probar los métodos "OnStart" y "OnStop" ellos mismos en un contexto de servicio de Windows sería una prueba de integración, no algo que automatizaría.

11

Comenzaría here. Se muestra cómo iniciar y detener los servicios en C#

Una muestra de partida es es

public static void StartService(string serviceName, int timeoutMilliseconds) 
{ 
    ServiceController service = new ServiceController(serviceName); 
    try 
    { 
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 

    service.Start(); 
    service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
    } 
    catch 
    { 
    // ... 
    } 
} 

También he probado los servicios principalmente a través de la aplicación de consola, simulando lo que el servicio iba a hacer. De esa forma, mi prueba unitaria está completamente automatizada.

+1

lo que este código return service.WaitForStatus? ¿Cuál es el uso de la función WaitForStatus()? por favor explique. gracias – Mou

30

He probado los servicios de Windows al no probar el servicio directamente, sino más bien probar lo que hace el servicio.

Normalmente creo un conjunto para el servicio y otro para lo que hace el servicio. Luego escribo pruebas unitarias contra el segundo conjunto.

Lo bueno de este enfoque es que su servicio es muy delgado. Básicamente, todo lo que hace es llamar a métodos para hacer el trabajo correcto en el momento correcto. Su otra asamblea contiene toda la carne del trabajo que su servicio intenta hacer. Esto hace que sea muy fácil de probar y fácil de reutilizar o modificar según sea necesario.

+0

Buen enfoque, que también separa su BL del servicio. – JPReddy

5

Usaría la clase de servicio de Windows (la que ejecuta al iniciar/detener el servicio) como un proxy para su sistema real. No veo cómo el código detrás de su servicio debería ser diferente de cualquier otra programación. Los métodos onStart y onStop son simplemente eventos que se activan, como presionar un botón en una GUI.

Por lo tanto, su clase de servicio de Windows es una clase muy delgada, comparable a un formulario de Windows. Llama a su lógica de lógica de negocio/dominio, que luego hace lo que se supone que debe hacer. Todo lo que tienes que hacer es asegurarte de que los métodos a los que llamas en onStart y onStop funcionen como deberían.Al menos eso es lo que haría el servicio ventana ;-)

0

de prueba en función de apagado automático, apagado condiciones servicio de la ventana prueba cuando la red desconectado, conectado opción de servicio de la ventana de prueba de arranque automático, manual, etc

+1

Creo que él no está preguntando acerca de los tipos de pruebas de un servicio de Windows. – JPReddy

0

Guy probablemente el la mejor respuesta.

De todos modos, si realmente lo desea, puede invocar en la unidad de prueba estos dos métodos como se describe en MSDN documentation pero, dado que están protegidos, tendrá que usar Reflection.

2

Diseñar para la prueba es una buena estrategia, ya que muchas de las respuestas señalan que sus métodos OnStart y OnStop son muy delgados al delegar en objetos de dominio.

Sin embargo, si sus pruebas necesitan para ejecutar los métodos de servicio por alguna razón, se puede utilizar código como este para llamar desde dentro de un método de prueba (llamando OnStart en este ejemplo):

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}}); 
Cuestiones relacionadas