平台服务器测试3—接口测试工具实现

    平台服务器的接口测试用例及测试数据准备完毕后,接下来的工作就是如何去进行接口功能测试了,如果使用客户端来进行平台服务器的接口测试,不但某些测试用例无法进行覆盖(例如上传不合法的版本号),而且有的输入值需要通过客户端复杂的操作才能实现,现在我们需要能方便定制输入数据的工具来协助进行接口测试。

一、工具页面设计

  开始对所需要的接口功能测试工具进行设计,根据测试人员能够对每个测试接口输入定制的测试数据、然后能够查看输出结果,平台服务器接口通讯遵循HTTPHTTPS协议,因此测试工具可以使用Web浏览器来做为测试数据的通讯载体,使用Dreamweaver工具进行测试工具的布局设计:

    左侧是待测试接口的集合,通过表格进行排列,点击左侧的接口名称,将会在右侧显示相应的接口页面,测试人员在输入参数栏中进行测试数据的设置,点击【提交】按键即将接口测试值发给平台服务器,响应消息将会在输出结果栏中直接显示。具体代码见:

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <title>平台服务器接口测试工具</title>
6 </head>
7 <frameset rows="60,*" cols="*" frameborder="no" border="0" framespacing="0">
8 <frame src="head.html" name="topFrame" scrolling="no" noresize="noresize" id="topFrame" title="topFrame" />
9 <frameset rows="*" cols="280,*" framespacing="0" frameborder="no" border="0">
10 <frame src="left.html" name="leftFrame" scrolling="auto" noresize="noresize" id="leftFrame" title="leftFrame" />
11 <frame src="userLogin.html" name="mainFrame" id="mainFrame" title="mainFrame" />
12 </frameset>
13 </frameset>
14 <noframes><body></body></noframes>
15 </html>

『备注』

Ø  接口功能测试工具没有平台服务器IP地址的设置,是因为平台服务器是通过域名访问,可以修改hosts文件来访问指定的平台服务器。

二、测试工具实现

1、接口消息数据封装

    Web浏览器尽管能够帮助我们进行发送和接收HTTP消息操作、但是每个接口HTTP消息体内容通过web浏览器无法进行封装,因此我将使用jQuery库、通过javascript脚本来进行接口数据封装操作,以用户登录接口为例,数据封装代码为:

 1 <script type="text/javascript" src="jquery-1.4.js"></script>
2 <script type="text/javascript">
3 function showXml(){
4 $.ajaxSetup({cache:false});
5 $.ajax({
6 url:'http://www.ceshi.com/outer/server.action', //异步方法
7 type: 'GET',
8 dataType: 'xml', //这里可以不写,但千万别写text或者html!!!
9 data: $('#userLoginForm').serialize(), //传入的测试参数
10 error: function(){ //返回失败
11 alert('Error loading XML document');
12 },
13
14 success: function(xml){ //返回成功
15 var text='';
16 var webKey=$(xml).find("webKey").text();
17 var userID=$(xml).find("userID").text();
18 var resultCode=$(xml).find("resultCode").text();
19 //如果成功,写入webkey到cookie
20 if('0'==resultCode){
21 document.cookie='webKey='+webKey;
22 document.cookie='userID='+userID;
23 }
24 text+='<res>'+'\n';
25 text+='<resultCode>'+$(xml).find("resultCode").text()+'</resultCode>'+'\n';
26 text+='<userID>'+$(xml).find("userID").text()+'</userID>'+'\n';
27 text+='<loginName>'+$(xml).find("loginName").text()+'</loginName>'+'\n';
28 text+='<nickName>'+$(xml).find("nickName").text()+'</nickName>'+'\n';
29 text+='<webKey>'+$(xml).find("webKey").text()+'</webKey>'+'\n';
30 text+='<emailstatus>'+$(xml).find("emailstatus").text()+'</emailstatus>'+'\n';
31 text+='<gymkanaCodes>'+$(xml).find("gymkanaCodes").text()+'</gymkanaCodes>'+'\n';
32 text+='<talkenable>'+$(xml).find("talkenable").text()+'</talkenable>'+'\n';
33 text+='<watchenable>'+$(xml).find("watchenable").text()+'</watchenable>'+'\n';
34 text+='<userMemberType>'+$(xml).find("userMemberType").text()+'</userMemberType>'+'\n';
35 text+='<vipExpireDate>'+$(xml).find("vipExpireDate").text()+'</vipExpireDate>'+'\n';
36 text+='</res>';
37 document.getElementById('showXmlText').value=text;
38 }
39 });
40 }
41 </script>

    用户每次成功登录平台时,会由平台服务器通过(userID+系统时间串+随机数)再经MD5算法计算出一个唯一值webkey,如果测试基本资料查询、密码修改、好友信息查询、游戏经验值查询等接口时,都需要在被调用接口中输入登录时的userIDwebkey,如果在测试这些接口时,都需要人工先调用用户登录接口,再将userIDwebkey的值copy到被调用接口的输入项中将会非常繁琐,因此将通过cookie来进行userIDwebkey的自动填充。

    在使用接口功能测试工具时,都需先通过用户登录接口进行一次登录,然后在测试用户基本资料查询、密码修改、好友信息查询、游戏经验值查询等接口时,无需用户输入userIDwebkey,将会通过javascript脚本将cookie中登录生成的userIDwebkey取出,并自动填充被测试接口的userIDwebkey相应项。

