WebService 功能测试
来源:互联网 发布:苹果手机怎么删除软件 编辑:程序博客网 时间:2024/05/16 23:38
WebService 功能测试
摘要:由于WebService的平台无关性,使用越来越多,所以对WebService的测试也越来越受关注,本文整理了WebService的功能测试方法,包括编码方式和工具方式。
关键词:WebService测试
1、WebService简述
WebService是一种革命性的分布式计算技术,本质上就是服务提供方发布一些服务(实现一定功能的函数接口)到网络上,服务使用方如果使用到该服务的功能,直接在网络上调用服务接口就可以了,无需自己重新开发。
那么,服务使用方(我们称之为客户端)是如何使用服务方发布(我们称之为服务端)的WebService服务的呢?这里简要介绍:WebService发布后,其服务是封装在一个wsdl(Web Service Description Language,Web服务描述语言)文件中,客户端发请求主要是向发布好的wsdl地址以SOAP方式发请求,调用过程如下:
服务端生成服务描述文件,以供客户端获取。
客户端取得服务端的服务描述文件,解析该文件从而获得服务端的服务信息以及调用方式。
客户端指定调用方法和参数,生成恰当的SOAP请求消息,发往服务端,并等待服务端返回的SOAP回应消息。
服务端接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。并根据wsdl的描述,完成指定功能,将返回值放入SOAP回应消息返回给用户。
客户端解析得到的返回值。
使用WebService的优点是一次开发多次使用,且由于WebService的平台无关性特性,使用越来越多,所以对WebService的测试也就显得越来越重要。
2、WebService功能测试方法
WebService测试最基本的是功能测试,即验证功能的正确性。另外由于服务发布后会由多个客户端进行调用使用,所以性能测试也是一个重要测试内容。
本文只涉及了功能测试部分。功能测试分为编码方式(通过编码测试接口的正确性)和工具方式(通过测试工具测试接口的正确性)。
对于编码方式:WebService常用的框架有axis、xfier、cxf等,对应的有相应的测试方法。
对于工具方式,商用的就不考虑了,免费的工具中有TestMaker(较复杂,需要学习java和Python,学习曲线长)、WebInject(需要懂得soap原理,开发人员用得多)、WSCaller(工具过于简单,只能进行简单的功能测试)、soapUI开源版本(该工具由Java语言开发,有Eclipse插件。脚本语言Groovy是类Java的轻量级脚本语言。组织目录由TestSuit和TestCase构成)。其中的soapUI使用较多,尤其是对懂得Java的人来说上手较快。本文只对soapUI工具测试WebService的方式进行介绍。
3、编码方式
针对WebService常用的框架axis、xfire、cxf,该部分描述了4种WebService功能测试方法及其具体步骤。
使用的开发和测试环境是eclipse3.6.2。
具体步骤中使用了一个HelloWorld的例子进行说明,其中包含两个接口:
public interface HelloWorldService{
public String sayHello(String name);
public String sayWords(String…words);
}
函数功能如下:
Public class HelloWorldServiceImpl implements HelloWorldService{
Public String sayHello(String name){
String words = “Hello,World!”;
If(StringUtils.hasText(name)){
Words+=””+name;
}
System.out.println(words);
Return words;
}
Public String sayWords(String…words){
String theWords = “Hello,”;
If(words!=null){
theWords+=StringUtils.join(words);
}
Else{
theWords+=”nothing to say”;
}
System.out.println(theWords);
Return null;
}
}
3.1 使用Axis测试接口(wsdl服务地址)
该部分使用wsdl的服务地址进行测试。
注:axis包,是个WebService的工具。
官方地址:http://ws.apache.org/axis/
3.1.1 导入相应的包
需要导入的包如下14个:
Activemq-4.0-M3.jar
Axiom-api-1.2.7.jar
Axiom-impl-1.2.7.jar
Axis-1.4.jar
Axis2-1.4.jar
Commons-httpcliect-3.1-rcl.jar
Data-management-cli-1.2.2-app.jar
Dspace-lni-client-1.5.1-jar-with-dependencies.jar
Jsr173_1.0_api.jar
Neethi-2.0.1.jar
Openejb-itests-standalone-client-3.1.jar
Woden-api-1.0M8.jar
Wsdl4j-1.6.2.jar
Xmlschema-1.4.1.jar
3.1.2 编写测试代码
Helloworld的测试代码如下:
Package com.ruijie.samples.helloworld;(包名可以任意取)
Import org.apache.axis.client.Call;
Import org.apache.axis.cliect.Service;
Import javax.xml.namespace.Qname;
Public staic void main(String[] args){
Try{
String endpoint =
http://localhost:8089/HelloWorldServiceComponent/HelloWodldService;
Service service = new Service();
Call call = (Call)service.createCall();
Call.setTargeEndpointAddress(new java.net.URL(endpoind));
Call.setOperationName(new Qname(“http://HelloWorldService.sca.helloworld.samples.ruijie.com/”,”sayHello”));
Strings ret =(String)call.invoke(new Object[] {“aaa”});
System.out.println(“Sent ‘aaa’,got””+ret+””);
}
Catch(Exception e){
System.err.println(e.toSting());
}
}
或者:
Package com.ruijie.samples.helloworld;(包名可以任意取)
Import org.apache.axis.client.Call;
Import org.apache.axis.cliect.Service;
Import javax.xml.namespace.Qname;
Import javax.xml.rpc.ServiceException;
Import java.net.MalformedURLException;
Import java.rmi.RemoteException;
Public static void main(String[] args) throws RemoteException,ServiceException,MalformedURLException{
Service service = new Service();
Call call = (Call)service.createCall();
Call.setTargetEndpointAddress(new java.net.URL(“http://localhost:8089/HelloWorldServiceComponent/HelloWodldService;”))
Call.setOperationName(new Qname(“http://HelloWorldService.sca.helloworld.samples.ruijie.com/”,”sayHello”))
Call.setUseSOAPAction(true);
Call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
Call.setSOAPActionURI(“http://HelloWorldService.sca.helloworld.samples.ruijie.com/”,”sayHello”);
String k = (String)call.invoke(new Object[]{});//因为返回值是String类型,所以这里调用的返回值也是String类型
System.out.println(“>>>”+k);//返回值输出
}
3.2 使用Xfire测试接口(wsdl文件)
前置:创建测试工程。New-project-Dynamic Web Project
3.2.1 导入相应的包
需要导入的包如下6个:
Xfire-call-1.2.6.jar
Spring-core-2.0-rc2.jar
Commons-httpclient-3.1-rc1.jar
Data-management-cli-1.2.2-app.jar
Dspace-lni-client-1.5.1-jar-with-dependencies.jar
XmlSchema-1.4.1.jar
3.2.2将wsdl文件导入到工程的src目录下
3.2.3 编写测试代码
Helloworld的测试代码如下:
Package com.ruijie.samples.helloworld;(包名可以任意取)
Import org.codehaus.xfire.client.Client;
Import org.springframework.core.io.ClassPathResource;
Import org.springframework.core.io.Resource;
Public class WebServiceClientTest{
Public static void main(string[] args) throws Exception{
WebServiceClientTest test = new WebServiceClientTest();
Test.testClient();
}
Public void testClient() throws Exception{
String wsdl = “HelloWorldService.wsdl”;//对应的WSDL文件
Resource resource = new ClassPathResource(wsdl);
Client client = new Client(resource.getInputStream(),null);//根据WSDL创建客户实例
Object[] objArray = new Object[1];
objArray[0] = “tianXX”;//调用特定的Web Service方法
Object[] results = client.invoke(“sayHello”,objArray);
System.out.println(“result:”+results[0]);
}
}
3.3 使用Cxf的java2wsdl工具测试接口
该部分描述了使用cxf的java2wsdl工具(命令行方式)测试webservice接口步骤。
3.3.1 下载安装JDK并配置环境变量
也可直接使用开发环境eclipse的jdk。
3.3.1.1 打开下载地址
地址:(略)
3.3.1.2 下载、安装JDK
版本:jdk-6u7-windows-i586-p.exe
点击运行安装,选择默认安装目录:C:\Program Files\Java\jdk1.6.0_07
3.3.1.3 配置环境变量
JAVA_HOME= C:\Program Files\Java\jdk1.6.0_07
CLASSPATH=.; C:\Program Files\Java\jdk1.6.0_07\lib\tools.jar; C:\Program Files\Java\jdk1.6.0_07\lib\dt.jar; C:\Program Files\Java\jdk1.6.0_07\bin;
Path= C:\Program Files\Java\jdk1.6.0_07\bin;(这个放到path的开头)
3.3.1.4 验证安装
写一个简单的java程序来验证是否已安装成功:
Public class hello{
Pubilc static static void main(String args[]){
System.out.println(“Hello”);
}
}
将程序保存为文件名为hello.java的文件。
打开命令提示符窗口,进入到hello.java所在目录,键入下面的命令:
Javac hello.java
Java hello
此时若打印出来hello则安装成功,若没有打印出这句话,仔细检查以上配置是否正确。
3.3.2 下载配置cxf
3.3.2.1 打开下载地址
地址:(略)
3.3.2.2 下载cxf
版本:apache-cxf-2.4.0.zip
3.3.2.3 解压缩
解压缩到一个目录,我的目录是:G:\apache-cxf-2.4.0
3.3.2.4 配置环境变量
配置环境变量%CXF_HOME%=G:\apache-cxf-2.4.0(以我的目录为例)并在PATH后加上:%CXF_HOME%\bin
3.3.2.5 验证安装
打开cmd,进入G:\apache-cxf-2.4.0\bin目录,运行wsdl2java命令可成功。
注:Win7下转换目录需要输入/d参数,如cd /d g:\apache-cxf-2.4.0\bin
3.3.3 使用wsdl2java工具
Wsdl2java –d G:\src –client
-d 生成文件存放到哪里
-client 生成客户端类
3.3.4 测试代码编写
A、到eclipse中建立一个工程
B、将上一章节3中使用wsdl2java工具生成的代码拷贝到工程目录中,或直接用工具生成代码到工程中。
C、下载需要的jar包,导入到工程中。
包下载地址:(略)
方法:运行wsdl2java工具自动生成的client(此时服务需要处于可访问状态,可通过访问wsdl验证是否可访问),按照错误提示导入需要的包,直到client可运行成功,说明需要的包已经导入完全。
其中一个提示没有告诉具体的错误原因:No method error:com.sun.cml.bind.api.JAXBRIContext.Instance。需要下载jaxb-impl-2.1.13.jar(即最新的包),若没有最新的,2.1.8也可以,但是早期版本不支持,比如2.0.1就不可以。
我导入的包是下面12个(工程右键选择Properties-Java Build Path-Add External JARS或者直接导入到工程相应目录下——工程名 \WebContent\WEB-INF\lib):
Axis2-jws-api-1.4.1.jar
Axis2-saaj-1.2.jar
Axis2-saaj-api-1.3.jar
Commons-logging-1.1.1.jar
Jaxb-api-2.1.jar
Jaxb-impl-2.1.8.jar
Jaxb-xjc-2.1.7.jar
Jaxws-api-2.1.1-1.jar
Jaxws-rt-2.1.4.jar
Ow2-bundles-externals-jaxb2-1.0.9.jar
Streambuffer-0.8.jar
Wstx-asl-3.1.1.jar
D、编辑修改client代码,进行接口测试。(使用Junit即可)
3.4 Dynamic Client
Cxf也提供了一个不需要显性的生成java stub,参考网址:(略)
Wsdl2java静态方式调用和动态方式调用的区别:如果自己用java调用,那就自己生成stub,然后来调用;如果用Dynamic的话,其实也是Cxf帮你后台生成而已。
3.4.1 导入相应的包
需要导入的包如下14个:
Commons-logging-1.1.1.jar
Cxf-bundle-2.1.3.jar
Geronimo-activation_1.1_spec-1.0.2.jar
Geronimo-annotation_1.0_spec-1.1.1.jar
Geronimo-javamail_1.4_spec-1.5.jar
Geronimo-stax-api_1.0_spec-1.0.1.jar
Jaxb-api-2.1.jar
Jaxb-impl-2.1.8.jar
Jaxb-xjc-2.1.8.jar
Neethi-2.0.4.jar
Wsdl4j-1.6.2.jar
Wstx-asl-3.2.7.jar
Xml-resolver-1.2.jar
xmlSchema-1.4.2.jar
注:
JDK版本1.5
TOMCAT版本5.X
上述条件必须有,否则会在客户端提示包错误。
还有要特别注意在JDK(公供程序出问题时参考(本示例未做该项处理))
\%JAVA_HOME%\jre\lib\endorsed 目录或者 %tomcat_home%\common\endorsed 目录下必须要用到两个包:
Jaxb-api-2.1.jar
Jaxws-api-2.1.jar
否则会提示错误:(错误提示内容略)。
3.4.2 编写测试代码
Package dynamicSample;
Import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
Import org.apache.cxf.endpoint.Client;
Public class SampleTest{
Public static void main(String[] args) throws Exception{
SampleTest test = new SampleTest();
Test.testClient();
}
public void testClient() throws Exception{
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
//Client client = dcf.createClient(“HelloWorldService.wsdl”);
org.apache.cxf.endpoint.Client client = dcf.createClient(“http://localhost:8089/HelloWorldServiceComponent/HelloWorldService?wsdl”);
Object[] res = client.invoke(“sayHello”,”tianXX”);
System.out.println(“Response:”+res[0]);
}
}
4、工具soapUI方式
下面以测试服务HelloWorldService为例,详细说明使用工具soapUI进行WebService功能测试的操作步骤。
4.1 将WebService导入工程
A、单击‘File’->‘New soapUIProject’,如下图:
B、在弹出的对话框中输入待测试的ws信息,然后点击[OK]到下一步:
Project Name:HelloWorldService
Inital WSDL/WADL:
http://192.168.197.69:8089/HelloWorldServiceComponent/HelloWorldService?wsdl
Create Requests:选中
Create TestSuite:选中
Relative Paths:选中
C、保存project
4.2 创建初始的TestSuit和TestCase
A、生成初始的测试用例
选择One TestCase for each Operation:每个接口创建一个用例
选择Create new empty requests:创建一个空的请求
Operation:选择待测试的方式
选择Generates a default LoadTest for each created TestCase:每个用例生成一个负载测试(为后面性能测试做准备)
B、生成TestSuite
这里可根据习惯更改TestSuite的名称,如TestSuite:HelloWorldService。
C、在soapUI的左侧生成如下目录
4.3 设置TestCase的参数
A、创建项目的时候我们选择了Create sample requests for all operations,所以每个接口方法都会自动创建一个请求,如下图:
B、双击它就可以打开编辑面板,左边是请求内容,右边是响应内容。
打问号的地方是需要输入的参数,我们可以输入任意参数,这里输入tianxx,见下图:
4.4 执行TestCase
单击执行按钮执行,右侧Response页面查看结果。
根据反馈的结果判断请求是否发送成功(输入了参数tianxx,返回了结果Hello,World!tianxx)。
4.5 设置断言
为在测试中不用人为的进行接口功能是否正确的判断,因此加入断言Assertions。可由程序直接对返回结果进行判断。点击下图中绿色执行按钮后面的“+”来增加断言。
在弹出的“Secect Assertion”对话框中,选择“Contains”的断言,确定后弹出“Contains Assertion”对话框,在Content中填入内容,此处是表示返回的结果报文里应包含的字段,我们输入“Hello,World!tianxx”,点击OK。插入断言后,程序会在运行用例时,自动帮我们校验返回的结果报文是否包含“Hello,World!tianxx”内容。
工具下方的结果输出区域显示运行结果如下:
运行失败,因为实际结果应该是“Hello,”和“World!”之间应该有个空格,我们修改(双击Contains - FAILED)断言,在两个单词之间增加个空格,再次运行,结果如下:
4.6 执行TestSuit
可以一次执行一个或多个TestSuit。使用脚本语言Groovy控制。
5、总结
5.1 测试方法对比分析
编码方式适合做复杂的功能测试,根据难易程度,方法的使用顺序推荐:url方式、wsdl文件方式、wsdl2java方式(动态、静态)。
5.2 后记
本文算是对自己前段工作做的一个笔记或叫总结,不对的地方还请不吝赐教。
- webservice功能测试
- WebService 功能测试
- WebService 功能测试
- webservice接口功能自动化测试准备工作
- SOAP对webservice进行接口功能测试
- SOAP WebService接口功能自动化测试
- webService测试
- WebService常用功能讲解
- WebService常用功能讲解
- Spring 集成 Webservice功能
- WebService常用功能讲解
- webservice编写天气预报功能
- WebService简单功能实现
- Java Web Service using Eclipse (Eclipse提供的自动生成webservice接口,endpoint的功能,以及自动测试webservice的功能)
- 测试 功能
- 功能测试
- 功能测试
- 功能测试
- C语言深度解剖 笔记5
- 那夜 那雨 那情
- sharepoint2010首页显示子网列表方法
- SVN Eclipse插件Subclipse安装和配置
- The Product License has not been initialized.
- WebService 功能测试
- SQL server基础(三)
- 大端和小端存储
- 大爱无疆----雨中情
- 网页自动跳转代码搜集
- jmeter使用
- C#与C/C++的交互 转自(warensoft)
- 一步步优化JVM一:概述、方法及需求
- UVA - 11666 Logarithms