我们正在为远程服务编写客户端,该服务公开SOAP Web服务并为这些服务发布WSDL定义。
我们在测试期间无权访问系统,因此我们想编写一个模拟服务。我们正在为客户端使用Python,所以理想情况下我们希望将Python用于模拟服务器,尽管我认为它并非绝对必要。
梦想是能够从我们可以填写的WSDL文件生成存根,然后使用Paste Deploy作为WSGI服务器提供存根,尽管它不必是粘贴部署或WSGI,只要它它可靠地工作。主要的是我们需要从“真正的”WSDL文件生成存根,以便我们不会意外地编写不兼容的模拟服务器。
我们在客户端库中使用suds,并查看了soaplib和ZSI。然而,soaplib中的wsgi2py内容在顶部说“不要使用”,ZSI似乎要吞下很多东西。人们通常会用这种东西做什么?
马丁
答案 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')