性能测试理论知识
一、性能测试理论
1、 性能测试概念
已经通过功能测试,且带投产的应用版本,在系统环境下,通过自动化的测试工具模拟出多种正常.峰值以及异常负载条件来对系统的各项指标进行测试,用来验证系统是否达到预期的性能要求。
系统架构主要分B/S、C/S。
网络协议分TCP、HTTP、HTTPS。
TCP——TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。用于C/S架构。(浦发最主要协议)
Loadrunner——1)winsocket协议、xml请求包,均可以使用TCP
Winsocket协议——https://blog.csdn.net/x_iya/article/details/52523174
http://www.51testing.com/html/71/410671-807881.html
HTTP——2)HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。用于B/S架构。
HTTP 1.0——短连接。在LR11脚本里体现方式不同。登录、登出放在action。
HTTP 1.1——长连接。登录放在init、登出放在end。
Loadrunner——录制脚本(流程)、请求格式相对固定报文发送(手工方式开发)。
3)Webservice协议——三种请求方式,
Xml报文概念——https://blog.csdn.net/qq_24505127/article/details/53057099;
调用wsdl文件——相关概念,https://zhidao.baidu.com/question/316845646.html;
webservice_call——https://blog.csdn.net/florachy/article/details/72674649;
web_custom_request(直接发送soap报文)——
https://blog.csdn.net/jiang1986829/article/details/48132933
4)Tuxedo——银联前置系统。http://www.baike.com/wiki/Oracle+Tuxedo
以上协议均在LR11中有体现。
2、 性能测试对象
对象:对象由业务功能、应用代码、服务器硬件、网络设备、操作系统。
Linux基本操作命令(目录、文件操作、用户管理、进程查看、cpu/内存/磁盘/网络等)
角色:web服务器、中间件、应用服务器、数据库服务器构成的完整的系统。
方式:业务流程(工具录制)、接口测试(直接写测试代码)。
3、 性能指标
1) 用户数(单位:个)
系统能够支持的用户数是系统容量的重要标志,并发用户数用于度量系统在高并发量访问下,系统的并行处理能力,一般如果系统中存在死锁、资源争用,在并发访问下,由于请求处于队列等待中,系统响应就会随着时间变慢。
种类:
a)在线用户数:用户同时在一定时间段的在线数量。(think_time与pacing time,一般来说,都是http访问web浏览器页面时设置)
b)并发用户数:某一时刻同时向服务器发送请求的用户数。(接口测试)
集合点体现更集中的并发。lr_rendzvous ( “name” );
比如,某网站存在注册用户数为10W人,但同时在线最多1W人,但这1W个人,
可能只有500人会浏览帖子,500人会进行发帖,只有这1000个人对服务器才有
交易,那我们计算并发量的时候,就可以以1000为标准!
2)响应时间(单位:秒,性能测试中,以事务方式来计算交易提交的衡量响应时间)
a)平均响应时间:整个测试场景执行中,执行事务所耗时间的平均值。
b)90%响应时间:我可以推断出90%Percent是先将响应时间由大到小排序(假设
有10个响应时间,1s,2s,3s,4s,5s,6s,7s,8s,9s,10s),然后去掉最大的响应时间(10s),
取9s作为90% Percent时间。
3)系统处理能力(单位:笔/秒,TPS / QPS)
每秒钟完成的业务数,是衡量系统吞吐能力的重要指标。将真实业务量进行8.2原
则换算为TPS。一天的业务量为10000笔交易,工作时间9:00-17:00,八二原则,8000笔/2*3600=1.1
4)交易成功率
事务成功率越高,则表明系统处理能力越大;而失败事务主要由于系统响应慢,导
致访问业务功能超时,或者系统业务功能异常,不能正常访问等。
计算公式:成功笔数/(成功笔数+失败笔数),99.9%
5)服务器资源使用率
a)CPU——CPU使用率一般不超过75%,
windows性能计数器的%Processor time;
Linux可用TOP、sar、vmstat命令,us%(用户态CPU使用率)+sy%(系统态CPU使用率)。
b)内存——内存使用率一般不超过75%,
windows性能计数器的available memory;
Linux可用TOP、free、vmstat命令,可用内存为free+buffers+cached。
c)存储IO——可用容量、disk使用率。
d)网络流量
Linux资源监控:https://blog.csdn.net/vcwanglailing/article/details/73290421(nmon工具)
6)性能测试模型
计算公式:a. 平均QPS(TPS)= 并发数/平均响应时间。
b. 平均并发用户数的计算:C = nL / T
其中C是平均的并发用户数,n是平均每天访问用户数(login session),L是一天内用户从登录到退出的平均时间(login session的平均时间),T是考察时间长度(一天内多长时间有用户使用系统)。
c. 并发用户数峰值计算:C^ = C + 3*根号C。
4、 与性能测试相关的Linux命令(需自行补充所知的Linux命令)
查看进程状态
#ps –elf 或 ps aux
查看网络tcp连接状态
#netstat -na
查看当前操作系统内核信息
# uname -a
查看当前操作系统发行版信息
# cat /etc/issue | grep Linux
查看linux版本
lsb_release -a
查看机器型号
dmidecode | grep "Product Name"
5、 主流的测试工具
验证系统整体性能:Loadrunner、Jmeter等。
验证系统前端性能:httpwatch、dynatrace等。
6、 Loadrunner工具三大组成部分
虚拟用户生成器 (VuGen) ― 创建脚本VuGen 通过录制应用程序中典型最终用户执行的操作来生成虚拟用户 (Vuser)。VuGen 将这些操作录制到自动虚拟用户脚本中,以便作为负载测试的基础。
Controller ― 设计和运行场景Controller 是用来创建、管理和监控负载测试的中央控制台。使用 Controller 可以运行用来模拟真实用户执行的操作的脚本,并可以通过让多个 Vuser (虚拟用户)同时执行这些操作来在系统中创建负载。
Analysis ― 分析场景Mercury Analysis 提供包含深入的性能分析信息的图和报告。使用这些图和报告,可以标识和确定应用程序中的瓶颈,并确定需要对系统进行哪些更改来提高系统性能。
7、 loadrunner11脚本开发
1) html/http协议(录制脚本)
Action()
{
web_set_max_html_param_len("10000");
web_reg_save_param("retCode",
"LB=retCode\":\"",
"RB=\"",
"NotFound=WARNING",
LAST);
lr_start_transaction("test");
web_custom_request("test",
"URL=http://127.0.0.1/test?channelno=1&phoneno=12345678912",
"Method=GET",
"Resource=0",
"Referer=",
"Mode=HTTP",
"EncType=txt/html; charset=UTF-8",
"Body=",
LAST);
if (!strcmp(lr_eval_string("{retCode}"),"000000"))
{
lr_output_message("Successfull, retcode is:%s", lr_eval_string("{retCode}"));
lr_end_transaction("test", LR_PASS);
}
else{
lr_error_message("Failed, retcode is:%s", lr_eval_string("{retCode}"));
lr_end_transaction("test", LR_FAIL);
}
return 0;
}
2) webservice协议
方法一,调用webservice:一般采取Import wsdl的方式,在Manage Services中将wsdl文件或者访问地址导入,然后Add Service Call。在添加过程中可以设定参数。
方法二,导入SOAP:采用Import Soap的方式,将xml文件导入。URL写上不带wsdl的访问地址,此种方法可以写入用于连接服务器的用户名和密码。
方式三,利用HTTP协议访问。先用SOAP的方式把脚本录一下。然后将soap_request添到web_custom_request这个函数里。
3) winsocket协议
步骤:
---建立Socket连接:
int rc = 0;
rc = lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=172.16.1.93:9993", LrsLastArg); //lrs_create_socket("连接名", "连接方式", "LocalHost=0", "RemoteHost=访问地址和端口", LrsLastArg);
if (rc==0)
lr_output_message("Socket was successfully created ");
else
lr_output_message("An error occurred while creating the socket, Error Code: %d", rc);
---发送数据:
lrs_send("socket0", "buf0", LrsLastArg); //将buf0中的内容发送到指定的端口socket
---接收数据:
lrs_receive("socket0", "buf1", LrsLastArg); //接受服务器返回数据保存到buf1
lrs_receive_ex("socket0", "buf2", "NumberOfBytesToRecv=126", LrsLastArg); //强制指定接收报文的长度
---断开Socket连接:
lrs_close_socket("socket0");
---关于data.ws(在脚本的data.ws部分):
data.ws中存放的收发的数据包。格式为
;WSRData 2 1
send buf0 399
“111”
recv buf1 126
4) java vuser协议
可通过导入jar包,进行java接口的性能测试。
第一步:loadrunner创建java_vuser脚本 :
在建立脚本界面选择Create/Edit Script-->New Script-->选择java协议-->java_vuser 建立脚本。
第二步:配置loadrunner的环境:
在run-time-setting 设置classpath。
第三步:导入公司开发的java包:
和java配置一样, 还有要import com.lr_class.*,在脚本目录建立com文件夹,在com中在加lr_class文件夹,将用到的类文件放在其中。
第四步:开发javavuser脚本:脚本用gzip压缩和公司开发的加密算法(如果存在)。
备注:http协议中使 web_custom_request函数中的 BodyBinary参数发送字节流,也可以完成。
示例:
import lrapi.lr;
import com.lr_class.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.DefaultHttpClient;
public class Actions
{
public int init() throws Throwable {
return 0;
}
public int action() throws Throwable {
String url ="http://xx.xx.xx.xx/stats/uploadData";
int code;
byte[] dataBytes= Fdata.putData("<testing>","<user>","<id>","<age>","<time>",1,1,5,1,1348042886,4,13432909036L,1234567890123455L,1,1);
System.out.println(dataBytes);
byte[] b = UnGZIP.compressToByte(dataBytes);
b = XXXXXRC4.code(b);
System.out.println(b);
lr.start_transaction("发送");
ByteArrayInputStream bs = null ;
bs = new ByteArrayInputStream(b, 0, b.length);
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/octet-stream");
HttpEntity he = new InputStreamEntity(bs, b.length);
httpPost.setEntity(he);
HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);
code = httpResponse.getStatusLine().getStatusCode();
if (code == 901) {
lr.output_message("成功 code:"+code);
lr.end_transaction("发送", lr.PASS);
}
else{
lr.error_message("失败 code:"+code);
lr.end_transaction("发送", lr.FAIL);
}
return 0;
}
public int end() throws Throwable {
return 0;
}
}
8、 脚本的重要组成部分
1) 事务(又称为Transaction),LoadRunner运行到该事务的开始点时,LoadRunner就会开始计时,直到运行到该事务的结束点,计时结束。这个事务的运行时间在LoadRunner的运行结果中会有反映。
2) 集合点,执行负载测试时, 需要模拟系统上有较重的用户负载。要实现此操作,可以同步 Vuser 以便恰好在同一时刻执行任务。通过创建集合点,可以配置多个 Vuser 同时执行操作。
3) 思考时间,思考时间模拟实际用户在不同操作之间等待的时间。例如,当用户收到来自服务器的数据时,可能要等待几秒钟查看数据,然后再做出响应。这种延迟就称为“思考 时间”。lr_think_time(5);
4) 关联,在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。
5) 参数化,作用是模拟真实用户的行为,当然需要不同的账户。
参数化规则:顺序取值、唯一取值、随机取值。
参考资料:https://www.cnblogs.com/whitewasher/p/7614689.html
9、 测试场景种类
基准测试——单用户对某一只交易进行100次迭代操作(pacing time设置为1秒),验证单交易在单用户操作下的性能表现,保证功能性。
单交易并发测试——采用一定量的用户数对某一只交易进行并发操作,验证单交易的并发性能。
负载测试——采用业务模型,大用户量,综合评估系统的性能表现。体现在模型的轻载区。
业务模型(TPS占比、用户数占比):
|
交易代码 |
交易功能描述 |
TPS/用户占比 |
|
A |
|
30% |
|
B |
|
50% |
|
C |
|
10% |
|
D |
|
10% |
如果有2000个用户(在线用户或者是并发用户),2000中的30%、50%、10%、10%。
容量测试——在负载测试基础上,寻找最佳TPS、最佳在线用户数或最佳并发用户数。
健壮性测试——模拟多服务器环境,意外裆机情况下,系统是否能够正常运行。
稳定性测试——一般执行24小时长时间压测。
二、性能测试实施(环境要求)
三、性能调优实施
四、性能测试环境挡板
在一些跨系统的性能测试项目中,往往由于客观因素的限制(测试硬件资源有限、多系统之间的协调等),我们无法搭建一个完整的测试环境来完成测试工作。此时,我们一般会搭建出被测系统,然后采用软件程序来模拟其他相关系统的功能。该软件程序一般被称为挡板。
五、方案、报告评审
六、性能测试工作中经常碰到的问题
环境变动,比如:有多个项目共享、测试应用版本不稳定、功能需求升级变动。
相关人员配合度:开发人员、开发经理、项目经理不配合你实施测试工作。