登录成功写入userIDwebkeycookie中的代码可见:用户登录接口的消息封装脚本;自动调用userIDwebkey的脚本代码为:

 1 function getCookieByName(name){
2 //获取cookie字符串
3 var strCookie=document.cookie;
4 //将多cookie切割为多个名/值对
5 var arrCookie=strCookie.split("; ");
6 //遍历cookie数组,处理每个cookie对
7 for(var i=0;i<arrCookie.length;i++){
8 var arr=arrCookie[i].split("=");
9
10 //找到名称为userId的cookie,并返回它的值
11 if(name==arr[0]){
12 if( typeof arr[1]=='undefined')return '';
13 return arr[1];
14 }
15 }
16 return '';
17 }
18
19 function showUseIdAndWebKey(){
20
21 setElementVal('webKey');
22 setElementVal('userID');
23
24 }
25
26 function setElementVal(elementName){
27 var webkeys=document.getElementsByName(elementName);
28 if( typeof webkeys=='undefined')return '';
29 if(webkeys&&webkeys.length>0){
30 var webkey=getCookieByName(elementName);
31 webkeys[0].value=webkey;
32 }
33
34
35 }
36 window.onload=showUseIdAndWebKey;

在用户基本资料查询、密码修改、好友信息查询、游戏经验值查询等需要自动填充userIDwebkey的接口页面加入调用上述脚本的语句即可。

1 <script type="text/javascript" src="showWebKey.js"></script>

『备注』

Ø  接口如果涉及到验证码,其实现原理和webkey类似,通过记录在cookie中,然后需要时通过脚本调出自动填充即可。

3、鉴权有效时间

    现在接口测试工具的关键代码实现已经完成,但还面临一个问题:接口输入中的webkey是通过客户端间隔5分钟发送的心跳包到平台服务器来保证其有效性,如果服务器在规定时间内未收到客户端相应userID发送的心跳包,则超时之后webkey将无效,接口发送无效webkey将会让平台服务器返回鉴权不通过响应。

    此项鉴权功能如果通过接口测试工具代码解决的话,将会比较麻烦:1)需要在用户登录接口页面中加入成功后自动发送心跳包的代码;2)如果测试人员想更换userIDwebkey时,还需要先停止心跳包的发送,因此跟服务器开发人员沟通后,平台服务器增加webkey有效时间的设置,测试人员在进行平台服务器接口功能测试时,可通过配置来将服务器未收到心跳包在判断webkey无效的超时时间加长,此项功能开发人员的工作量并不大,鉴权有效时间问题解决,测试过程中沟通合作很重要。

    平台服务器接口功能测试工具实现完成,最后需要做的工作就是在测试之前将数据库表及数据进行备份,在每轮次功能测试开始时,可重新导入进行数据库还原,避免上次测试数据对预计测试结果的干扰,然后就可以按照设计的接口用例和准备好的测试数据进行功能测试了。

后续工作:后期会对平台服务器接口测试工具进行功能扩展,需要扩展的功能有:

1)每个接口页面添加“保存”功能,测试人员可以将此接口设置的测试数据与服务器返回的输出结果进行保存,并且要加上之前调用用户登录接口时的数据;

2)每个接口页面添加“打开”功能,测试人员将保存的测试数据和测试结果读出;

3)主页面添加“批量执行”功能,测试人员通过勾选已有保存好的测试数据接口,然后工具将自动执行接口测试,并将接口返回结果与保存的测试结果进行比对,不一致的话批量执行完毕后显示出来。祝愿我的思路能够成功!



posted @ 2011-10-19 11:02  〖寻觅〗  阅读(4629)  评论(0编辑  收藏  举报