Python suds模块测试WebSerivce服务和Type not found错误解决

这几天兼职测试工程师,有一个WebService服务,虽然SoapUI提供了很好的WS服务测试功能,但是作为一个有理想有追求的程序员,怎么可以放弃任何一个写代码的机会呢,于是,一个用python写自动化测试脚本的我就诞生了。

SoapUI的官网 https://www.soapui.org/  里面也有源码,有兴趣的可以研究一下WS调用的内部原理。

suds是一个基于SOAP的python客户端,可以实时地读取wsdl的内容,进而可以调用wsdl里定义的WebService服务,就可以满足我测试的需求啦(当然它不只是用来做测试的)

首先要安装suds,可以通过pip来安装这个模块

pip install suds

完成安装后就可以在python代码里通过import suds使用相关的功能。

常规的使用方法

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!‘)

复杂对象类型需要通过client提供的工厂方式来生成

比如

#创建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相互引入这么一回事儿。

时间: 2024-11-05 19:37:39

Python suds模块测试WebSerivce服务和Type not found错误解决的相关文章

编绎显示Unknown type name &ldquo;CGFloat&rdquo; 错误解决方法

一.编绎显示Unknown type name "CGFloat"  错误解决方法   将Compile Sources As 改为 Objective-C 二.如果是extern const引起的.直接加头文件 #import <UIKit/UIKit.h>

python脚本AttributeError: module &#39;xxxx&#39; has no attribute &#39;xxxxx&#39;错误解决办法

最近写脚本发现了这样的一个错误,脚本.环境什么的完全正确,但执行的时候却报错:AttributeError: module 'xxxx' has no attribute 'xxxxx',查阅了一些相关的博客,最终解决了问题,原来是python代码在编译后会生成以pyc为文件名后綴的字节码文件,该字节码文件会经过python解释器来生成机器码文件来运行.当再次运行python文件时,解释器会直接调用该pyc的字节码文件运行直到py文件发生改变(解释器运行时会对比pyc的生成时间和py的修改时间)

Python 2.6 安装wxPython后提示&quot;64.....32&quot;错误解决办法

p.p1 { margin: 0.0px 0.0px 10.0px 0.0px; line-height: 20.0px; font: 14.0px "PingFang SC" } li.li2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 20.0px; font: 14.0px "PingFang SC" } span.s1 { } span.s2 { text-decoration: underline; co

Illegal overloaded getter method with ambiguous type for propert错误解决

前言:如题,当出现了 Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Illegal overloaded getter method with ambiguous type for property tradeType in class class com

windows 10 服务组件安装出现0x80070422错误解决方法

问题描述: windows 10通过控制面板->程序->启用或关闭Windows 功能安装Windows服务或组件时,出现0x80070422错误,提示服务禁止或未启用 问题产生原因: 启用检测.下载和安装 Windows 和其他程序的更新.如果此服务被禁用,这台计算机的用户将无法使用 Windows 更新或其自动更新功能, 并且这些程序将无法使用 Windows 更新代理(WUA) API 问题解决方法: 启用Windows Update服务即可 原文地址:https://www.cnblo

编绎显示Unknown type name “CGFloat” 错误解决方法

将Compile Sources As 改为 Objective-C++ 二.如果是extern const引起的.直接加头文件 #import <UIKit/UIKit.h>

用python做linux的服务安装脚本 - vncserver

linux服务器在标准安装后,就集成了万能胶水python,python应用于科学计算.web服务.服务管理等等方面,既然这么方便何不利用python来做linux服务的安装脚本呢? 基本上一个linux操作系统安装好后,会安装基础服务应用,比如ftp.vncserver等等,其他的都是根据实际应用来安装,每次安装这些服务都要上网查查安装步骤,照步骤来走基本上不会走错. 设想一个场景,安装好linux操作系统后,通过网页从邮箱把python脚本下载下来,直接 python 脚本.py 即可.安全

使用Flask结合python实现多台服务的内存监控

使用Flask结合python实现多台服务的内存监控   简介:使用flask结合python可以很好的实现服务资源的监控,而且Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 .Flask使用 BSD 授权. 接下来我们实现多台服务器的内存监控,并出图. 环境:centos1-6.5  ip:172.25.0.31   ##做flask python数据获取 Centos2-6.5  ip:172.2

Linux下设置python脚本文件为服务

(最简单的方式nohup python xxx.py) ------------------------------------------------------------------------------------------------------------------- Python脚本开机自动运行:本帖适用于使用systemd的Linux系统,现在流行的Linux发行版都使用systemd. 后台服务程序是随系统自启动的,我们只要把Python脚本配置为服务就行了.需要注意的一