设为首页 收藏本站
查看: 1745|回复: 0

[经验分享] Python suds模块测试WebSerivce服务和Type not found错误解决

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-21 11:04:15 | 显示全部楼层 |阅读模式
这几天兼职测试工程师,有一个WebService服务,虽然SoapUI提供了很好的WS服务测试功能,但是作为一个有理想有追求的程序员,怎么可以放弃任何一个写代码的机会呢,于是,一个用python写自动化测试脚本的我就诞生了。
    SoapUI的官网 https://www.soapui.org/  里面也有源码,有兴趣的可以研究一下WS调用的内部原理。
    suds是一个基于SOAP的python客户端,可以实时地读取wsdl的内容,进而可以调用wsdl里定义的WebService服务,就可以满足我测试的需求啦(当然它不只是用来做测试的)
    首先要安装suds,可以通过pip来安装这个模块
    pip install suds
    完成安装后就可以在python代码里通过import suds使用相关的功能。

    常规的使用方法
1
2
3
url = 'http://localhost:8080/webservice/simpleService?wsdl'
client = suds.client.Client(url)
service = client.service



    简单类型的参数可以直接传递,比如string,boolean,int
    比如下面调用doSomething服务方法
1
result = service.doSomething('I am a request!')



    复杂对象类型需要通过client提供的工厂方式来生成
    比如
1
2
3
4
5
6
7
8
9
10
#创建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,每个schema拥有不同的并且定义的类型之间互相嵌套,比如:
    ns0中定义了A类型的对象,ns1中定义了B类型的对象, 且A对象中有一个属性是B类型的
    Class A {
         private Class B;
    }

    通过client.factory.create(‘ns0:A’)构造A对象,报以下错误:
        An error occured while building a instance of (ns3:A).  As a result
        the object you requested could not be constructed.  It is recommended
        that you construct the type manually using a Suds object.
        Please open a ticket with a description of this error.
        Reason: Type not found: ‘(B, http://****************, )'
    刚开始以为是B在wsdl里没有定义,后来用client.factory.create(‘ns1:B’)来创建B对象是成功的。
    搜了很多资料都只是关于怎么使用suds的,没有提及这个问题,苦思冥想,后来突然看到wsdl里<wsld:types>标签下定义了很多个schema,怀疑是不是跨schema引用会找不到类型,所以报了TypeNotFound。于是去找了官方文档,https://fedorahosted.org/suds/
    发现创建client对象的方法中有一个options参数,里面有一个bool类型的值autoblend
    文档的说明是Flag that ensures that the schema(s) defined within the WSDL import each other.
    意思是说这个参数是使得wsdl中定义的schema互相引入,所以可能之前的猜测是正确的
    带着试一试的心态改了代码 client = suds.client.Client(url, autoblend = True)
    Bingo!成功。

    总结:归根接地是没有好好理解WebService的原理和机制,尤其是对WSDL内容的不熟悉,导致了没有第一时间意识到问题所在。有空好好研究一下WSDL的解析原理,以及为什么会有schema相互引入这么一回事儿。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-206902-1-1.html 上篇帖子: 用Python 编写的清除U8系统单据锁定的脚本 下篇帖子: Python下进程与线程的原理及区别
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表