欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-10 17:06:54
...

转载: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

必填

游戏名称


三).样例:
请求数据(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
实现代码如下:

  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. public static String conResult, encrypt_app, encrypt_sign;
  10. public static String smsUrl = "http://192.168.0.140:8101/pismire/sfyan/syncAppData.lzyhjfs";
  11. @Test
  12. public static void sendSms() throws Exception {
  13. //初始化httpclient
  14. HttpClient httpclient = new DefaultHttpClient();
  15. //获取httppost
  16. HttpPost httppost = new HttpPost(smsUrl);
  17. try {
  18. //添加参数
  19. List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
  20. nameValuePairs.add(new BasicNameValuePair("transdata",encrypt_app()));
  21. nameValuePairs.add(new BasicNameValuePair("sign", encrypt_sign()));
  22. //设置报文头以及参数的格式
  23. httppost.addHeader("Content-type","application/x-www-form-urlencoded");
  24. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
  25. //执行post请求
  26. HttpResponse response = httpclient.execute(httppost);
  27. //打印服务器返回的状态
  28. System.out.println("服务器返回的状态:"+response.getStatusLine().getStatusCode());
  29. // if (response.getStatusLine().getStatusCode() == 200)
  30. /**
  31. * 读返回数据
  32. * */
  33. conResult = EntityUtils.toString(response.getEntity());
  34. System.out.println(conResult);
  35. //断开连接
  36. httpclient.getConnectionManager().shutdown();
  37. } catch (ClientProtocolException e) {
  38. e.printStackTrace();
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. }
  42. // return conResult;
  43. }
  44. /**
  45. * 拼接transdata数据
  46. * */
  47. public static String encrypt_app() throws Exception {
  48. int opertype = 1;
  49. String appid = "2001850000000320311";
  50. String appname = "同步数据11";
  51. String transdata = "{\"appid\":\"" + appid + "\",\"appname\":\""+ appname + "\",\"opertype\":" + opertype + "}";
  52. encrypt_app = transdata;
  53. System.out.println("transdata:" + encrypt_app);
  54. return encrypt_app;
  55. }
  56. /**
  57. * 用MD5算法对transdata进行加密
  58. * */
  59. public static String encrypt_sign() throws Exception {
  60. // sign签名秘钥,key1 和mod为后台固定的秘钥
  61. BigInteger key1 = new BigInteger(EncryptorUtils.getDecryptionString("2SWUfsOjTTBpLfyWSNnXvvA37WLqvpUuOnIN9sjW6U4="));
  62. BigInteger mod = new BigInteger(EncryptorUtils.getDecryptionString("+9mTlYq/DeqPDwNuvyuLI4eHw03rdP5w0O+bzb1uMcTASSC2AH381WeGO70wv9jm"));
  63. String desc = RSAUtil.encrypt(MD5.md5Digest(encrypt_app), key1, mod);
  64. encrypt_sign = desc;
  65. System.out.println("sign:" + encrypt_sign);
  66. return encrypt_sign;
  67. }

-----------------------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()));
基于http协议的接口测试(1)

可以使用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