一。 压力测试简介
软件测试(英语:software testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。
性能测试指标
性能指标推算web资源公式
假设目前需求确定系统的平均日PV(多天pv总和/天数) 通过日PV可以推算:
二。jmeter用法
1》jmeter安装
下载jmeter4.0(http://jmeter.apache.org/download_jmeter.cgi) 前提安装jdk1.8
2》解压并运行
解压后目录结构如下
printable_docs 用户手册和开始文档 访问index.html
docs\api javaapi目录 访问index.html
bin目录 所有可执行文件目录
windows下点击bin目录下 jmeter.bat linux下运行 jmeter.sh运行
window下运行meter.bat会打开gui运行
linux下shell下进行测试 可以先使用window客户端创建测试计划 生成jmx文件拷贝到linux使用命令(http://jmeter.apache.org/usermanual/get-started.html#non_gui)
jmeter -n -t my_test.jmx -l log.jtl
生成的jtl 拷贝到window客户端 打开Aggregate Report 可以打开jtl文件表格预览结果
4》jmeter简单测试案例
使用springboot开发几个简单的控制层案例 使用jmeter进行测试 使用jpa来操作数据库
maven依赖
4.0.0
cn.et
springfox
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.0.0.RELEASE
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
io.springfox
springfox-swagger2
2.8.0
mysql
mysql-connector-java
5.1.24
io.springfox.ui
springfox-swagger-ui-rfc6570
1.0.0
springboot配置文件application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
控制层代码
package test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@EnableAutoConfiguration
public class TestController {
@Autowired
private TestDao testDao;
//普通输出
@RequestMapping(value="/pv",method=RequestMethod.GET)
@ResponseBody
String pv() {
return "Hello World!";
}
//查询数据库
@RequestMapping(value="/qps",method=RequestMethod.GET)
@ResponseBody
String qps() {
Iterable findAll = testDao.findAll();
return "Hello World!"+findAll.iterator().next().getAddress();
}
//插入数据库
@RequestMapping(value="/tps",method=RequestMethod.GET)
@ResponseBody
String tps(Shop shop) {
testDao.save(shop);
return "1";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(TestController.class, args);
}
}
java实体类
package test;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "shop")
public class Shop {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(nullable = false)
private String name;
@Column(nullable = true)
private String address;
}
测试的dao
package test;
import org.springframework.data.repository.CrudRepository;
public interface TestDao extends CrudRepository{
}
数据库
CREATE TABLE `shop` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(29) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10001 DEFAULT CHARSET=latin1;
/*Data for the table `shop` */
insert into `shop`(`id`,`name`,`address`) values (1,'9','aaaaa'),(2,'100','aaaaa'),(3,'94','aaaaa'),(4,'15','aaaaa'),(5,'114','aaaaa');
使用jmeter测试的地址为 :
http://localhost:8080/pv 直接测试输出内容
http://localhost:8080/qps 直接查询数据库
http://localhost:8080/tps 直接测试操作数据库数据
pv和qps都没有参数传递 操作过程参考
在测试计划 添加线程组
Numbers of Users 设置为 1000 表示同时启动1000个线程并发
Loop Count设置为10 每个线程会循环10次
添加 sampler 的 Http Request 输入ip和端口 请求的path 保存为jmx文件
添加listener 的 Summary Report 用于监听并发量
这里测试结果查看Summary Report的Throughout(吞吐量qps)我的结果是
/pv 3000左右qps
/qps 1500不到qps
tps有参数传递 操作过程参考
tps模拟三千个并发 每个都到数据库插入数据 必须是不一样的数据 此时我们可以添加一个计数器 让他自增
在http request的页面需要添加两个参数 name和address
在添加一个listerner View Results Tree 可以看实际执行被替换的值 点击运行开始测试 (启动springboot程序)
查看吞吐量 1000左右
当然动态值可以使用csv维护 或者随机值 都可以
三。jmeter分布式压测
上面的测试是负载测试 没有达到系统极限 只是为了获取单机的吞吐量
如果系统需要做压力测试 必须测试出系统的极限 也就是出现错误率 但是单机的线程数有限 比如设置线程数 10000时系统就已经死机 无法进行测试 可以将10000个线程分发到多个系统中进行测试 然后将多机结果合并到一个客户端进行统计 这就是分布式压测 原理图如下
注意点:
jmeter4.0后 默认远程测试 必须使用ssl for rmi来进行资源分配 可以禁用他 找到 bin/jmeter.properties(所有客户控制机和
agent代理机)都需要修改
server.rmi.ssl.disable=true
如果不想禁用他 可以在任意一台机器生成keystore文件 参考http://jmeter.apache.org/usermanual/remote-test.html#setup_ssl
执行bin\create-rmi-keystore.sh
输入别名rmi 其他的随便输入 密钥对密码直接回车默认密码时changeit最后输入yes 会在bin目录下生成rmi_keystore.jks
如果按照上面规则生成的就不需要修改任何配置 拷贝到所有其他机器的jmeter/bin目录 如果别名不是rmi密码也自己设置了
可以修改 jmeter.properties文件 如下相关项
#
# Configuration of Secure RMI connection
#
# Type of keystore : JKS
#server.rmi.ssl.keystore.type=JKS
#
# Keystore file that contains private key
#server.rmi.ssl.keystore.file=rmi_keystore.jks
#
# Password of Keystore
#server.rmi.ssl.keystore.password=changeit
#
# Key alias
#server.rmi.ssl.keystore.alias=rmi
#
# Type of truststore : JKS
#server.rmi.ssl.truststore.type=JKS
#
# Keystore file that contains certificate
#server.rmi.ssl.truststore.file=rmi_keystore.jks
#
# Password of Trust store
#server.rmi.ssl.truststore.password=changeit
#
# Set this if you don't want to use SSL for RMI
#server.rmi.ssl.disable=false
修改windows客户机agent的地址
remote_hosts=192.168.58.149,192.168.58.150
两个agent机器上 分别启动
./jmeter-server
出现以下表示成功
[root@node2 bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.58.149:58159,SSLRMIServerSocketFactory(host=node2/192.168.58.149, keyStoreLocation=rmi_keystore.jks, type=JKS, trustStoreLocation=rmi_keystore.jks, type=JKS, alias=rmi),SSLRMIClientSocketFactory(keyStoreLocation=rmi_keystore.jks, type=JKS, trustStoreLocation=rmi_keystore.jks, type=JKS, alias=rmi)](local),objID:[3e87da73:162ad2d59e0:-7fff, -8236211744330230598]]]
window机器 点击jmeter.bat启动界面 添加测试计划 点击run - startall 就可以启动测试
在agent机器的linux命令行 可以看到 输出
Starting the test on host 192.168.58.149 @ Mon Apr 09 18:37:57 PDT 2018 (1523324277629)
Finished the test on host 192.168.58.149 @ Mon Apr 09 18:38:33 PDT 2018 (1523324313314)
表示 开始成功测试 检测多个agent是否同时有输出