转载请注明文章来源:http://write.blog.csdn.net/postedit/51735531
1、增加线程组
2、配置线程
3、添加报告
4、添加JAVA请求程序
5、添加参数
点击保存按键,存储配置文件java请求.jmx
6、使用随机数
选项-》函数助手
点击生成
生成${__Random(11111,22222,)}
7、把第6步生成的Java请求.jmx中找到定义的变量,把变量的value替换成${__Random(11111,22222,)}
8、代码编写
AbstractJavaSamplerClient继承接口JavaSamplerClient
public void setupTest(JavaSamplerContext context)
public voidteardownTest(JavaSamplerContext context)
public ArgumentsgetDefaultParameters()
JavaSamplerClient接口定义如下方法:
public abstract void setupTest(JavaSamplerContextjavasamplercontext);
public abstractSampleResult runTest(JavaSamplerContextjavasamplercontext);
public abstract voidteardownTest(JavaSamplerContextjavasamplercontext);
public abstract ArgumentsgetDefaultParameters();
编写的代码必须重写
@Override
public SampleResult runTest(JavaSamplerContextarg0)
#调整几次线程组的线程数目的控制,我们会发现我们的这个自定义类中的teardowntest和 setupuptest方法都是正对线程组中的某一个线程来执行的,线程组中线程的调用数目其实就是指runtest方法的运行次数。
//代码如下
package com.tydic.beijing.jmeter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class OracleWRextendsAbstractJavaSamplerClient {
private static Connectionconn=null;
private static PreparedStatementpstmt =null;
private static PreparedStatementsel_stmt =null;
public void setupTest(JavaSamplerContextarg0) {
String sel = "select * fromtest_db_wr where balance_id = ?";
String sql = "updatetest_db_wr set real_balance = real_balance - ? where balance_id = ?";
String url = "jdbc:oracle:thin:@172.168.1.246:1521:bssgx";
String userName = "newbilling";
String passWord = "newbilling";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url,userName,passWord);
pstmt =conn.prepareStatement(sql);
sel_stmt =conn.prepareStatement(sel);
} catch (ClassNotFoundException | SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public SampleResult runTest(JavaSamplerContextarg0) {
booleansuccess =true;
SampleResult results = newSampleResult();
results.sampleStart();//事务的起点
longbalance =arg0.getLongParameter("balance");
String balance_id = String.valueOf(arg0.getLongParameter("balanceId"));
System.out.println("balance_id["+balance_id +"]balance[" +balance
+ "]");
try {
sel_stmt.setString(1,balance_id);
ResultSet rs = sel_stmt.executeQuery();
if (rs.next()){
pstmt.setLong(1,balance);
pstmt.setString(2,balance_id);
pstmt.execute();
conn.commit();
}
} catch (SQLException e){
success =false;
//TODO Auto-generated catch block
e.printStackTrace();
} finally {
results.sampleEnd();//事务的终点
results.setSuccessful(success);// 设置本次事务成功或失败
}
returnresults;
}
}
9、命令行模式运行Jmeter
jmeter -n -t Java请求.jmx -l listener.jtl
这里是我们使用非GUI 模式运行测试脚本时可以使用的一些命令:
- -h 帮助 -> 打印出有用的信息并退出
- -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter
- -t 测试文件 -> 要运行的 JMeter 测试脚本文件
- -l 日志文件 -> 记录结果的文件
- -r 远程执行 -> 启动远程服务
- -H 代理主机 -> 设置 JMeter 使用的代理主机
- -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号
10、结果如下
tail -f jmeter.log
11.Jmeter的分布式测试(优缺点)(转自JMeter入门教程)
下面是分布式测试的使用方法,即使用一台机器控制多台机器给目标机器产生压力。由于Linux和Windows上的方法有些不一样,这里说下Linux下是怎么来配置的。
首先总控的机器我们叫master,产生压力的肉鸡我们叫JmeterServer,待我们测试的系统我们叫Target.
第一步:启动JmeterServer。我们可以找到Jmeter/bin目录下的jmeter-server这个脚本,运行即可,当然如果你需要调整这个测试负载产生服务器的内存等性能参数的话,我们修改这个脚本jmeter中的内存参数。
第二步 :修改Master机器上jmeter/bin目录下的jmeter.properties文件,修改remote_hosts=localhost:1099,localhost:2010这个为你自己的JmeterServer的实际IP,如果有多台可以用逗号分开。
第三步 : 启动master jmeter,运行测试脚本的时候选:运行--> 远程运行 --> 选择IP 或者 运行所有远程。JmeterServer就会运行Master机器上设定的运行脚本了。
问题 :我在实际使用中发现使用这种模式下的Jmeter在Master观测实际测试结果,发现TPS远远低于使用传统的一台Jmeter来测试所能达到的TPS,我感觉可能是由于Jmeter这种多机器协作中传递信息是使用RMI技术,可能这种技术本身还对Jmeter的性能产生了影响导致压力上去的很慢。该问题还没有得到完全认证,所以我现在如果在一台机器测试产生的压力不够的情况下我直接使用多台机器测把TPS加起来就是结果,比较傻,期待大侠指点迷津。
12、聚合报告(转自理解 JMeter 聚合报告(Aggregate Report))
AggregateReport 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”。今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅。
如果大家都是做Web应用的性能测试,例如只有一个登录的请求,那么在AggregateReport中,会显示一行数据,共有10个字段,含义分别如下。
Label:每个 JMeter 的 element(例如 HTTPRequest)都有一个 Name 属性,这里显示的就是 Name 属性的值
#Samples:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 TransactionController 时,也可以以Transaction 为单位显示平均响应时间
Median:中位数,也就是 50% 用户的响应时间
90%Line:90% 用户的响应时间
Note:关于 50% 和 90% 并发用户数的含义,请参考下文
http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html
Min:最小响应时间
Max:最大响应时间
Error%:本次测试中出现错误的请求的数量/请求的总数
Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request perSecond),当使用了 TransactionController 时,也可以表示类似 LoadRunner 的 Transactionper Second 数
KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
资料引用:
理解 JMeter 聚合报告(AggregateReport)