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信息,其它接口可以正常调用成功
参考文档:
1.http://blog.csdn.net/zhangchaoy/article/details/10112225
2.http://blog.csdn.net/zhangchaoy/article/details/10063099