Создание ложной веб-службы из файла WSDL в Python

Мы пишем клиент для удаленной службы, которая предоставляет веб-службы SOAP и публикует определение WSDL для этих служб.

У нас нет доступа к системе во время тестирования, поэтому мы хотели бы написать макет службы. Мы используем Python для клиента, поэтому в идеале мы хотели бы использовать Python для макетного сервера, хотя я полагаю, что это не является строго необходимым.

Мечта заключалась бы в том, чтобы иметь возможность генерировать заглушки из файла WSDL, которые мы могли бы заполнить, а затем обслуживать тех, кто использует Paste Deploy в качестве WSGI-сервера, хотя это не должно быть Paste Deploy или WSGI до тех пор, пока он работает надежно. Главное, что нам нужно генерировать заглушки из "реального" WSDL файла, чтобы мы случайно не записали несоответствующий макет-сервер.

Мы используем пены для библиотеки на стороне клиента и смотрим на soaplib и ZSI. Тем не менее, материал wsgi2py в soaplib говорит, что "не использовать" наверху, и ZSI, похоже, много глотает. Что люди обычно используют для такого рода вещей?

Martin

Ответы

Ответ 1

Как макет сервера я бы рекомендовал soapUI (http://www.soapui.org).

Он берет WSDL и автоматически генерирует сервисы и методы обслуживания. Затем вы можете продолжить и определить статические возвраты или динамические с помощью сценариев Groovy. Посмотрите здесь для документирования веб-сервиса, насмехающегося.

soapUI поставляется в бесплатной и платной версии pro. Я использовал бесплатную версию с большим успехом.

Ответ 2

Я бы рекомендовал вам использовать soapUI для создания макетной службы. Он очень прост в установке. Это так же просто создать WS mock-сервис. Он берет файл WSDL из вашего желаемого местоположения, он создает структуру для запросов, и, если хотите, он также создает макет веб-сервиса с предполагаемой структурой, созданной из файла WSDL. Когда вы создаете новый проект soapUI, выберите третий флажок, чтобы создать макет веб-службы.

Если требуются файлы схемы xsd, убедитесь, что они хорошо привязаны к файлу WSDL.

Он не использует python, но если все, что вам нужно, это тестовая среда, в которой вы можете отправлять запросы и получать ответы, этого будет более чем достаточно.

Я надеюсь, что это поможет.

Ответ 3

Вы можете использовать этот код для создания suds mock client.

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'

И далее определите конкретный ClientMock.

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')

Теперь вы можете использовать mock-библиотеку для подмены кода, который использует 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')