目前用的常用测试工具对比
简介
压测不同的协议和应用
使用场景及优点
GUI图形界面的安装
目录
使用java的框架springBoot快速编写几个API接口测试
接口列表
模拟GET请求,用户列表接口
模拟POST请求,用户登录接口
@RestController
public class HelloController {
@RequestMapping(value = "users", method = RequestMethod.GET)
public @ResponseBody Object users() {
List<String> userList = new ArrayList<>();
userList.add("tom");
userList.add("marry");
userList.add("jack");
System.out.println("get request, users api");
return userList;
}
@RequestMapping(value = "login", method = RequestMethod.POST)
public @ResponseBody Object login(String name, String pwd) {
Map<String, Object> map = new HashMap<>();
if("123".equals(pwd) && "jack".equals(name)){
map.put("status", 0);
} else {
map.put("status", -1);
}
System.out.println("get request, login api");
return map;
}
/**
* 用户自定义变量测试
*/
@RequestMapping(value = "info", method = RequestMethod.GET)
public @ResponseBody Object info(String name, String pwd) {
List<String> userList = new ArrayList<>();
userList.add(name);
userList.add(pwd);
userList.add(name.length()+"");
System.out.println("get request, info api");
return userList;
}
}
Jmeter基础功能组件介绍线程组和Sampler
添加->threads->线程组(控制总体并发)
线程数:虚拟用户数。一个虚拟用户占用一个进程或线程
准备时长(Ramp-Up Period(in seconds)):全部线程启动的时长,比如100个线程,20秒,则表示20秒内100个线程都要启动完成,每秒启动5个线程
循环次数:每个线程发送的次数,假如值为5,100个线程,则会发送500次请求,可以勾选永远循环
线程组->添加-> Sampler(采样器) -> Http (一个线程组下面可以增加几个Sampler)
名称:采样器名称
注释:对这个采样器的描述
web服务器:
Use multipart/from-data for HTTP POST :当发送POST请求时,使用Use multipart/from-data方法发送,默认不选中。
查看测试结果
线程组->添加->监听器->察看结果树
增加断言: 线程组 -> 添加 -> 断言 -> 响应断言
apply to(应用范围):
Main sample only: 仅当前父取样器 进行断言,一般一个请求,如果发一个请求会触发多个,则就有sub
sample(比较少用)
要测试的响应字段:
模式匹配规则:
断言结果监听器: 线程组-> 添加 -> 监听器 -> 断言结果
里面的内容是sampler采样器的名称
断言失败,查看结果树任务结果颜色标红(通过结果数里面双击不通过的记录,可以看到错误信息)
每个sample下面可以加单独的结果树,然后同时加多个断言,最外层可以加个结果树进行汇总
新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)
lable: sampler的名称
Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100
Average: 平均响应时间 (毫秒)
Median: 中位数,也就是 50% 用户的响应时间
90% Line : 90% 用户的响应不会超过该时间 (90% of the samples took no more than this time. The
remaining samples at least as long as this)
95% Line : 95% 用户的响应不会超过该时间
99% Line : 99% 用户的响应不会超过该时间
min : 最小响应时间
max : 最大响应时间
Error%:错误的请求的数量/请求的总数
Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps
KB/Sec: 每秒接收数据量
实战操作jmeter读取CSV和Txt文本文件里面的参数进行压测
在读取的配置文件里面,同时使用多个自定义参数
Thread Group -> add -> sampler -> jdbc request
jar包添加 mysql-connector-java-5.1.30.jar
JDBC connection Configuration 配置
JDBC request->add -> config element -> JDBC connection configuration
Debug Sampler使用(结果树中查看) Thread Group -> add -> sampler -> debug sampler
参数讲解:(sql结尾不要加";")
简介:用jar包方式在控制台进行启动 打包 mvn package && java -jar target/jmeter-0.0.1-SNAPSHOT.jar
-h 帮助
-n 非GUI模式
-t 指定要运行的 JMeter 测试脚本文件
-l 记录结果的文件 每次运行之前,(要确保之前没有运行过,即xxx.jtl不存在,不然报错)
-r Jmter.properties文件中指定的所有远程服务器
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录(目录要为空,不然报错)
官方配置文件地址 http://jmeter.apache.org/usermanual/get-started.html
jmeter -n -t linux_users_api.jmx -l result.jtl -e -o /usr/local/jmeter/temp/ResultReport
jmeter -n -t /Users/jack/Desktop/linux_users_api.jmx -l result.jtl -e -o /Users/jack/Desktop/person/jmeter/temp
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
使用非GUI模式:jmeter -n -t test.jmx -l result.jtl
少使用Listener, 如果使用-l参数,它们都可以被删除或禁用。
在加载测试期间不要使用“查看结果树”或“查看结果”表监听器,只能在脚本阶段使用它们来调试脚本。
包含控制器在这里没有帮助,因为它将文件中的所有测试元素添加到测试计划中。]
不要使用功能模式,使用CSV输出而不是XML
只保存你需要的数据,尽可能少地使用断言
如果测试需要大量数据,可以提前准备好测试数据放到数据文件中,以CSV Read方式读取。
用内网压测,减少其他带宽影响压测结果
如果压测大流量,尽量用多几个节点以非GUI模式向服务器施压
官方推荐 :http://jakarta.apache.org/jmeter/usermanual/best-practices.html#lean_mean
指令
dashboard讲解
APDEX(Application performance Index)
Requests Summary
Statistics 统计数据
Jmeter图形化HTML压测报告Charts报表讲解 charts讲解 Over Time(随着时间的变化)
Throughput
Response Times
Linux服务器上jmeter进行分布式压测的相关准备工作
压测注意事项
专业名字
master:司令
slave:奴隶
target:目标
地址:http://jmeter.apache.org/images/screenshots/distributed-names.svg
地址:http://jmeter.apache.org/images/screenshots/distributed-jmeter.svg
远程拷贝(内网地址):
scp -r /usr/local/jdk-8u141-linux-x64.tar.gz root@172.18.230.233:/usr/local/
scp -r /usr/local/jmeter/apache-jmeter-4.0.tgz
root@172.18.230.233:/usr/local/software/jmeter
启动
关注CPU和内存使用
压测结果
压测修改master节点信息
启动slave机器,注意要同个网段,ip地址用内网ip
相关资料
安装常见问题
1、问题
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]]
Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is:
java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
An error occurred: Cannot start. Unable to get local host IP address.; nested exception is:
java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
解决:
hostname 命令获取机器名称,追加一个映射 iZwz95j86y235aroi85ht0Z
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
120.79.160.143 iZwz95j86y235aroi85ht0Z
windows用户 修改c:\windows\system32\drivers\etc\hosts文件,增加一条域名 与IP的映射
2、问题
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
解决:
拥有RMI over SSL的有效密钥库,或者禁用了SSL。
1、禁用SSL
jmeter.property里面 server.rmi.ssl.disable 改为 true,表示禁用
3、问题:
[root@iZ949uw2xehZ bin]# ./jmeter
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log
解决:
编辑jmeter
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改变初始堆内存和最大堆内存
4、仅修改 server_port 即可,下面两者一样
server.rmi.localport=8899 表示slave server启动显示的端口
server_port=8899 表示master机器要远程连接的端口 即 remote_hosts=xxxx:8899
5、<!-- jmeter 分布式性能测试(多网卡配置) -->
我们要在多网卡的服务器上开启RMI服务的话必须指定IP,使他们能够在同一个网段内。
需要以下几步(假定所有机器都在10.120.11.*网段,agent服务器为linux,controller服务器为windows):
1、 修改agent服务器,指定agent机器的IP
修改jmeter-server文件
# vi jmeter-server
修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要连接的IP)
2、修改server服务器,指定server机器的IP
修改jmeter.bat文件
新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214
修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%
6、确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home等
在Agent机器上安装jdk,配置环境变量:Java_home和JMeter_home
安装目录不要带空格,最好都是简短的英文路径
7、master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可。
如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的。
总样本数 = 线程数 * 循环次数 * 执行机总数
8、连接失败原因排查
以下步骤进行排查:
1. jmeter-server是否启动;
2. 是否联网
3. ping 服务器IP是否畅通.
4. telnet 端口 192.168.3.10 1099
5. 检查服务器的防火墙是否关闭。
6. 阿里云安全策略是否正常
9、"could not find ApacheJmeter_core.jar"
解决:在Agent机器安装jdk,并设置环境变量
10、”Bad call to remote host"
解决:检查被控制机器上的jmeter-server有没有启动,或者remote_hosts的配置是否正确。
./jmeter -n -t F:\Jmeter_test_home\jmx_home\40_users.jmx -l F:\Jmeter_test_home\jtl\40_result.jtl
./jmeter -n -t F:\Jmeter_test_home\jmx_home\40_users.jmx -l F:\Jmeter_test_home\jtl\40_result.jtl -e -o F:\Jmeter_test_home\result_html
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。