从Python中的WSDL文件创建模拟Web服务

时间:2010-01-25 09:14:32

标签: python soap wsdl mocking

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

我们在测试期间无权访问系统,因此我们想编写一个模拟服务。我们正在为客户端使用Python,所以理想情况下我们希望将Python用于模拟服务器,尽管我认为它并非绝对必要。

梦想是能够从我们可以填写的WSDL文件生成存根,然后使用Paste Deploy作为WSGI服务器提供存根,尽管它不必是粘贴部署或WSGI,只要它它可靠地工作。主要的是我们需要从“真正的”WSDL文件生成存根,以便我们不会意外地编写不兼容的模拟服务器。

我们在客户端库中使用suds,并查看了soaplib和ZSI。然而,soaplib中的wsgi2py内容在顶部说“不要使用”,ZSI似乎要吞下很多东西。人们通常会用这种东西做什么?

马丁

3 个答案:

答案 0 :(得分:8)

作为模拟服务器,我真的推荐soapUI(http://www.soapui.org)。

它需要一个WSDL并自动生成服务和服务方法。然后,您可以继续使用Groovy脚本定义静态返回或动态返回。查看here以获取Web服务模拟的文档。

soapUI是免费且付费的专业版。我使用免费版本取得了巨大成功。

答案 1 :(得分:6)

我建议您使用soapUI创建模拟服务。这很容易安装。创建WS模拟服务同样容易。 它从您想要的位置获取WSDL文件,它为请求创建结构,如果您愿意,它还会创建具有从WSDL文件中提取的预期结构的模拟Web服务。 创建新的soapUI项目时,选择第三个复选框选项以创建模拟Web服务。

如果需要xsd模式文件,请确保从WSDL文件中很好地引用它们。

它不使用python,但如果您只需要一个可以发送请求并获得响应的测试环境,那就足够了。

我希望有所帮助。

答案 2 :(得分: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')

现在您可以使用模拟库来欺骗使用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')