五六年前我测试了自己的第一个web服务。该服务是一个更大的系统重写的一部分。在这一阶段,我们用web服务集成了一个遗留主机应用和一个新的web平台。我们在测试办公方面的web服务有若干工具:SoapScope ,一个国产的基于浏览器的测试工具,我们当中还有一些人直接编写Java或Ruby代码进行测试。我还记得,那时候就在想,应该有更容易的测试方式才对。
那时候项目开展有两个星期了,当时我正在设法获取几个可以测试服务的Ruby库,项目组里面有人向我推荐了soapUI ,那时候soapUI还很年轻——只有基本功能和性能测试能力,且还没有专业版。从我第一次使用soapUI开始,它就成为了我测试服务的缺省选择。
现在,soapUI除了开源版本以外还有商业的专用版。它们提供了对WS、REST及以HTTP为基础的服务的支持,还有最近宣布的对JMS、AMF及 JDBC的支持。在本文中,我们来看一个对WSDL服务进行功能和性能测试的例子。在将来的文章中我们还将讨论负载测试、web服务模拟以及与JUnit 的集成。对于这些文章中所涉及的例子应用,我们都会考虑Atlassian JIRAsoap web服务。这是一个很好的、非凡的界面,也有一个公开的例子。
创建第一个项目
第一次打开soapUI时,不会有工程加载进来。要想创建新工程的话,右键单击Project图标然后选择New soapUI Project,如下图1所示:
图1:在soapUI中创建一个新项目。
第一步:在soapUI中创建一个新项目
这会弹出New soapUI Project的对话框,如下图2所示。输入项目的名字及所建项目的初始WSDL地址。如果WSDL变了,你可以在后面导入更新—不要以为拿到最后版本才 能开始。在本例中,我会使用自己的JIRAweb服务实现以便可以执行测试。如果你要跟着做的话,可以将你的项目指向Atlassian的例子,该例子可 在此处找到。
图2: 命名项目并导入初始WSDL。
第二步:命名项目并导入初始WSDL
你会看到几个复选框,让你选择在项目创建过程中由soapUI自动执行的任务。若是想全部都选上,欢迎,不过通常我只会选“为所有的操作创建样例请求 吗?(Create sample requests for all operations?)”这个复选框。一旦完成新项目信息的输入,点击OK按钮。
图3:显示在项目下面的各种JIRA请求,有一个请求窗口在soapUI主工作区打开。
项目加载完成后,你应该看一看所有不同的请求的细节,这些细节均在图3中项目底下的WSDL定义中显示。要想观看这些请求细节,你可以展开请求并双击图中所示的“Request 1”按钮。应该就能打开soapUI主工作区的一个窗口。
第三步:显示在项目下面的各种JIRA请求,在soapUI主工作区打开一个请求窗口
图4:用绿色箭头提交一项服务请求。
要想手工提交请求给web服务,只需点击请求窗口中的绿色箭头—如图4所示。
第四步:用绿色箭头将请求提交给服务。
如果你对这个请求—addVersion请求执行上述动作,在没有做出任何改变的情况下,你会得到如下表1所示的包含有例外的响应:
表 1:例外:未传递合法参数数据。
以下是引用片段: … <faultcode>soapenv:Server.userException</faultcode> <faultstring>java.lang.NumberFormatException: Invalid boolean</faultstring> … |
这一例外会得到返回,有几个原因。首先,我们还没有登录进去。如果你向下滚动我们项目已有的请求,就会看到有一个登录请求。其次,请求中所有的数据值上面都有问号,正如下面的列表2所示。在提交任何请求之前,你应该想要输入测试值到看到出现有问号的那些字域中去。
列表2:缺省情况下,请求的值不会弹出。
以下是引用片段: … <in0 xsi:type="xsd:string">?</in0> <in1 xsi:type="xsd:string">?</in1> <in2 xsi:type="bean:RemoteVersion" xmlns:bean="http://beans.soap.rpc.jira.atlassian.com"> <id xsi:type="xsd:string">?</id> <name xsi:type="xsd:string">?</name> <archived xsi:type="xsd:boolean">?</archived> <releaseDate xsi:type="xsd:dateTime">?</releaseDate> <released xsi:type="xsd:boolean">?</released> <sequence xsi:type="xsd:long">?</sequence> </in2> … |
这时候,你可以浏览任何的请求;查看不同的请求参数;改变请求并人工运行来看那些响应。总而言之,你应该可以浏览web服务并与之交互。