Python精选软件测试学习之路

基于Jmeter的Java请求的二次开发

2019-01-17  本文已影响83人  乘风破浪的姐姐

基于Jmeter的 Java请求二次开发,需要继承AbstractJavaSamplerClient抽象类。该类的以下方法需要重写。

public Arguments getDefaultParameters(); 设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值;类似于LoadRunner的Action,需要设置result.sampleStart()一个事务开始,result.sampleEnd()一个事务结束
public void teardownTest(JavaSamplerContext arg0):测试结束时调用;类似于LoadRunner的end和Junit中的tearDown()

执行的先后顺序为:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)

以下介绍Java请求二次开发详细过程:
1、使用IDEA创建JAVA工程
2、将JMeter的lib目录下的jar文件,全部导入。详情请参考:使用IDEA 的Java工程如何添加jar包、打jar包
3、新增类并继承AbstractJavaSamplerClient,重写方法
1)新增工具类ConvertUtils,用于字符串转换为日期的方法str2Date

package com.jmeter.help;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

public class ConvertUtils {

        public static final String DATE_FORMAT_DAY = "yyyy-MM-dd";
        public static final String DATE_FORMAT_DAY_2 = "yyyy/MM/dd";
        public static final String TIME_FORMAT_SEC = "HH:mm:ss";
        public static final String DATE_FORMAT_SEC = "yyyy-MM-dd HH:mm:ss";
        public static final String DATE_FORMAT_MSEC = "yyyy-MM-dd HH:mm:ss.SSS";
        public static final String DATE_FORMAT_MSEC_T = "yyyy-MM-dd'T'HH:mm:ss.SSS";
        public static final String DATE_FORMAT_MSEC_T_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
        public static final String DATE_FORMAT_DAY_SIMPLE = "y/M/d";

        /**
         * 匹配yyyy-MM-dd
         */
        private static final String DATE_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$";
        /**
         * 匹配yyyy/MM/dd
         */
        private static final String DATE_REG_2 = "^[1-9]\\d{3}/(0[1-9]|1[0-2])/(0[1-9]|[1-2][0-9]|3[0-1])$";
        /**
         * 匹配y/M/d
         */
        private static final String DATE_REG_SIMPLE_2 = "^[1-9]\\d{3}/([1-9]|1[0-2])/([1-9]|[1-2][0-9]|3[0-1])$";
        /**
         * 匹配HH:mm:ss
         */
        private static final String TIME_SEC_REG = "^(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$";
        /**
         * 匹配yyyy-MM-dd HH:mm:ss
         */
        private static final String DATE_TIME_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s" +
                "(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d$";
        /**
         * 匹配yyyy-MM-dd HH:mm:ss.SSS
         */
        private static final String DATE_TIME_MSEC_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])\\s" +
                "(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}$";
        /**
         * 匹配yyyy-MM-dd'T'HH:mm:ss.SSS
         */
        private static final String DATE_TIME_MSEC_T_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T" +
                "(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}$";
        /**
         * 匹配yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
         */
        private static final String DATE_TIME_MSEC_T_Z_REG = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T" +
                "(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d\\.\\d{3}Z$";


        /**
         * <p>字符串时间转为{@link Date}类型,
         * <p>支持匹配类型列表:</p>
         * <p>yyyy-MM-dd</p>
         * <p>yyyy/MM/dd</p>
         * <p>HH:mm:ss</p>
         * <p>yyyy-MM-dd HH:mm:ss</p>
         * <p>yyyy-MM-dd'T'HH:mm:ss.SSS</p>
         * <p>yyyy-MM-dd'T'HH:mm:ss.SSS'Z'</p>
         * <p>
         *
         * @param strDate 时间字符串
         * @return Date  {@link Date}时间
         * @throws ParseException 异常
         */
        public  Date str2Date(String strDate) throws ParseException {

            strDate = strDate.trim();
            SimpleDateFormat sdf = null;
            if (isMatched(strDate, DATE_REG)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_DAY);
            }
            if (isMatched(strDate, DATE_REG_2)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_DAY_2);
            }
            if (isMatched(strDate, DATE_REG_SIMPLE_2)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_DAY_SIMPLE);
            }
            if (isMatched(strDate, TIME_SEC_REG)) {
                sdf = new SimpleDateFormat(TIME_FORMAT_SEC);
            }
            if (isMatched(strDate, DATE_TIME_REG)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_SEC);
            }
            if (isMatched(strDate, DATE_TIME_MSEC_REG)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_MSEC);
            }
            if (isMatched(strDate, DATE_TIME_MSEC_T_REG)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_MSEC_T);
            }
            if (isMatched(strDate, DATE_TIME_MSEC_T_Z_REG)) {
                sdf = new SimpleDateFormat(DATE_FORMAT_MSEC_T_Z);
            }
            if (null != sdf) {
                return sdf.parse(strDate);
            }else{
                return null;
            }
        }

 
        /**
         * <p>判断内容是否匹配</p>
         * @param pattern 匹配目标内容
         * @param reg     正则表达式
         * @return 返回boolean
         */
        public static boolean isMatched(String pattern, String reg) {
            Pattern compile = Pattern.compile(reg);
            return compile.matcher(pattern).matches();
        }

//    public static void main(String[] args) throws ParseException {
//        String str2="2018/6/29";
//        String str3="2018-06-29 14:12:28";
//
 //       System.out.println(str2Date(str2));//Fri Jun 29 00:00:00 CST 2018
//        System.out.println(str2Date(str3));//Fri Jun 29 14:12:28 CST 2018
//
//    }

}

2)新增ConvertStr2DateTest测试类,继承AbstractJavaSamplerClient,并重写主要方法

package com.jmeter.help;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import java.util.Date;

public class ConvertStr2DateTest extends AbstractJavaSamplerClient{
    private String date;
    private Date resultDate;

    public Arguments getDefaultParameters(){
        Arguments arguments = new Arguments();
        arguments.addArgument("dateStr","");
        return arguments;
    }

    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {

        try {
            date = javaSamplerContext.getParameter("dateStr");

            SampleResult result = new SampleResult();
            result.setSampleLabel("java request");
            try {
                result.sampleStart();
                ConvertUtils convertUtils = new ConvertUtils();
                resultDate = convertUtils.str2Date(date);
                if (resultDate != null && resultDate.getTime() > 0) {
                    result.setResponseData("字符串:"+date+"转化成日期的结果是:" + resultDate, null);
                    result.setDataType(SampleResult.TEXT);
                }
                result.setSuccessful(true);
            }catch (Throwable  e){
                result.setSuccessful(false);
                e.printStackTrace();
            }finally {
                result.sampleEnd();
            }
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

4、将当前工程打成jar包,详情请参考文章:使用IDEA 的Java工程如何添加jar包、打jar包
5、将已打好的jar包添加到Jmeter的lib/ext下

image.png
6、打开Jmeter,新增线程组,并添加Java请求,察看结果树
image.png
7、执行测试计划,查看结果
image.png
上一篇 下一篇

猜你喜欢

热点阅读