源代码下载地址:点此下载
之前压力测试的是注册功能的接口,写了一个jdbc request上来就根据手机号 将数据库的记录清除,但是现在的数据库手机号是加密之后的手机号,直接传一个明文的手机号是不行的,所以在调用之前要对手机号进行加密,查阅资料发现有Bean shell 和java request的两种方式,先打算使用java request方式进行压力测试。
先写一个简单的小demo,测试两个数相加1.创建一个Java工程
2.导包
将JMeter的lib目录下 包括ext 和 junit 中的jar文件添加到工程中 尤其是ext中的ApacheJMeter_core.jar,ApacheJMeter_java.jar都是必须的,有的不是myeclipse创建工程,导入jar包就不再说了,这里提供 idea中创建java普通工程,添加jar包,并将代码打成jar包的参考:点此查看
3.重写jmeter方法JavaTest.java
创建一个类并实现JavaSamplerClient接口或继承AbstractJavaSamplerClient,并重写方法。package com.test;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author: wangsaichao
* @date: 2017/12/13
* @description:
*/
public class JavaTest extends AbstractJavaSamplerClient {
private static final Logger logger = LoggerFactory.getLogger(JavaTest.class);
private String num1;
private String num2;
/**
* 这个方法是用来自定义java方法入参的
* params.addArgument("num1","");表示入参名字叫num1,默认值为空。
* @return
*/
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("num1", "");
params.addArgument("num2", "");
return params;
}
/**
* 每个线程测试前执行一次,做一些初始化工作
* 获取输入的参数,赋值给变量,参数也可以在下面的runTest方法中获取,这里是为了展示该方法的作用
* @param arg0
*/
@Override
public void setupTest(JavaSamplerContext arg0) {
num1 = arg0.getParameter("num1");
num2 = arg0.getParameter("num2");
}
/**
* 真正执行逻辑的方法
* @param arg0
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
SampleResult sr = new SampleResult();
sr.setSamplerData("请求参数num1:"+num1+"\n请求参数num2:"+num2);
logger.info("请求参数num1:{} 请求参数num2:{}",num1,num2);
try {
// jmeter 开始统计响应时间标记
sr.sampleStart();
int sum = Integer.parseInt(num1)+Integer.parseInt(num2);
// 通过下面的操作就可以将被测方法的响应输出到Jmeter的察看结果树中的响应数据里面了。
sr.setResponseData("结果是:"+sum, "utf-8");
logger.info("结果是:{}",sum);
sr.setDataType(SampleResult.TEXT);
//设置响应执行成功
sr.setSuccessful(true);
} catch (Throwable e) {
//有异常,执行失败
sr.setSuccessful(false);
e.printStackTrace();
} finally {
// jmeter 结束统计响应时间标记
sr.sampleEnd();
}
return sr;
}
/**
* 测试结束后调用
* @param arg0
*/
@Override
public void teardownTest(JavaSamplerContext arg0) {
}
/**
* main方法测试程序是否可用,打包时 注释掉
* @param args
*/
// public static void main(String[] args) {
// Arguments params = new Arguments();
// //设置参数,并赋予默认值1
// params.addArgument("num1", "1");
// //设置参数,并赋予默认值2
// params.addArgument("num2", "2");
// JavaSamplerContext arg0 = new JavaSamplerContext(params);
// JavaTest test = new JavaTest();
// test.setupTest(arg0);
// test.runTest(arg0);
// test.teardownTest(arg0);
// }
}
参数介绍:public Arguments getDefaultParameters();可选,定义可用参数及默认值;
public void setupTest(JavaSamplerContext arg0):可选,测试前执行,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0);必选,实现自定义请求;
public void teardownTest(JavaSamplerContext arg0):可选,测试结束时调用;
4.先使用main方法测试
使用main方法测试,报以下异常
1.Intellij idea 出现错误 error:java: 无效的源发行版: 9解决方法:idea默认给使用了jdk9的编译
①.点击File ->Project Structure...->Project 将9改成8
②.点击File ->Project Structure...->Modules 将9改成8
2.然后再次运行main报以下异常
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. Set system property 'org.apache.logging.log4j.simplelog.StatusLogger.level' to TRACE to show Log4j2 internal initialization logging.
解决方法:在classpath下添加log4j2.xml,内容如下<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个都知道是输出日志的格式-->
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</Console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
<File name="log" fileName="log/test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
<SizeBasedTriggeringPolicy size="50MB"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="trace">
<appender-ref ref="RollingFile"/>
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
3.再次执行main方法,成功
5.将写好的代码,打成jar包并放到jmeter 的 lib/ext目录下记得把所有额外的(自定义协议依赖的,非jmeter的)依赖包放到jmeter环境变量中
6.重启jmeter测试
创建java Sampler选择刚定义好的测试类,如下图:
创建线程组:右击测试计划 -> 添加 ->Threads(User) -> 线程组创建java request:右击线程组 -> 添加 -> Sampler -> java请求
添加查看结果数:右击线程组 -> 添加 -> 监听器 -> 查看结果数
7.测试,结果如下图
最后,就可以根据正则表达式,提取值给其他方法使用了。