2012-03-06 4 views
8

Estamos a punto de comenzar a diseñar un marco orientado a servicios (SOA) que ciertamente implicará una gran cantidad de servicios web granulares (REST en WCF). Hemos sido muy disciplinados en la prueba de unidades de nuestra base de códigos de cliente y servidor, sin embargo, no tenemos mucha experiencia en pruebas de servicios web. Realmente estamos buscando orientación sobre dónde deben escribirse las pruebas y recomendaciones sobre qué enfoque usar cuando la unidad evalúe nuestros servicios.Patrones recomendados para la prueba de servicios web de la unidad

¿Deberíamos escribir pruebas que hagan solicitudes http y afirmar que las respuestas son lo que deberían ser? ¿Deberíamos centrarnos solo en probar la lógica interna de los métodos de servicio y no preocuparnos por probar las solicitudes reales? ¿O deberíamos hacer ambas cosas? ¿Hay alguna otra recomendación para lo que deberíamos probar?

Realmente estamos buscando alguna explicación y orientación y realmente apreciaríamos cualquier consejo que podamos obtener.

Respuesta

11

he encontrado Servicios de ensayo web, específicamente cliente WCF y un servidor, utilizado en la parte superior de la unidad de pruebas regulares en los siguientes escenarios:

  1. Las pruebas de aceptación en el que desea cuadro negro a prueba su servicio de todo y meter cosas adentro en las extremidades.
  2. Prueba de un cable WCF específico, extensión, comportamiento, etc.
  3. Comprobando que su interfaz y sus miembros de datos están configurados correctamente.

La mayoría de las veces trato de usar una configuración muy básica con http básico y conecto todo en el código. A menos que sea una prueba de integración o aceptación, no pruebo al cliente contra el servidor, sino que me burlo de uno de ellos para poder probar el otro de forma aislada. A continuación se presentan ejemplos de cómo pruebo clientes y servicios de WCF:

public static ServiceHost CreateServiceHost<TServiceToHost>(TServiceToHost serviceToHost, Uri baseAddress, string endpointAddress) 
{ 
    var serviceHost = new ServiceHost(serviceToHost, new[] { baseAddress }); 

    serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; 
    serviceHost.Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.Single; 

    serviceHost.AddServiceEndpoint(typeof(TServiceToHost), new BasicHttpBinding(), endpointAddress); 

    return serviceHost; 
} 

//Testing Service 

[TestFixture] 
class TestService 
{ 
    private ServiceHost myServiceUnderTestHost; 
    private ChannelFactory<IMyServiceUnderTest> myServiceUnderTestProxyFactory; 
    [SetUp] 
    public void SetUp() 
    { 
     IMyServiceUnderTest myServiceUnderTest = new MyServiceUnderTest(); 
     myServiceUnderTestHost = CreateServiceHost<IMyServiceUnderTest>(myServiceUnderTest, new Uri("http://localhost:12345"), "ServiceEndPoint"); 
     myServiceUnderTestHost.Open(); 

     myServiceUnderTestProxyFactory = new ChannelFactory<IMyServiceUnderTest>(new BasicHttpBinding(), new EndpointAddress("http://localhost:12345/ServiceEndPoint")); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     myServiceUnderTestProxyFactory.Close(); 
     myServiceUnderTestHost.Close(); 
    } 

    [Test] 
    public void SomeTest() 
    { 
     IMyServiceUnderTest serviceProxy = myServiceUnderTestProxyFactory.CreateChannel(); 

     serviceProxy.SomeMethodCall(); 
    } 
} 

//Testing Client 

[TestFixture] 
class TestService 
{ 
    private ServiceHost myMockedServiceUnderTestHost; 
    private IMyServiceUnderTest myMockedServiceUnderTest; 

    [SetUp] 
    public void SetUp() 
    { 
     myMockedServiceUnderTest = Substitute.For<IMyServiceUnderTest>(); //Using nsubstitute 
     myServiceUnderTestHost = CreateServiceHost<IMyServiceUnderTest>(myMockedServiceUnderTest, new Uri("http://localhost:12345"), "ServiceEndPoint"); 
     myServiceUnderTestHost.Open(); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     myServiceUnderTestHost.Close(); 
    } 

    [Test] 
    public void SomeTest() 
    { 
     //Create client and invoke methods that will call service 
     //Will need some way of configuring the binding 
     var client = new myClientUnderTest(); 

     client.DoWork(); 

     //Assert that method was called on the server 
     myMockedServiceUnderTest.Recieved().SomeMethodCall(); 
    } 
} 

NOTA

me había olvidado mencionar que si quiere burlarse de un servicio WCF utilizando cualquier cosa que utiliza castillos proxy dinámico continuación, se quiere es necesario evitar que el ServiceContractAttribute se copie al simulacro. Tengo un blog post en esto, pero básicamente usted registra el atributo como uno para evitar la replicación antes de crear el simulacro.

Castle.DynamicProxy.Generators.AttributesToAvoidReplicating 
    .Add<ServiceContractAttribute>(); 
3

Bueno, básicamente, creo que debes tener una estrategia de prueba en dos partes.

La primera parte consistiría en verdaderas pruebas unitarias, lo que implicaría probar las clases completamente independiente de cualquier solicitud web ... como la definición principal de una prueba unitaria es aquella que se ejecuta sin necesidad de entornos o configuraciones adicionales que los de la prueba en sí.

Así crearía proyectos de prueba unitarios, en los que crearía una instancia de las clases de código de sus servicios WCF para asegurarse de que la lógica sea correcta, de la misma manera que prueba el resto de sus clases.

La segunda parte sería un conjunto de pruebas de integración, que pondría a prueba su aplicación de manera integral. Por supuesto, aquí necesita toda la enchilada, el servidor web, la base de datos, etc.

De esta manera usted sabe que su lógica es precisa y también que su aplicación funciona.

Cuestiones relacionadas