使用Python和Suds库进行WebService自动化测试的完整指南
如今,兼职测试工程师拥有 WebService 服务。虽然SoapUI提供了非常好的WS服务测试功能,但是作为一个有理想有追求的程序员怎么能放弃任何写代码的机会,所以一个用户天生就是用Python写自动化测试脚本的。

SoapUI的官方网站也有源代码。如果有兴趣可以研究一下WS调用的内部原理。
suds是一个基于SOAP的python客户端,可以实时读取wsdl的内容,然后调用wsdl中定义的WebService服务,可以满足我的测试需求(当然不仅仅是为了测试)
首先,您需要安装肥皂水。您可以通过 pip 安装此模块。
pip 安装肥皂水
安装完成后,可以通过import suds使用python代码中的相关功能。
一般用法
url = 'http://localhost:8080/webservice/simpleService?wsdl'
client = suds.client.Client(url)
service = client.service
简单类型参数可以直接传递,如string、boolean、int
例如下面调用doSomething服务方法
result = service.doSomething('I am a request!')
复杂的对象类型需要通过客户端提供的工厂方法生成
例如
#创建Request对象,该类型定义在wsdl中,如果有多个schema,则需要增加前缀,比如ns0、ns1等
request = client.factory.create('Request')
#打印request对象,可以查看对象内部的字段
print request
#设置request对象中info字段的值
request.info = ''
#调用doSomething服务,参数为request对象,返回值为response对象
response = service.doSomething(request)
#打印response对象,查看返回对象的内容
print response
上面的simpleService是我自己写的一个例子,用来说明suds的简单使用。
那么问题来了。实际测试的WebService中定义了多个schema。每个模式都有不同的、相互嵌套的已定义类型,例如:
ns0 中定义了类型 A 的对象,ns1 中定义了类型 B 的对象,并且对象 A 中有一个类型 B 的属性。
A类{
私人B级;
通过client.factory.create('ns0:A')构造A对象,报如下错误:
构建 (ns3:A) 的实例时发生错误。因此
无法构造您请求的对象。推荐
您使用 Suds 对象手动构造类型。
请打开带有此错误说明的票证。
原因:未找到类型:'(B,****************,)'
一开始我以为是因为wsdl中没有定义B,后来我使用client.factory.create('ns1:B')成功创建了B对象。
我查了很多资料,但只是关于如何使用泡沫。这个问题没有被提及。苦思冥想,突然发现wsdl中的标签下定义了很多schema。我想知道是否由于跨架构引用而找不到类型,所以我报告了TypeNotFound。 。于是我就去找官方文档。
发现创建client对象的方法中有一个options参数,其中包含一个bool类型值autoblend。
该文档规定了确保 WSDL 中定义的模式相互导入的 Flag。
意思是这个参数导致wsdl中定义的schema互相引入,所以之前的猜测可能是正确的。
抱着试一试的心态,我改了代码 client=suds.client.Client(url,autoblend=True)
宾果!成功。
总结:归根结底是对WebService的原理和机制没有很好的理解,尤其是对WSDL的内容不熟悉,导致无法第一时间实现问题。如果有时间,可以仔细看看 WSDL 的解析原理以及为什么要互相引入 schema。