WebService测试方案
1.WebService简介
WebService是一种革命性的分布式计算技术,本质上就是网络上可用的API,可以直接在网络环境调用的方法。
WebService常用的框架有axis、xfire、cxf等。
WebService发布后,其服务是封装在一个wsdl(Web Services Description Language,Web服务描述语言)文件中,客户端发请求主要是向发布好的wsdl地址以SOAP方式发请求,调用过程如下:
Ø 服务端:
n 生成服务描述文件,以供客户端获取。
n 接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。
n 根据wsdl和wsml的描述,调用相应的COM对象来完成指定功能,并把返回值放入SOAP回应消息返回给用户。
Ø 客户端:
n 取得服务端的服务描述文件,解析该文件从而获得服务端的服务信息以及调用方式。
n 指定调用方法和参数,生成恰当的SOAP请求消息,发往服务端。
n 等待服务端返回的SOAP回应消息,解析得到返回值。
2.WebService测试说明
WebService的测试主要围绕功能测试、性能测试和安全性测试展开,下面主要描述WebService三大测试的要点。
2.1 WebService功能测试
测试目的:测试系统所实现WebService接口的功能。
进入条件:开发人员提供已实现功能的程序包,和待测试webservice的方法名、参数以及实现的功能描述。
测试要点:不同的参数组合,应按设计要求返回相应的信息。
2.2 WebService性能测试
测试目的:测试系统所实现WebService接口的性能。进入条件:WebService接口的功能测试已完毕。
测试要点:测试并发调用WebService接口,观察其性能表现,主要是在不同的并发量、持续运行时间和数据库不同容量下,事务的响应时间、总事务数、事务的成功率、点击率等,同时监控硬件资源的消耗情况。
2.3 WebService安全性测试
测试目的:测试系统所实现WebService接口的安全性。
进入条件:WebService接口的功能测试已完毕。
测试要点:测试WebService接口的调用是否有用户名、密码验证,恶意调用是否会导致系统崩溃等。
3.WebService功能测试
目前掌握的测试工具soapUI可以进行WebService的功能测试,下面以测试存储服务的PIXManager接口详细介绍使用soapUI进行WebService功能测试的操作步骤。
3.1 新建工程
1、单击‘File’->‘ New soapUI Project’,如下图:
2、在弹出的对话框中输入待测试的ws信息,然后点击 [OK] 到下一步
Project Name:PIXManager
Initial WSDL/WADL:http://192.168.2.51:8181/WEB-INF/services/PIXManager?wsdl
Create Requests:选中
Create TestSuite:选中
Relative Paths:选中
3、保存project
4、生成初始的测试用例
选择One TestCase for each Operation:每个接口创建一个用例
选择Create new empty requests:创建一个空的请求
Operations:选择待测试的方法
选择Generates a default LoadTest for each created TeseCase:每个用例生成一个负责测试(为后面性能测试做准备)
5、生成TestSuite
这里可以根据习惯更改TestSuite的名称,如TestSuite:PIXManager。
6、在soapUI的左侧生成如下目录
此时新建project已完成!
3.2 发送请求
1、创建项目的时候我们选择了Create sample requests for all operations,所以每个接口方法都会自动创建一个请求,如下图:
2、双击它就可以打开编辑面板,左边是请求内容,右边是响应内容。
3、在Form页面输入参数,单击 按钮执行,右侧查看结果。
根据反馈的结果判断请求是否发送成功。
输入的xml内容如下:
|
<?xml version="1.0" encoding="GB2312"?> <V_PATIENTREGC99999999 xsi:noNamespaceSchemaLocation="PATIENTREGC99999999.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <MEDICALSERVICE_NO>01</MEDICALSERVICE_NO> <NAME>小花</NAME> <BIRTH_DATE>1988-02-01T00:00:00</BIRTH_DATE> <GENDER_CD>1</GENDER_CD> <GENDER_VALUE>男性</GENDER_VALUE> <MARITAL_ST_CD>10</MARITAL_ST_CD> <MARITAL_ST_VALUE>未婚</MARITAL_ST_VALUE> <ID_NO_CD>01</ID_NO_CD> <ID_NO_VALUE>居民身份证</ID_NO_VALUE> <ID_NO>12586</ID_NO> <MEDICARE_CD>01</MEDICARE_CD> <MEDICARE_VALUE>社会基本医疗保险</MEDICARE_VALUE> <MEDICAL_INSURANCE_NO>Y001</MEDICAL_INSURANCE_NO> <AR_CD>111</AR_CD> <AD_CD>01</AD_CD> <AD_VALUE>户籍住址</AD_VALUE> <PROVINCE_NAME>上海</PROVINCE_NAME> <CITY_NAME>上海</CITY_NAME> <AREA_NAME>浦东区</AREA_NAME> <STREET_ID>霞飞路</STREET_ID> <VILLAGE_NAME>街</VILLAGE_NAME> <HOUSE_NO>门牌号</HOUSE_NO> <TEL_TYPE_CD>01</TEL_TYPE_CD> <TEL_TYPE_VALUE>本人电话</TEL_TYPE_VALUE> <TEL_NO>1232312</TEL_NO> <REGISTER_DATE>2010-09-27T14:31:00</REGISTER_DATE> <RECORDER_NAME>小芳</RECORDER_NAME> <REGISTER_PERSON_CODE>01</REGISTER_PERSON_CODE> <REGISTER_ORG_CODE>01</REGISTER_ORG_CODE> <REGISTER_ORG_NAME>中科</REGISTER_ORG_NAME> <SEND_TIME>2010-09-27T14:32:00</SEND_TIME> <SEND_ORG_CODE>798921772</SEND_ORG_CODE> <SEND_SYSTEM>222222222222</SEND_SYSTEM> </V_PATIENTREGC99999999> |
4.WebService性能测试
目前掌握的是两个测试工具soapUI和LoadRunner,其中soapUI可以进行WebService的功能和性能测试,而LoadRunner主要是性能测试。
下面分别介绍两个工具进行WebService性能测试的步骤。
4.1 采用soapUI测试步骤
基于前面soapUI功能测试的步骤,若已成功,可将脚本参数化后用于性能测试,具体步骤如下:
4.1.1 数据生成器
1、右键单击Test Steps,‘Add Step’->‘DataGen’,如下图:
2、输入步骤名称
3、设置生成方法
1) 点击 新建
2) 定义名称和类型
Name:自定义,如MEDICALSERVICE_NO
Type:选择‘Number’型,
3) 设置为‘Randomize instead of step’
4.1.2 参数化
打开待参数化的请求,找到需参数化的内容,选中并右键单击,如下图:。
选择‘Get Data’->‘Step 1:[DataGen]’->‘property [MEDICALSERVICE_NO]’
原来的数据被替换为:${DataGen#MEDICALSERVICE_NO}
4.1.3 场景执行和监控
1、打开‘TestSuite:PIXManager’->‘registerPatientInterface’->‘Load Tests’->‘registerPatientInterface’
2、设置并发线程,单击 执行测试
4.1.4 结果分析
4.2 采用LoadRunner测试步骤
4.2.1 脚本准备
1.选择协议
2、导入wsdl
3、Add Service Call
设置好后生成如下脚本:
|
web_service_call( "StepName=registerPatientInterface_101", "SOAPMethod=PIXManager_Service|PIXManager_ServicePort|registerPatientInterface", "ResponseParam=response", "Service=PIXManager_Service", "ExpectedResponse=SoapResult", "Snapshot=t1294907356.inf", BEGIN_ARGUMENTS, "msgID=", "sendMsgOrgID=", "sendMsgPosID=", "eventDateTime=", "eventDateTimeSpecified=", "xml=", END_ARGUMENTS, BEGIN_RESULT, "return=Param_return", END_RESULT, LAST); |
4、输入参数
1)输入msgID、sendMsgOrgID、sendMsgPosID、eventDateTime、eventDateTimeSpecified;
|
"msgID=11111", "sendMsgOrgID=111111", "sendMsgPosID=111111", "eventDateTime=2011-01-12 10:10:10", "eventDateTimeSpecified=true", |
2)输入Xml;
|
"xml=<?xml version="1.0" encoding="GB2312"?> " "<V_PATIENTREGC99999999 xsi:noNamespaceSchemaLocation="PATIENTREGC99999999.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">" " <MEDICALSERVICE_NO>01</MEDICALSERVICE_NO>" " <NAME>小花</NAME>" " <BIRTH_DATE>1988-02-01T00:00:00</BIRTH_DATE>" " <GENDER_CD>1</GENDER_CD>" " <GENDER_VALUE>男性</GENDER_VALUE>" " <MARITAL_ST_CD>10</MARITAL_ST_CD>" " <MARITAL_ST_VALUE>未婚</MARITAL_ST_VALUE>" " <ID_NO_CD>01</ID_NO_CD>" " <ID_NO_VALUE>居民身份证</ID_NO_VALUE>" " <ID_NO>13504568756</ID_NO>" " <MEDICARE_CD>01</MEDICARE_CD>" " <MEDICARE_VALUE>社会基本医疗保险</MEDICARE_VALUE>" " <MEDICAL_INSURANCE_NO>Y001</MEDICAL_INSURANCE_NO>" " <AR_CD>111</AR_CD>" " <AD_CD>01</AD_CD>" " <AD_VALUE>户籍住址</AD_VALUE>" " <PROVINCE_NAME>上海</PROVINCE_NAME>" " <CITY_NAME>上海</CITY_NAME>" " <AREA_NAME>浦东区</AREA_NAME>" " <STREET_ID>霞飞路</STREET_ID>" " <VILLAGE_NAME>街</VILLAGE_NAME>" " <HOUSE_NO>门牌号</HOUSE_NO>" " <TEL_TYPE_CD>01</TEL_TYPE_CD>" " <TEL_TYPE_VALUE>本人电话</TEL_TYPE_VALUE>" " <TEL_NO>1232312</TEL_NO>" " <REGISTER_DATE>2010-09-27T14:31:00</REGISTER_DATE>" " <RECORDER_NAME>小芳</RECORDER_NAME>" " <REGISTER_PERSON_CODE>01</REGISTER_PERSON_CODE>" " <REGISTER_ORG_CODE>01</REGISTER_ORG_CODE>" " <REGISTER_ORG_NAME>中科</REGISTER_ORG_NAME>" " <SEND_TIME>2010-09-27T14:32:00</SEND_TIME>" " <SEND_ORG_CODE>798921772</SEND_ORG_CODE>" " <SEND_SYSTEM>222222222222</SEND_SYSTEM>" " </V_PATIENTREGC99999999>", |
5、脚本增强
1)参数化;
2)增加事务并打印返回结果;
|
lr_start_transaction("registerPatientInterface"); |
|
if (strstr(lr_eval_string("{Param_return}"),"C99999999$")==NULL) { if (strstr(lr_eval_string("{Param_return}"),"empty!")==NULL) { lr_end_transaction("registerPatientInterface", LR_STOP); lr_output_message(lr_eval_string("出错了!返回的信息如下:{Param_return}")); } else{ lr_end_transaction("registerPatientInterface", LR_FAIL); lr_output_message(lr_eval_string("请求成功,保存失败!返回的信息如下:{Param_return}")); } } else{ lr_end_transaction("registerPatientInterface", LR_PASS); lr_output_message(lr_eval_string("请求成功,保存成功!返回的信息如下:{Param_return}")); } |
3)调试;
在run-time settings中设置增强日志类型,以便看到更详细的信息。
调试完成后调整为:Send messages only when an error occurs
4)去掉默认的事务划分;
4.2.2 场景执行和监控
1、脚本调试成功后,点击‘Tools’->‘Create Controller Scenario’,如下图:
2、设置虚拟用户数,如下图:
3、调整虚拟用户的增长、下降方式
4.2.3 结果分析
4.WebService安全性测试
暂无
WebService测试方案的更多相关文章
- 从Google开源RE2库学习到的C++测试方案
最近因为科研需求,一直在研究Google的开源RE2库(正则表达式识别库),库源码体积庞大,用C++写的,对于我这个以前专供Java的人来说真的是一件很痛苦的事,每天只能啃一点点.今天研究了下里面用到 ...
- webservice测试实例
webservice测试实例(LR8.1) 接口声明:这个接口是sina的短信服务接口,我只是用来做脚本学习使用,不会对其产生压力:希望读者也只是用来进行录制学习,而不是产生压力. 接口文档:http ...
- 基于soapUI构建WebService测试框架
基于soapUI构建WebService测试框架 http://www.docin.com/p-775523285.html
- Android MediaCodec硬编兼容性测试方案
作者:阿宝 更新:2016-08-15 来源:彩色世界(https://blog.hz601.org/2016/08/15/android-mediacodec-hardcode-compatibil ...
- HttpDNS的坑以及一个针对安卓不太完善的测试方案
背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...
- webservice 测试页面
转载:http://www.cnblogs.com/JuneZhang/archive/2013/01/24/net.html 解决WebService 测试窗体只能用于来自本地计算机的请求 问题: ...
- 从轻测到上线,WeTest与《一起来捉妖》测试方案大公开
从2016年Pokémon GO引发的AR游戏热潮开始,国内就一直在期待新的一款具备代表性的AR游戏的头部作品. 4月11日的腾讯首款AR探索手游<一起来捉妖>不仅为国内市场注入了新的活力 ...
- Memory及其controller芯片整体测试方案(下篇)
{ 第三部分 } DDR总线的设计.调试和验证 在计算机架构中,DDR作为程序运算的动态存储器,面对如高性能计算.图形计算.移动计算.工业应用等领域的要求,发展出DDR4,以及用于图形计算的G ...
- Memory及其controller芯片整体测试方案(上篇)
如果你最近想买手机,没准儿你一看价格会被吓到手机什么时候偷偷涨价啦! 其实对于手机涨价,手机制造商也是有苦难言,其中一个显著的原因是存储器芯片价格的上涨↗↗↗ >>> 存储器memo ...
随机推荐
- Java List&Map简单初始化方法
Java中List与Map初始化的一些写法 // InitCollections.java - sample of init collect package com.util; import java ...
- svn 中commit时必须填写备注信息如何设置
在软件开发团队中总是有人忘记添加备注信息,可以通过下面方式进行设置,从而在commit时强制需要填写备注信息. 在服务端选中需要设置的项目进行设置. 选中项目右键,"所以任务"-& ...
- HDU2639[背包第K大]
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=2639] 题意:求第k大背包. 题解:利用二路归并的思想,求解第K大的值. #include<bi ...
- HTML下直接调用Less文件
虽然有很多编译Less的插件可以使用 , 但是在开发的时候 , 每修改一次less代码就编译一次less文件 , 很明显效率就太低了 , 接下来为大家介绍一个直接在html的link标签中引入.les ...
- android 操蛋的gradle
首先看语法: -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {cl ...
- eclipse设置JSP的默认编码
有时候我们新建一个JSP页面,但是编码却不是我们想要的,我们可在eclipse里面进行如下设置: 点击eclipse上面的window-->preferences 输入查找jsp-->点击 ...
- POJ 2656 Unhappy Jinjin
#include <stdio.h> int main() { ) { int i, n; ; scanf("%d", &n); ) break; ; i &l ...
- line-height:2、line-height:2em、line-height:200%的区别
文章来源: http://www.zhihu.com/question/20394889 总结: 1.line-height:2em.line-height:200% 根据父元素的字体大小计算行高 ...
- scroll、client和offset的区别
scroll.client和offset的区别:http://www.cnblogs.com/pcd12321/p/4448420.html
- 判断一个数是否为2的n次幂
参考:http://bbs.csdn.net/topics/370058619 如题,如何判断一个整数是否是2的N次方,我能想到的方法有两个 1.一直除2,看最后是否等于1.(最笨的方法) 2.转换成 ...