【举例2】
背景:
某系统M对外开放了3个基于SOAP协议的接口,而每个接口都提供了多达数十种的业务操作,而业务操作可能有先后依赖关系。
工作平台:
OS:Solaris 9.0
DB:Oracle
WebService:Weblogic 8.1
Develop Language:Java
测试工作场景:
构造不同业务的xml文件,比如开帐号(addUser.xml),修改帐号信息(mdifyUser.xml)等,用xmlspy发送,然后验证返回信息是否
正确;
测试困难分析:
1、 然后用xmlspy工具一次发一条的方式来进行回归,需要大量的重复劳动;每次回归测试接口,都要制作达30个以上的xml文件,由于系统M的特殊性,工作环境不能直连,只能通过一台Linux服务器或者一台windows 2003server服务器中转,此windows服务器上安装有xmlspy,但windows服务器的远程连接license只有2个,经常抢不到连接,后果就是延误测试时间或者加班测试;
需求分析:
由于Linux服务器不受连接限制,我们可以通过Linux服务器来发送
xml文件给接口,不受windows的license限制;
2、 需要编写工具,能批量发送xml文件给接口服务;
3、 需要该工具能按定义顺序发送xml文件并检查返回结果是否正确,并打印出返回结果的关键字信息,供判断出错问题所在;
4、 对于该测试工具,更主要的是要能实现可配置,比如接口个数、文件发送顺序、参数化字段、主关键字值等;
工具实现步骤:
对于需求1,我们需要知道如何发送xml文件到接口服务端口(笔者开始在此事想用基于soap协议的jar来构建xml文件,后来由于需要回归的xml文件太多,全部参数化不太现实,就改用文件发送方式。此处可以共享一下笔者借鉴的东西,大家可以到网上搜索SOAPClient4XG关键字);
对于需求2,其实很简单,知道Java取文件夹和文件操作、循环操作即可;
对于需求3,也很简单,知道Java的文件流操作和BufferedReader类操作即可;
对于需求4,在上面例子1中的测试工具编写要求中的第5点已说明;
部分代码:
try{
// 建立同接口之间的连接,以备发送接口文件。
URL url = new URL(SOAPUrl);
URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;
// 打开输入的接口xml文件
FileInputStream fin = new FileInputStream(xmlFile2Send);
// 初始一个空的字节输出流
ByteArrayOutputStream bout = new ByteArrayOutputStream();
copy(fin,bout);
fin.close();
byte[] b =null;
// 进行模板的参数替换
b=getReplace(bout,interface_index,xml_file);
// 设置HTTP参数 httpConn.setRequestProperty("Content-Length",String.valueOf(b.length));
httpConn.setRequestProperty("Content-Type","text/xml; charset=utf-8");
httpConn.setRequestProperty("SOAPAction",SOAPAction);
httpConn.setRequestMethod( "POST" );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
// 发送接口文件,发送完毕后关闭输出流
OutputStream out = httpConn.getOutputStream();
out.write(b);
out.close();
// 从对话通道中读取接口返回信息。
//System.out.println(xml_file);
outlog.println("------"+xml_path+"------");
InputStreamReader isr = new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);
String inputLine;
int int_start;
int int_end;
String str_inputLine="";
// 不断循环从通道中读取返回信息,直至读取为空
while ((inputLine = in.readLine()) != null){
str_inputLine=str_inputLine+inputLine;
}
// 打印resultNo节点的信息
int_start=str_inputLine.indexOf("ext:resultNo");
int_end=str_inputLine.indexOf("/ext:resultNo");
if(str_inputLine.indexOf("ext:resultNo")>=0){
outlog.println(xml_file+" : "+str_inputLine.substring(int_start-1,int_end+14));
}