性能测试:在功能测试基础,多用户并发的测试
服务器端性能测试:基于协议的多线程/多协程 接口测试()
抓包+接口文档,PostMan调试,JMeter的单线程调试
单元级别的
一、定义
性能测试针对系统的性能指标,建立性能测试模型,制定性能测试方案,制定监控策略,在场景条件之下执行性能场景,分析判断性能瓶颈并调优,最终得出性能结果来评估系统的性能指标是否满足既定值。
二、目的
1、压测系统看系统的前端以及后端是否满足预期
2、压测系统看系统是否可以承受的最佳压力和最大压力,来判断系统的承受极限
3、压测系统看系统在长时间运行下是否可以正常处理请求(疲劳测试)
4、容量规划
三、分类
1、一般性能测试
一般性能测试主要验证软件在正常环境和系统条件下,即不施加任何压力情况下重复使用系统验证其是否能满足性能指标,如响应时间、系统资源占有情况等。
2、负载测试
负载测试主要是在“基于或模拟系统真实运行环境及用户真实业务使用场景”情况下,通过不断给系统增加压力或在一定压力下延长系统运行时间,来验证系统各项性能指标的变化情况,直到系统性能出现“拐点”,即某个性能指标达到了事先约定的指标阈值(极限值)。
3、压力测试
压力测试主要是在“模拟系统已处于极限负载下或某指标已经处于饱和状态”情况下,继续给系统增加负载或运行时间,观察系统性能表现,验证系统是否出现内存泄露、系统宕机等严重异常。
4、大数据量测试
大数据量测试主要是指使用大批量数据对系统产生压力或影响,同时验证系统各项指标运行是否正常。
10月05——————————————————————————————————————
移动端的性能测试:
客户端性能测试(专项测试,工具,插桩) + 网络 +
服务器端的测试(JMeter)
Web端的性能测试:前端 + 网络 + 服务器端的(JMeter)
测试的流程
1、测试计划阶段
工作内容:
1)明确测试对象
-
定义测试目标
-
定义测试通过的标准
-
规划测试进度
-
规划测试参与人员(需求、开发、测试、运维和配置)
6)申请测试资源
- 风险控制
2、测试设计阶段
工作内容:
1)设计测试用例(根据不同场景设计)
2)设计测试数据
3)设计测试场景
3、测试开发阶段
工作内容:
1)测试环境搭建
2)测试过程文档定义以及配置
3)测试脚本开发、调试()
4)测试数据准备
5)基准测试
4、测试执行阶段
1)执行测试用例模型,包括执行脚本和场景
2)测试过程监控,包括查看log(tail -f)、监控服务器资源、数据库和中间件等
5、测试结果分析
1)根据测试结果和监控结果进行测试分析
2)根据性能测试目标,分析出系统存在的性能瓶颈,并给出优化建议
6、测试报告的内容
1.测试范围
2.测试执行以及参与人员
3.基准测试数据
4.测试执行的详细步骤
5.(场景设计)
6.测试数据记录、监控结果
7.测试结果对比以及总结性评价
要先设置代理
/index.php/bug(.*?)';
10.7.90.183
http://10.7.90.183:8032/bugfree/index.php/site/login
配置元件/HttpCookie
Jmeter可以通过浏览器/postman抓包
%E9%99%88%E9%9B%85%E6%96%87
10月07号——————————————————————————————————————————
元件的执行顺序 :配置元件,取样器,监听器;取样器是按照树状图的顺序从上到下执行的
1、User Defined Variables:用户定义的变量
添加—配置元件—用户定义的变量
2、函数助手:_CSVRead
3、CSV Data Set Config:CSV数据集配置
4、User Parameters:用户参数
添加—前置处理器—用户参数
5、数据库
数据库配置
Variable Name for created pool: my
MaxNumber of Connections:10
Database URL :jdbc:mysql://localhost:3306/test
JDBC Driver class: com.mysql.jdbc.Driver
username;
password
//if控制器的
${__jexl3("${u_gender_1}"=="女",)}
//if控制器的判断
${__jexl3(${u_age_1}>18,)}
断言
$.message
$.result[0].goodsName
1、bugfree先通过Postman调试(登录,添加Bug,提交Bug,退出)设置代理
2、Jmeter录制
3、3个用户名,使用csv数据驱动
8月12号——————————————————————————————————————————————
http://10.7.90.183:8032/bugfree/index.php/site/login
定时器多用于取样器之前,等待时间
同步定时器,集合点,目的是为了模拟真正意义上的并发
断言一般出现与某个取样器下面,右键添加
**定时器|前置处理器|后置处理器 一般某个取样器中 **
在线程组中,配置元件实最早执行的,监听器是最后执行的,与在线程组的位置无关
字符串的拼接在函数助手里需要用V函数
Controller / 一台机器
Agent 2台,20并发
1011———————————————————————————————————————————————
Jmeter使用步骤
1、通过postman(浏览器)实现所有的接口(接口文档,问开发)
2、postman中设置代理,Jmeter设置
3、Jmeter需要四个组件,HttpCookie管理器,线程组,测试计划/代理服务器,录制控制器
4、在代理服务器中启动
5、PostMan中发送请求,观察【录制控制器】下是否有接口
注意;如果录制的是本机,浏览器访问不能使用localhost,否则无法录制
10月12日—————————————————————————————————————————————
System.out.println("**********hello,cmd");
log.info("*************hello,log");
log.info("********"+vars.get("u_pwd"));//获取变量的两种方式
log.info("********"+"${u_pwd}");
String new_pwd = vars.get("u_pwd")+"hello";
vars.put("new_pwd1",new_pwd);
使用java文件
source("");
String result = BeanShellDemo.encode_pwd(vars.get("u_pwd"));
vars.put("new_pwd", result);
使用class文件
addClassPath("");
import BeanShellDemo;
String result = BeanShellDemo.encode_pwd(vars.get("u_pwd"));
vars.put("new_pwd", result);
导出jar
import com.edu.www.BeanShellDemo;
String result = BeanShellDemo.encode_pwd(vars.get("u_pwd"));
vars.put("u_pwd", result);
vars适用于当前线程组,props适用于跨线程组
如果需要在不同线程组传参,要勾选独立运行每个线程组
第一个线程组设置属性使用props
//props.put("code1", ${code_result});
${__property(code1,${code_result},)};
第二个线程组,获得属性有三种方式
log.info("222**********" + props.get("code1"));
log.info("222**********" + ${__P(code1)});
//${__P(code1,)}
//${__property(code1,,)}
log.info("222**********" +${__property(code1)});
log.info("222**********" +vars.get("code2"));
//source("E:/test/beanShellDemo/BeanShellDemo.java");
//String result = BeanShellDemo.encode_pwd(vars.get("u_pwd"));
//vars.put("new_pwd", result);
//addClassPath("E:/test/beanShellDemo");
//import BeanShellDemo;
//String result = BeanShellDemo.encode_pwd(vars.get("u_pwd"));
//vars.put("new_pwd", result);
————————————————————————————————————————————
30%用户浏览,20%加入购物车,50提交订单
if 控制器用于虚拟用户的分流
数值的比较 ${__jexl3(${__threadNum}%2==0,)}
字符串的比较 ${__jexl3("${gender_1}"=="男",)}
在Jmeter中,取样器最核心的
${__jexl3("${count}"<"5",)}
ForEach控制器,实现Discuz像三个不同的模块发帖
交替控制器与线程组的线程数量、循环次数结合使用
Switch控制器,Switch Value值可以是0,1,2,3下标,也可以是取样器的name,如果不确定执行那个请求可以使用${__Random(0,1,)},例如:对于bug的不同处理
随机控制器等价于 Switch控制器 + ${__Random(0,1,)}
随机顺序控制器适用于接口之间没有依赖关系的压力测试,例如,浏览不同的id的商品信息
吞吐量控制器:指取样器的执行次数,与线程组的循环次数结合使用,循环测试需要大于吞吐量控制器中设定的次数
log.info
log.info("${__UUID}")
同步定时器:实现真正意义上的并发
Jmeter扩展开发
${__threadNum} 线程编号
执行顺序:配置元件,取样器,监听器
作业:1、使用实现一个用户【ForEach控制器】实现Discuz向三个不同的模块发帖
————————————————————————————————————————————————
数据库性能测试
操作语句四大类 DDL,DML,DQL,(order by、group by + 聚合函数 + Having 左连接查询,右连接查询)、内连接,联合查询 、DCL
mysql 用数据库
use test; 切换到某个数据库
开始一个事务,begin;
执行
commit;这时候就可以在表中看到了
rollback; 回滚,撤销上一步操作
update account set money=money-1000 where name=“张三”
update account set money=money+1000 where name=“李四”
n
创建视图
create VIEW hr_employee
as
select empno,sal from employee
创建触发器
create trigger trigger_work after insert on work_time_delay for each row
begin
update employee set sal =sal-100 where empno=new.empno
end
创建存储过程
create procedure p1(in num int)
begin
select * from test_index limit 10;//实际项目中不要用select *
end
select * from test_index limit 10;前十条
select * from test_index limit 9,20;从第十条开始,查询共计20条记录
select * from test_index order by id desc limit 5; 查询最后五条
存储引擎针对的是表,不是库
1、先有一个表,不带索引100W条记录
2、alter table test_index add index index_name(username);
创建索引的方法
1、
创建表时候创建索引
create table table1(id int(5), index(id))
查看
– show index from table1;
删除索引
– drop index id on table1;
– show index from command;
增加全文索引
– alter table command add fulltext(instruction)
select * from command where instruction like ‘remove%’
用索引查询,精确匹配
select * from test_index where MATCH(password) AGAINST(‘marB9Za’)
select * from test_index where MATCH(password) AGAINST(‘marB9Z*’ in boolean mode)
系统用户 10W
在线用户 1W
并发用户 1W * 0.2
Python 协程
windows ——> linux
保证ping
[root@localhost~]#就表示登录成功了
192.168.88.120
ifconfig ens33 192.168.157.200
vmstat 1 10每秒一次,显示十次
linux 查看所有端口
netstat -ntlp
crontabl -l
晚上八点压测,星期一到星期五
00 20 ** 1-5 nmon -s 5 -c 采样次数 -m /test
*/1 * * * * date >>/test/wenyay/hello.log