问题一:

使用jmeter对下单进行压测的时候,订单号不允许重复,那怎么办呢。

  • 可以采用读取csv文件进行参数化。
    • 具体操作步骤:
      • 1.选中线程组,右键的配置元件就可以看到【CSV 数据文件设置】
      • 2.不重复的订单号有了,在【CSV 数据文件设置】的【变量名称选项】设置变量名,就可以通过${变量名}从配置文件中读取对应的数据。
      • 3.请求中替换相应的变量,使请求与变量及配置文件相互关联。
    • 补充:
      • 1.也可以通过bean shell调用UUID的randomUUID()方法来实现参数化
      • 参考资料
  • 也可以使用随机函数拼接当前时间
    • ${Random(1000000,100000000000000,random)}${time(yyyyMMddHHmmss,time)}

问题二:

下单请求,需要MD5加密,怎么解决?

  • jmeter第三方插件Custom JMeter Functions中有__MD5函数。
    • 如果没有安装插件管理中心, 则先在jmeter 的lib/ext 目录下放插件管理中心 plugins-manager.jar 这个jar包, 然后重启JMeter, 就能使用该函数了
    • 具体用法可以通过【选项】-【函数助手对话框】进行查看。
  • 用添加用户自定义变量的方法,添加加密所需要参数变量,再通过V函数(用法:${V(变量名)} )获取加密所需要的值。
  • 如果加密字符串还包含变量名,直接在__MD5函数中填写对应的变量名即可
  • 如果还需要对加密后字符串转换成大写,则可以用uppercase转换成大写。
  • 而该方法的实现其实就是继承了AbstractFunction这个抽象类, 然后重写4个方法. 后续如果需要自己添加额外的逻辑, 也可以按照这个方式去实现, 打成jar包后, 放到lib/ext目录下.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    package kg.apc.jmeter.functions;

    import org.apache.jmeter.engine.util.CompoundVariable;
    import org.apache.jmeter.functions.AbstractFunction;
    import org.apache.jmeter.functions.InvalidVariableException;
    import org.apache.jmeter.samplers.SampleResult;
    import org.apache.jmeter.samplers.Sampler;
    import org.apache.jmeter.threads.JMeterVariables;
    import org.apache.jorphan.util.JOrphanUtils;

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Collection;
    import java.util.LinkedList;
    import java.util.List;

    public class MD5 extends AbstractFunction {

    private static final List<String> desc = new LinkedList<String>();
    private static final String KEY = "__MD5";

    static {
    desc.add("String to calculate MD5 hash");
    desc.add("Name of variable in which to store the result (optional)");
    }

    private Object[] values;

    /**
    * No-arg constructor.
    */
    public MD5() {
    }

    /**
    * {@inheritDoc}
    */
    @Override
    public synchronized String execute(SampleResult previousResult, Sampler currentSampler)
    throws InvalidVariableException {
    // 获取存放了当前线程的所有变量的一个容器对象
    JMeterVariables vars = getVariables();
    // 从数组中获取要加密的原始字符串, 强转为CompoundVariable类型后, 通过execute方法转成字符串
    String str = ((CompoundVariable) values[0]).execute();
    MessageDigest digest;
    try {
    digest = MessageDigest.getInstance("md5");
    } catch (NoSuchAlgorithmException ex) {
    return "Error creating digest: " + ex;
    }
    digest.update(str.getBytes());
    byte[] digestArray = digest.digest();

    for (byte b: digestArray){
    stringBuffer.append(String.format("%02x",b));
    }

    String res = stringBuffer.toString();

    if (vars != null && values.length > 1) {
    // 把第二个参数(也就是要替换的变量名)作为键, 加密后的结果作为值, 存入到vars容器中
    // 后续就可以通过${varName的值}来获取加密后的字符串
    String varName = ((CompoundVariable) values[1]).execute().trim();
    vars.put(varName, res);
    }

    return res;
    }

    /**
    * {@inheritDoc} 解析参数, 并存到数组中, 此时参数的类型是CompoundVariable
    */
    @Override
    public synchronized void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
    checkMinParameterCount(parameters, 1);
    values = parameters.toArray();
    }

    /**
    * {@inheritDoc} 函数助手中显示的方法名, 其中__是不显示的
    */
    @Override
    public String getReferenceKey() {
    return KEY;
    }

    /**
    * {@inheritDoc} 参数描述
    */
    @Override
    public List<String> getArgumentDesc() {
    return desc;
    }
    }
    参考资料1
    参考资料2