基于http协议的接口测试(1)

1、系统与系统之间的调用,比如银行会提供接口供电子商务网站调用,或者说,支付宝会提供接口给淘宝调用 
2、上层服务对下层服务的调用,比如service层会调用DAO层的接口,而应用层又会调用服务层提供的接口,一般会通过 
3、服务之间的调用,比如注册用户时,会先调用用户查询的服务,查看该用户是否已经注册。 


而我们所要做的接口测试,先要了解是基于哪一种类型的接口测试,不同类型的接口测试方法可能是不一致的
http协议的接口测试,一般会用jmeter去测试,jmeter的好处是不用写测试代码,直接使用jmeter提供的http请求去测试,也可以使用HTTPClient去测试,好处是可以方便集成和自动化

以下代码待分类进行改进,仅为参考

接口测试案例:

应用数据同步接口
A平台需要将游戏的appid和appname同步给交易支撑B平台。同步接口需要进行签名和验签。算法和秘钥与支付接口保持一致。

一).接口约定:
1、接口均采用http协议,POST方法。
2、应用数据同步请求参数为transdata、sign。transdata为具体业务参数,数据格式为json格式;sign为transdata的签名数据。具体呈现方式为transdata=xxxx&sign=yyyy,其中yyyy就是对xxxx的签名数据,yyyy=rsa(md5(xxxx))。收到数据后需对签名进行验证。
3、A平台需要以双方约定的密钥对请求数据进行签名。

二).参数列表:

参数名称

参数含义

数据类型

是否可选

参数说明

opertype

数据操作类型

integer

必填

数据操作类型:

– 新增

– 变更

– 删除

appid

应用编号

String

必填

A平台给游戏分配的appid

appname

应用名称

String

必填

游戏名称


三).样例:
请求数据(http包体数据):
transdata={"opertype":0,"appid":"33213","appname":"测试游戏"}&sign=d91cbc584316b9d99919921a9

成功应答数据(http包体数据):
{"code":"0000","errmsg":"数据同步成功"}
失败应答
{"code":"9999","errmsg":"参数列表不符合规范"}  ,还有其它的code代码:9994、9998等

接口请求地址:http://192.168.0.140:8101/pismire/sfyan/syncAppData.lzyhjfs
实现代码如下:

[java]  view plain  copy
  1. /** 
  2.      * 使用 HttpClient 需要以下 5 个步骤: 
  3.         1. 创建 HttpClient 的实例 
  4.         2. 创建某种连接方法的实例,在这里是 httppost<span style="font-family:Arial,Helvetica,sans-serif">,在httppost 的构造函数中传入待连接的地址</span> 
  5.         3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例 
  6.         4. 读 response 
  7.         5. 释放连接。无论执行方法是否成功,都必须释放连接 
  8.       */  
  9.   
  10.     public static String conResult, encrypt_app, encrypt_sign;  
  11.     public static String smsUrl = "http://192.168.0.140:8101/pismire/sfyan/syncAppData.lzyhjfs";  
  12.       
  13.     @Test  
  14.     public static void sendSms() throws Exception {  
  15.         //初始化httpclient    
  16.         HttpClient httpclient = new DefaultHttpClient();  
  17.         //获取httppost   
  18.         HttpPost httppost = new HttpPost(smsUrl);         
  19.         try {  
  20.             //添加参数  
  21.             List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
  22.             nameValuePairs.add(new BasicNameValuePair("transdata",encrypt_app()));  
  23.             nameValuePairs.add(new BasicNameValuePair("sign", encrypt_sign()));  
  24.   
  25.             //设置报文头以及参数的格式  
  26.             httppost.addHeader("Content-type","application/x-www-form-urlencoded");  
  27.             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));  
  28.             //执行post请求    
  29.             HttpResponse response = httpclient.execute(httppost);  
  30.               
  31.             //打印服务器返回的状态  
  32.             System.out.println("服务器返回的状态:"+response.getStatusLine().getStatusCode());  
  33.             // if (response.getStatusLine().getStatusCode() == 200)   
  34.             /** 
  35.              * 读返回数据 
  36.              * */  
  37.             conResult = EntityUtils.toString(response.getEntity());  
  38.             System.out.println(conResult);  
  39.               
  40.             //断开连接  
  41.             httpclient.getConnectionManager().shutdown();   
  42.   
  43.         } catch (ClientProtocolException e) {  
  44.             e.printStackTrace();  
  45.         } catch (IOException e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.           
  49.         // return conResult;  
  50.     }  
  51.   
  52.     /** 
  53.      * 拼接transdata数据 
  54.      * */  
  55.     public static String encrypt_app() throws Exception {  
  56.         int opertype = 1;  
  57.         String appid = "2001850000000320311";  
  58.         String appname = "同步数据11";  
  59.   
  60.         String transdata = "{\"appid\":\"" + appid + "\",\"appname\":\""+ appname + "\",\"opertype\":" + opertype + "}";  
  61.         encrypt_app = transdata;  
  62.         System.out.println("transdata:" + encrypt_app);  
  63.   
  64.         return encrypt_app;  
  65.     }  
  66.   
  67.     /** 
  68.      * 用MD5算法对transdata进行加密 
  69.      * */  
  70.     public static String encrypt_sign() throws Exception {  
  71.         // sign签名秘钥,key1 和mod为后台固定的秘钥  
  72.         BigInteger key1 = new BigInteger(EncryptorUtils.getDecryptionString("2SWUfsOjTTBpLfyWSNnXvvA37WLqvpUuOnIN9sjW6U4="));  
  73.         BigInteger mod = new BigInteger(EncryptorUtils.getDecryptionString("+9mTlYq/DeqPDwNuvyuLI4eHw03rdP5w0O+bzb1uMcTASSC2AH381WeGO70wv9jm"));  
  74.   
  75.         String desc = RSAUtil.encrypt(MD5.md5Digest(encrypt_app), key1, mod);  
  76.         encrypt_sign = desc;  
  77.         System.out.println("sign:" + encrypt_sign);  
  78.   
  79.         return encrypt_sign;  
  80.     }  

-----------------------TestNg执行完成输出的日志

transdata:{"appid":"2001850000000320311","appname":" 同步数据11 ","opertype":0}
sign:3f58b89e2e1efd0f104cf0cc891bf6c 4d07cd4c898c0df22af83776e1d04bbc 36339c09d26c267d381ed4682fff9392 
服务器返回的状态:200
{"code":"0000","errmsg":"数据同步成功"}

PASSED: sendSms
输出请求地址:
System.out.println("请求地址:"+smsUrl+EntityUtils.toString(httppost.getEntity()));

可以使用Firefox的一个插件:HttpRequester 模拟发送请求(请求URL、传输方法、参数)


备注:

比较蛋疼的问题就是httpclient4.3版本,会自动的保存cookies,其它接口直接引用登陆的cookies,偶尔会出现失败,如果输出该cookies信息,其它接口可以正常调用成功

参考文档:

1.http://blog.csdn.net/zhangchaoy/article/details/10112225

2.http://blog.csdn.net/zhangchaoy/article/details/10063099


猜你喜欢

转载自blog.csdn.net/qq_21142893/article/details/85259466