2010-01-25 29 views
13

Estamos escribiendo un cliente para un servicio remoto que expone servicios web SOAP y publica una definición WSDL para esos servicios.Creación de un servicio web simulado a partir de un archivo WSDL en Python

No tenemos acceso al sistema durante las pruebas, por lo que nos gustaría escribir un servicio simulado. Estamos utilizando Python para el cliente, por lo que idealmente querríamos usar Python para el servidor simulado, aunque supongo que no es estrictamente necesario.

El sueño sería poder generar resguardos del archivo WSDL que podríamos completar y luego servir a aquellos que usan Paste Deploy como un servidor WSGI, aunque no tiene que ser Paste Deploy o WSGI por tanto tiempo ya que funciona de manera confiable. Lo principal es que tenemos que generar los resguardos del archivo WSDL "real" para no escribir accidentalmente un servidor simulado no conforme.

Estamos utilizando espuma para la biblioteca del lado del cliente, y hemos examinado soaplib y ZSI. Sin embargo, las cosas wsgi2py en soaplib dicen "no usar" en la parte superior y ZSI parece mucho que tragar. ¿Qué usa generalmente la gente para este tipo de cosas?

Martin

Respuesta

8

Como servidor simulacro Verdaderamente recomiendo soapUI (http://www.soapui.org).

Toma un WSDL y genera los servicios y métodos de servicio automáticamente. A continuación, puede continuar y definir retornos estáticos o dinámicos utilizando scripts de Groovy. Eche un vistazo here para la documentación de la burla del servicio web.

soapUI viene en una versión pro gratuita y paga. He usado la versión gratuita con gran éxito.

+0

Gracias a ambos. A partir de una prueba rápida, SoapUI (gratis) se ve excelente. – optilude

6

Yo recomendaría que use soapUI para crear un servicio simulado. Es muy fácil de instalar. Es tan fácil crear un servicio simulado de WS. Toma el archivo WSDL de la ubicación deseada, crea la estructura para las solicitudes y, si lo desea, también crea el servicio web simulado con la estructura prevista extraída del archivo WSDL. Cuando cree el nuevo proyecto soapUI, seleccione la tercera opción de casilla de verificación para crear el servicio web simulado.

Si se requieren archivos de esquema xsd, asegúrese de que estén bien referenciados del archivo WSDL.

No utiliza Python, pero si todo lo que necesita es un entorno de prueba en el que pueda enviar solicitudes y obtener respuestas, eso será más que suficiente.

Espero que ayude.

3

Puede usar este código para crear un cliente simulado suds.

from suds.client import Client 

class AlwaysCallable(object): 
    """ 
    Represents a chainable-access object and proxies calls to ClientMock. 
    """ 

    name = None 

    def __init__(self, client_cls): 
     self._client_cls = client_cls 

    def __call__(self, *args, **kwargs): 
     try: 
      hook = object.__getattribute__(self._client_cls, self.name) 
     except AttributeError: 
      pass 
     else: 
      return hook(self._client_cls, *args, **kwargs) 

    def __getattr__(self, item): 
     new = object.__getattribute__(self, '__class__')(self._client_cls) 
     new.name = item 
     return new 


class ClientMock(Client): 
    """ 
    Abstract mock suds client. 
    """ 

    def __init__(self, url, **kwargs): 
     pass 

    def __getattr__(self, item): 
     return AlwaysCallable(self.__class__) 

    def __unicode__(self): 
     return 'Client mock' 

    def __str__(self): 
     return 'Client mock' 

Y a continuación definimos un ClientMock concreto.

class UserCredentialsServiceClientMock(ClientMock): 
    """ 
    Mock object that implements remote side services. 
    """ 

    def GetUserInfo(cls, user_id): 
     """ 
     Stub for remote service. 
     """ 
     return UserInfo(id=user_id, name='Adam Smith') 

Ahora usted puede utilizar la biblioteca de simulacro de falsificar un código, que utiliza suds.client.Client.

from unittest import TestCase 
from mock import patch 
from project.api import get_user_credentials 

class UserCredentialsClientTestCase(TestCase): 
    def test_getting_user_credentials(self): 
     with patch('project.api.Client', new=UserCredentialsServiceClientMock): 
      self.assertEquals(get_user_credentials(1), 'Adam Smith') 
Cuestiones relacionadas