2010-01-25 4 views
13

Stiamo scrivendo un client per un servizio remoto che espone servizi Web SOAP e pubblica una definizione WSDL per tali servizi.Creazione di un servizio Web fittizio da un file WSDL in Python

Non abbiamo accesso al sistema durante i test, quindi vorremmo scrivere un servizio di simulazione. Stiamo usando Python per il client, quindi idealmente vorremmo usare Python per il server mock, anche se suppongo che non sia strettamente necessario.

Il sogno sarebbe essere in grado di generare stub dal file WSDL che potremmo compilare, e quindi servire quelli che usano Paste Deploy come server WSGI, anche se non deve essere Paste Deploy o WSGI così a lungo come funziona in modo affidabile. La cosa principale è che dobbiamo generare gli stub dal file WSDL "reale" in modo da non scrivere accidentalmente un server mock non conforme.

Usiamo suds per la libreria laterale del client e abbiamo consultato soaplib e ZSI. Tuttavia, la roba di wsgi2py in soaplib dice "non usare" in alto e ZSI sembra molto da ingoiare. Cosa generalmente usano le persone per questo genere di cose?

Martin

risposta

8

Come server finto Consiglio davvero soapUI (http://www.soapui.org).

Richiede un WSDL e genera automaticamente i servizi e i metodi di servizio. È quindi possibile andare avanti e definire i rendimenti statici o dinamici utilizzando gli script Groovy. Dai uno sguardo allo here per la documentazione del servizio di web mocking.

soapUI è disponibile in una versione pro gratuita ea pagamento. Ho usato la versione gratuita con grande successo.

+0

Grazie a entrambi. Da un rapido test, SoapUI (gratuito) sembra eccellente. – optilude

6

Si consiglia di utilizzare soapUI per creare un servizio di simulazione. È molto facile da installare. È altrettanto facile creare un servizio di simulazione WS. Prende il file WSDL dalla posizione desiderata, crea la struttura per le richieste e, se lo desideri, crea anche il servizio Web fittizio con la struttura prevista ricavata dal file WSDL. Quando si crea il nuovo progetto soapUI, selezionare la terza opzione di casella di controllo per creare il servizio Web fittizio.

Se sono richiesti i file di schema xsd, assicurarsi che siano ben referenziati dal file WSDL.

Non utilizza python ma se tutto ciò che serve è un ambiente di test in cui è possibile inviare richieste e ottenere risposte, sarà più che sufficiente.

Spero che questo aiuti.

3

È possibile utilizzare questo codice per creare un client fittizio 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' 

E successivamente definire 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') 

Ora è possibile utilizzare libreria finta di falsificare un codice, che usa 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')