【问题标题】:Creating a mock web service from a WSDL file in Python在 Python 中从 WSDL 文件创建模拟 Web 服务
【发布时间】:2010-01-25 09:14:32
【问题描述】:

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

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

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

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

马丁

【问题讨论】:

    标签: python soap wsdl mocking


    【解决方案1】:

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

    它采用 WSDL 并自动生成服务和服务方法。然后,您可以继续使用 Groovy 脚本定义静态返回或动态返回。看看 here 的 web service mocking 的文档。

    soapUI 提供免费和付费的专业版。我使用免费版取得了巨大的成功。

    【讨论】:

    • 谢谢两位。通过快速测试,SoapUI(免费)看起来很棒。
    【解决方案2】:

    我建议您使用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')
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2019-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多