在Python中从WSDL文件创建一个模拟Web服务

15

我们正在为公开SOAP Web服务并为这些服务发布WSDL定义的远程服务编写客户端。

在测试期间我们无法访问该系统,因此我们希望编写一个模拟服务。我们正在使用Python编写客户端,因此最好也使用Python编写模拟服务器,尽管这不是绝对必要的。

理想情况下,我们希望能够从WSDL文件中生成存根,然后使用Paste Deploy作为WSGI服务器提供这些存根,但只要它可靠工作即可,不一定非得使用Paste Deploy或WSGI。主要问题是我们需要从“真实”的WSDL文件生成存根,以便不会无意中编写不符合规范的模拟服务器。

我们正在使用suds作为客户端库,并查看了soaplib和ZSI。但是,soaplib中的wsgi2py部分在顶部标注“不要使用”,而ZSI似乎有很多要学习的东西。人们通常用什么来处理这种情况呢?

Martin

3个回答

8
作为一个模拟服务器,我强烈推荐使用soapUI(http://www.soapui.org)。
它可以读取WSDL文件并自动生成服务和服务方法。您可以定义静态返回或使用Groovy脚本动态返回。在这里查看Web服务模拟文档。
soapUI分为免费版和付费专业版。我使用过免费版,并取得了很好的成功。

感谢两位。经过简单测试,SoapUI(免费版)表现非常出色。 - optilude

6
我建议您使用soapUI来创建模拟服务。它非常容易安装,同样轻松地创建WS模拟服务。它会从所需位置获取WSDL文件,为请求创建结构,并且如果您希望,还会使用来自WSDL文件的预期结构创建模拟Web服务。创建新的soapUI项目时,请选择第三个复选框选项以创建模拟Web服务。
如果需要xsd模式文件,请确保它们在WSDL文件中有良好的引用。
它不使用Python,但如果您所需的只是可以发送请求并获得响应的测试环境,这将足够。希望这能帮到您。

3
您可以使用此代码创建一个 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'

接下来定义一个具体的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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接