基于http协议的接口测试(1)
转载:https://blog.csdn.net/luozhuwang/article/details/14169941
接口的分类:
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 |
必填 |
数据操作类型: 0 – 新增 1 – 变更 2 – 删除 |
appid |
应用编号 |
String |
必填 |
A平台给游戏分配的appid |
appname |
应用名称 |
String |
必填 |
游戏名称 |
transdata={"opertype":0,"appid":"33213","appname":"测试游戏"}&sign=d91cbc584316b9d99919921a9
成功应答数据(http包体数据):
{"code":"0000","errmsg":"数据同步成功"}
-
/**
-
* 使用 HttpClient 需要以下 5 个步骤:
-
1. 创建 HttpClient 的实例
-
2. 创建某种连接方法的实例,在这里是 httppost<span style="font-family:Arial,Helvetica,sans-serif">,在httppost 的构造函数中传入待连接的地址</span>
-
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
-
4. 读 response
-
5. 释放连接。无论执行方法是否成功,都必须释放连接
-
*/
-
-
public static String conResult, encrypt_app, encrypt_sign;
-
public static String smsUrl = "http://192.168.0.140:8101/pismire/sfyan/syncAppData.lzyhjfs";
-
-
@Test
-
public static void sendSms() throws Exception {
-
//初始化httpclient
-
HttpClient httpclient = new DefaultHttpClient();
-
//获取httppost
-
HttpPost httppost = new HttpPost(smsUrl);
-
try {
-
//添加参数
-
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
-
nameValuePairs.add(new BasicNameValuePair("transdata",encrypt_app()));
-
nameValuePairs.add(new BasicNameValuePair("sign", encrypt_sign()));
-
-
//设置报文头以及参数的格式
-
httppost.addHeader("Content-type","application/x-www-form-urlencoded");
-
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
-
//执行post请求
-
HttpResponse response = httpclient.execute(httppost);
-
-
//打印服务器返回的状态
-
System.out.println("服务器返回的状态:"+response.getStatusLine().getStatusCode());
-
// if (response.getStatusLine().getStatusCode() == 200)
-
/**
-
* 读返回数据
-
* */
-
conResult = EntityUtils.toString(response.getEntity());
-
System.out.println(conResult);
-
-
//断开连接
-
httpclient.getConnectionManager().shutdown();
-
-
} catch (ClientProtocolException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}
-
-
// return conResult;
-
}
-
-
/**
-
* 拼接transdata数据
-
* */
-
public static String encrypt_app() throws Exception {
-
int opertype = 1;
-
String appid = "2001850000000320311";
-
String appname = "同步数据11";
-
-
String transdata = "{\"appid\":\"" + appid + "\",\"appname\":\""+ appname + "\",\"opertype\":" + opertype + "}";
-
encrypt_app = transdata;
-
System.out.println("transdata:" + encrypt_app);
-
-
return encrypt_app;
-
}
-
-
/**
-
* 用MD5算法对transdata进行加密
-
* */
-
public static String encrypt_sign() throws Exception {
-
// sign签名秘钥,key1 和mod为后台固定的秘钥
-
BigInteger key1 = new BigInteger(EncryptorUtils.getDecryptionString("2SWUfsOjTTBpLfyWSNnXvvA37WLqvpUuOnIN9sjW6U4="));
-
BigInteger mod = new BigInteger(EncryptorUtils.getDecryptionString("+9mTlYq/DeqPDwNuvyuLI4eHw03rdP5w0O+bzb1uMcTASSC2AH381WeGO70wv9jm"));
-
-
String desc = RSAUtil.encrypt(MD5.md5Digest(encrypt_app), key1, mod);
-
encrypt_sign = desc;
-
System.out.println("sign:" + encrypt_sign);
-
-
return encrypt_sign;
-
}
-----------------------TestNg执行完成输出的日志
sign:3f58b89e2e1efd0f104cf0cc891bf6c 4d07cd4c898c0df22af83776e1d04bbc 36339c09d26c267d381ed4682fff9392
服务器返回的状态:200
{"code":"0000","errmsg":"数据同步成功"}
PASSED: sendSms
可以使用Firefox的一个插件:HttpRequester 模拟发送请求(请求URL、传输方法、参数)
备注:
比较蛋疼的问题就是httpclient4.3版本,会自动的保存cookies,其它接口直接引用登陆的cookies,偶尔会出现失败,如果输出该cookies信息,其它接口可以正常调用成功
参考文档:
下一篇: Knight Shortest Path