美文网首页接口测试Apache JMeterjmeter接口测试
Jmeter之CSV参数设置及BeanShell对接口请求和响应

Jmeter之CSV参数设置及BeanShell对接口请求和响应

作者: 晓莫莫 | 来源:发表于2017-07-07 17:58 被阅读164次

前面的文章讲了我的目的和如何基于CSV文件设置我的测试计划,没有了解过的可以点击链接查看:Jmeter之CSV参数设置及BeanShell对接口请求和响应数据处理(一)http://www.jianshu.com/p/113248c49612

本文主要分享我的完成通用CSV设置后,特殊处理的地方通过前置处理和后置处理实现。

1、BeanShell PreProcessor

下面实现的功能为

1)原文本特殊格式转换,csv文件写了一些"\n",会自动多加个"",导致实际请求的时候数据偏差,所以这里要做的就是纠正这些格式转换

//替换csv文件配置自动把"\n"转成"\\n"
String paramsPart1 = vars.get("defaultData");
String paramsPart2 = vars.get("myData");
String params = paramsPart2+paramsPart1;
String s = params.replace("\\n", "\n");
String myDataNew = paramsPart2.replace("\\n", "\n");

2)计算sign,并且传递出去,在http请求中可以使用变量signfromBeanShell

Sign怎么生成的:其实就是将所有用户请求的参数按照字母排序(包括timestamp,token),然后根据MD5加密(可以加点盐),生成sign签名,这就是所说的url签名算法。所以token+sign还能防止监听,保证程序的接口请求不会被恶意篡改、重放攻击等。

这里我把sign的算法封装到appSign中了,然后导出为jar包。

jmeter引用此jar包有两种引用方式:

  • jar包直接放到D:\apache-jmeter-3.2\lib\ext目录下;
  • 点击测试计划-页面最底部Add directory or jar to classpath-浏览-添加对应的jar包

beanshell是能完美支持java的,所以,简单的一个调用即可,并且需要把signfromBeanShell传递出去,可以在请求中直接使用此变量

import appSign.sign;
//把params传递,计算sign
String signResult=sign.getSign(s);
//计算结果赋值给jmeter请求使用
vars.put("signfromBeanShell",signResult);

3)因为测试中很多数据是中文,在实际请求中请求实体是urlEncode之后的,注意,此处没有把请求实体中的&、=进行urlEncode,仅仅为value,所以写了个encodeValue的函数

import java.net.URLEncoder;


private static String encodeValue(String data_csv) {
        if (data_csv == null || data_csv.length() == 0) {
        return "";
        }

        String[] strArray = data_csv.split("&");
        StringBuilder sb = new StringBuilder();

        for (String str : strArray) {
        int index = str.indexOf("=");
        String value = str.substring(index + 1);
        String key = str.substring(0, index + 1);
        sb.append(key).append(URLEncoder.encode(value,"UTF-8")).append("&");
        }
        String result = sb.toString();
        result = result.substring(0, result.length() - 1);
        return result;
        }
//参与计算sign的的value为:未urlEncode,接口请求用的password为:已urlEncode
String myDataEncode = encodeValue(myDataNew);
vars.put("myData",myDataEncode);
System.out.println(myDataEncode);

上面分开说明了下,下面是完整的全部的preProcesser的代码:

import appSign.sign;
import java.net.URLEncoder;


private static String encodeValue(String data_csv) {
        if (data_csv == null || data_csv.length() == 0) {
        return "";
        }

        String[] strArray = data_csv.split("&");
        StringBuilder sb = new StringBuilder();

        for (String str : strArray) {
        int index = str.indexOf("=");
        String value = str.substring(index + 1);
        String key = str.substring(0, index + 1);
        sb.append(key).append(URLEncoder.encode(value,"UTF-8")).append("&");
        }
        String result = sb.toString();
        result = result.substring(0, result.length() - 1);
        return result;
        }

//替换csv文件配置自动把"\n"转成"\\n"
String paramsPart1 = vars.get("defaultData");
String paramsPart2 = vars.get("myData");
String params = paramsPart2+paramsPart1;
String s = params.replace("\\n", "\n");
String myDataNew = paramsPart2.replace("\\n", "\n");


//把params传递,计算sign
String signResult=sign.getSign(s);
//计算结果赋值给jmeter请求使用
vars.put("signfromBeanShell",signResult);



//参与计算sign的的value为:未urlEncode,接口请求用的password为:已urlEncode
String myDataEncode = encodeValue(myDataNew);
vars.put("myData",myDataEncode);
System.out.println(myDataEncode);

2、BeanShell PostProcessor

app测试区分用户用的请求参数就是token了,但是token一直是变的,怎么能持续的测试过程不同类型的参数呢?

首先我区分了已登录和未登录的模板:未登录不需要传token参数的,已登录需要,那么已登录的token从哪里获得呢?

可以使用BeanShell PostProcessor完成,代码如下,中间用到了json这个外部包。

import org.json.*;

// get oauthToken for next http request
String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
try {
            JSONObject data_obj = new JSONObject(response_data);
            String apps_oauthToken = data_obj.get("data").get("appLoginInfo").get("oauthToken").toString();
            vars.put("oauthToken", apps_oauthToken);
        } catch (JSONException e) {
              System.out.println("error:");
            System.out.println(e.toString());
        }

其他分支可以根据自己的需求自定义相关的前置和后置处理。上面这些都是一个java小白,摸爬滚打的成果。欢迎各位大神一起讨教~~~

相关文章

网友评论

    本文标题:Jmeter之CSV参数设置及BeanShell对接口请求和响应

    本文链接:https://www.haomeiwen.com/subject/zgrrhxtx.html