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

本文介绍了接口的分类,包括系统间调用、上层对下层服务调用、服务间调用。强调接口测试要先明确接口类型,不同类型测试方法或不同。还提及http协议接口测试可用jmeter或HTTPClient,最后给出应用数据同步接口测试案例及相关注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:https://blog.youkuaiyun.com/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()));

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


备注:

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

参考文档:

1.http://blog.youkuaiyun.com/zhangchaoy/article/details/10112225

2.http://blog.youkuaiyun.com/zhangchaoy/article/details/10063099

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值