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

2024-05-19 21:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在测试期间,我们无法访问系统,因此我们希望编写模拟服务。我们在客户端使用Python,因此理想情况下我们希望在模拟服务器上使用Python,尽管我认为这并不是绝对必要的。

我们的梦想是能够从WSDL文件中生成存根,然后将这些存根作为WSGI服务器提供给使用Paste Deploy的用户,尽管只要它工作可靠,就不必是Paste Deploy或WSGI。最主要的是,我们需要从“真实的”WSDL文件生成存根,这样我们就不会意外地编写不兼容的模拟服务器。

我们使用sud作为客户端库,并查看了soaplib和ZSI。然而,soaplib中的wsgi2py内容在顶部显示“不要使用”,ZSI看起来很难接受。人们通常用什么来做这种事?

马丁


Tags: 文件服务器web客户端wsgi远程定义系统
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 library来欺骗使用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')

我建议您使用soapUI来创建模拟服务。安装起来很容易。创建WS-mock服务同样简单。 它从您所需的位置获取WSDL文件,为请求创建结构,如果您愿意,它还使用从WSDL文件中提取的预期结构创建模拟web服务。 创建新的soapUI项目时,选中第三个复选框选项以创建模拟web服务。

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

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

我希望这会有帮助。

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

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

soapUI提供免费付费的专业版。我成功地使用了免费版本。

相关问题 更多 >