Jmeter每个任务都由测试计划组成,每个测试计划又包含了各种elements,通过不同的elements之间的组合来完成测试计划。一般常用的elements如下:
thread group:包含一组线程,每个线程独立地执行测试计划。
sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,java请求等等。
listener:有多种不同的实现,主要用于统计测试接话运行中的数据并展示,如可以进行图形化方式展示响应时间。图形结果,查看结果树,聚合报告是比较基础的监听器。
assertions:断言,有多种不同实现,可以测试sample请求后返回的内容是否符合期望值。例如可以判断html返回的内容是否符合期望。
HTTP请求
1.建立线程组,按需配置线程组的属性
2.在线程组上添加采样器 http请求,按需配置服务器,端口号,请求路径等各属性
3.按需添加各个监听器用于查看测试的结果,如图形结果,查看结果树,聚合报告。
4.可在http请求上添加断言来测试返回结果是否正确
一个简单的http请求的测试建立完成以后的样子
然后点击运行就可以在各个监听器上看到测试的结果了
JAVA请求
和http请求类似,只是添加采样器的时候选择java请求。
在类名称一栏里选择的测试用例需要自己手动写和添加
新建的用例类需要继承AbstractJavaSamplerClient,方法如下
Arguments
|
getDefaultParameters() 用于获取界面的参数
|
SampleResult
|
runTest(JavaSamplerContext context) 类似于LR的Action,result.sampleStart()一个事务开始,result.sampleEnd()一个事务 结束
|
void
|
setupTest(JavaSamplerContext context) 初始化方法,类似于LR的init和Junit中的setUp()
|
void
|
teardownTest(JavaSamplerContext context) 类似于LR的end和Junit中的tearDown()
|
执行的先后顺序为:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
porm文件需要添加依赖
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.0</version>
</dependency>
如下为一个简单的用例:
public class JmeterFacadeTest extends AbstractJavaSamplerClient {
private static String label_name = "FacadeTest";// 定义label名称,显示在jmeter的结果窗口
private static final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-test.xml");
private AuthRemoteServiceFacade authRemoteServiceFacade = null;
@Override
public void setupTest(JavaSamplerContext arg0) {
System.out.println("测试用例执行开始...");
authRemoteServiceFacade = (AuthRemoteServiceFacade) context.getBean("authRemoteServiceFacade");
}
@Override
public Arguments getDefaultParameters() {
// 参数定义,显示在前台,也可以不定义
Arguments params = new Arguments();
params.addArgument("accountNo", "02223");
return params;
}
public SampleResult runTest(JavaSamplerContext arg0) {
boolean success = true;
SampleResult sr = new SampleResult();
sr.setSampleLabel(label_name);
sr.sampleStart();// 用来统计执行时间--start--
try {
String accountNo = arg0.getParameter("accountNo");
AccountRO ro = authRemoteServiceFacade.getAccount(accountNo);
sr.setResponseMessage(JSON.json(ro));
sr.setResponseCode("1000");
} catch (Exception e) {
success = false;
} finally {
sr.sampleEnd();// 用来统计执行时间--end--
sr.setSuccessful(success);
}
return sr;
}
@Override
public void teardownTest(JavaSamplerContext arg0) {
System.out.println("测试用例执行结束...");
}
写完以后将工程打成jar包,放到{Jmeter_home}\lib\ext目录,并把所有依赖的jar包放到{Jmeter_home}\lib下,这样就能在类名称这看到自己所选的用例了。
分布式测试
1、Jmeter分布式测试时,选择其中一台作为调度机(master),其它机器做为执行机(slave)。
2、执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI,我理解它应该是通过命令行模式执行的。
3、执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。
slave机上需要安装Jmeter,且如果是java请求的话也需要把测试用例的jar包放到{Jmeter_home}\lib\ext目录,并把所有依赖的jar包放到{Jmeter_home}\lib下
如果slave机系统是windows系统,则启动bin目录下的:jmeter-server.bat。
如果是linux系统,则通过jmeter-server命令启动,./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(就是slave机的ip)。1.如果报Permission denied,则通过chmod 777修改权限。
修改master机bin目录下的jmeter.properties文件,修改如下配置:remote_hosts=xxx.xxx.xxx.xxx:1099这里的ip就是所有slave机的ip,端口默认为1099。
这样就能在master机运行,远程启动下看到所有配置的slave机
,可以分别启动,也可以通过
远程全部启动
启动所有的slave机来执行测试,并把结果返回。
以上就是jmeter的基本操作内容。
个人感觉压力测试线程太多会受执行机的性能影响比较大,因此压测要在服务器上,而且最好分布式的压测。