目录
一、概述
1、性能测试
(1)概念
模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试
- 峰值:客户指定指标数值或者场景需求数值,如:CPU使用80%以内,登录3秒内,占用内存空间40%
- 负载:用户(一个、多个)向服务器发送请求
验证软件系统是否满足业务需求场景,主要焦点是业务场景的满足(时间,空间)
(2)分类
- 负载测试:通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足系统性能指标的情况下,系统所能承受的最大负载量的测试。
通过逐步加压的方式来确定系统的处理能力,确定系统能够承受的各项阀值(关注的某一具体值)
逐步增加负载,在满足性能指标的情况下,测试系统的最大负载值
- 压力测试:通过逐步增加系统负载,测试系统性能的变化,并最终确定什么条件下系统性能处于【失效】状态。
逐步增加负载,使系统的某些资源达到饱和甚至失效。
- 并发测试:多用户同时访问同一个应用
- 目的:测试应用服务器【指定功能】的同时访问数是否达到预期指标
并发测试需要配合集合点(同步虚拟用户,恰好在同一时刻执行任务)来使用- 集合点: 用来聚集虚拟用户的,在controller中可以对集合点触发条件进行设置,当虚拟用户到达集合点后会停止接下来要进行的操作,直到满足集合点的触发条件,此时在集合点上的用户同时开始操作相同的动作,也就形成了所谓的“并发”。
- 简而言之就是可以设置并发数
- 稳定性测试:通过给系统加载一定的业务压力(如,CPU资源在70%~80%的使用率)的情况下,运行一段时间,检查系统是否稳定
通常稳定性测试持续一段时间即可(1、3、7天)
(3)常用指标:
- 吞吐量
- 概念:ThroughPut,是指单位时间内,处理的客户端请求数量,直接体现软件系统的性能承载能力。
- 业务角度:可以是用“业务数/h”、“业务数/d”、“访问人。数/d”、“页面访问量/d”来衡量。
- 网络角度:可以用“字节数/h”、“字节数/d”等来衡量。
- 并发数
- 概念:Concurrency,是指多个同时发生的业务操作。
(100个用户同时点击“登录”按钮)- 并发性测试描述的是多个客户端同时向服务器发出请求,考察服务器端承受能力的一种测试。
- 响应时间
- 概念:用户从客户端发起一个请求开始,到客户端接收得到从服务器端返回结果整个过程所消耗的时间。
- 点击数
1.它是衡量Web服务器处理能力的一个重要指标。 他的统计是客户端向Web服务器发送了多少次HTTP请求来计算的。
2.点击数通常不是一般认为的访问一个页面就是一次点击数,点击数是该页面所包含的元素 (如:图片、链接等)想Web服务器发出的请求数量。
3. 通常我们也用“每秒点击次数(HTTP Per Second)”来衡量Web服务器的处理能力
- 资源利用率
1.是指系统各种资源的使用情况,一般用 “资源的使用量/总的资源可用量x100%”来形成资源利用率的数据
2.通常没有特殊需求的话 a:建议CPU不高于80% b:内存不高于80% c:磁盘不高于90%
- 错误率
1.是指在负载的情况下,失败的概率。
2.不同系统对失败率要求不同,但是一般不超过千分之五(0.5%) 稳定性较好的系统,其错误率应该由超时引起,即为超时率。
2、接口测试
(1)接口
- API(Application Program Interface):属于一种操作系统或程序接口
- GUI(Graphic User Interface):属于一种图形操作系统
- 两者都属于直接用户接口,有时公司会将API作为其公共开放系统
- 公司制定自己的系统接口,当共需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式API
(2)接口测试
- 测试系统组件间接口
- 主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点
(3)适用环境
- 一般应用于多系统间交互开发
- 适用于为其他其他系统提供服务的底层框架系统和中心服务系统
- 适用于一个上层系统中的服务接口
- 平台越复杂,系统越庞大,接口测试效果越明显
接口测试可以发现很多在页面上操作发现不了的bug 可以检查系统的的异常处理能力 可以检查系统的安全性、稳定性 前端任意改变,接口测试通过,后端无需改变
(4)要点
- 检查数据的交换
- 传递和控制管理过程
- 以及系统间的相互逻辑依赖关系
接口测试就是通过测试不同情况下的输入参数与之相应的输出参数信息来判断接口是否满足或符合相应的功能性、安全性要求
(5)接口文档
- 接口说明
- 调用URL
- 请求方法(Post/Get)
- 请求参数、参数类型、请求参数说明
- 返回参数说明
V2EX社区API:https://www.v2ex.com/p/7v9TEc53 百度翻译接口文档:http://api.fanyi.baidu.com/api/trans/product/apidoc 京东联盟开放平台:https://union.jd.com/openplatform/api 支付宝支付api:https://docs.open.alipay.com/api 腾讯开放平台:https://wiki.open.qq.com/wiki/API%E5%88%97%E8%A1%A8
2、常见性能测试工具
(1)LoudRunner
性能稳定,压测结果以及细粒度大,可以自定义脚本进行压测,但是属于重量级软件,功能比较繁多
(2)Apache ab
单接口压测比较方便,可以模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多内容,但却会给目标服务器造成巨大的负载,简单DDOS攻击等。
(3)WebBench
webbench首先可以fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计。
(4)Jmeter
- 简单介绍
是Apache公司使用Java语言开发的用于对Web应用压力测试的工具,后来扩展到其他领域。
像RESTClient和Postman这样的测试工具在面对大规模、高并发的测试场景来说,很难应付。比如一个更新请求执行100次,同时模拟50个用户请求数据。
- 作用领域
接口测试、性能测试(内)、压力测试(外)、web自动化测试、数据库测试
- 优点
开源、免费;支持多协议(HTTP、HTTPS、FTP、FTPS);小巧方便;功能强大;高效
- 缺点
不支持IP欺骗(某接口访问一定量次数会出现收费的情况);不支持前端测试,无法验证JS程序和页面UI,必须要与Selenium配合完成Web2.0应用测试
二、Jmeter运行环境
1、JDK
- 概念:Java开发工具包,供程序员使用,包含JRE和JVM
- 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html
2、JRE
概念:Java程序运行环境,包含JVM和JVM运行所需要的资源
3、JVM
概念:Java虚拟机(Java实现跨平台的关键)
三、Jmeter下载与启动
1、下载
2、启动
进入Jmeter解压目录的bin目录
启动方式1:bin/Apachejmeter.jar 双击运行
启动范式2:jmeter.bat windows下的启动程序
jmeter.sh linux下的启动程序
3、Jmeter目录结构介绍
(1)Bin目录
存放可执行文件和配置文件
- jmeter.bat :windows系统中JMeter的启动文件
- ApacheJMeter.jar :java环境下JMeter的启动文件
- jmeter.sh:linux系统中JMeter启动文件
- jmeter.properties:系统配置文件
- jmeter-server.bat:windows分布式测试要用到的服务器配置文件
- jmeter-server:linux分布式测试要用到的服务器配置
(2)Docs目录
是JMeter的JavaDoc,可打开api/index.html页面来查看
例如file:///D:/Sets/apache-jmeter-5.2.1/apache-jmeter-5.2.1/docs/api/index.htmlf
(3)Printable_docs目录
printable_docs 的usermanual子目录下的内容是JMeter的用户手册文档,其中usermanual文件中component_reference.html是最常用的核心元件的帮助文档
(4)Lib目录
存储了JMeter整个功能插件,核心的依赖包
4、Other
(1) 进程
每个正在运行的应用程序,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
(2) 线程
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
线程就是按照进程的指令执行指定的代码模块。
(2) 线程组
多线程的组合
- 并发执行:多个线程同时执行(并不一定同时结束)
- 顺序执行:按照线程的启动顺序挨个执行
四、Jmeter简单使用
1、Test Plan:测试计划
- 测试所需要的所有“组件”都是基于“测试计划”添加、设置与执行的
- 组件:完成指定功能代码段的封装
(1)新建
方式一:
方式二:
(1)编辑
2、Threads(user):线程组
- 用于添加测试中使用的大多数组件
- setUp特殊线程组,测试计划运行结束之前首先执行,一般用于初始化操作,加载程序主体执行所需的资源。
- tearDown特殊线程,测试计划运行结束之后才执行,一般用于收尾工作,保存程序数据。
- 线程组:用于创建和实现测试计划场景
(1)新建
方式一:右键单击“测试计划”
方式二:
(2)编辑
- Ramp-up 可以理解为线程组运行所需的总的时间
- 勾选调度器前需要将循环次数勾选永远
3、HTTP请求(HTTP 取样器)
- 模拟前端或者第三方软件向服务器发送请求,并设置请求时的方法和参数数据。
(1)新建
鼠标右键单击线程组
(2)编辑
3、察看结果树
- 可以查看请求服务器时的请求信息、服务器响应数据,记录信息到指定文件
(1)新建
(2)查看与编辑
五、JMeter元件简单了解
1、配置元件(config Element)
- CSV数据文件设置(CSV Data Set Config)
- HTTP请求默认值
- HTTP信息头管理器
用于添加脚本的各种请求
为测试人员可以选择测试协议
2、前置处理器(Per Processors)
- 用户参数
用于处理项目中关于HTTP协议头
数据库连接处理程序
3、定时器(Timer)
- Synchronizing Timer
用于控制脚本运行时间和时长
4、取样器(Sample)
- HTTP请求
- JDBC Request
- 调试取样器(Debug Sampler)
5、后置处理器(Post Processors)
- 正则表达式提取器
- XPath提取器(XPath Extractor)
- XPath2提取器
脚本运行后,对返回值的处理设置
6、断言(Assertions)
- 响应断言
7、监听器(Listener)
- 察看结果树
- 聚合报告
- 断言结果
对测试过程和结果的监控
8、逻辑控制器
- 如果(if)控制器
- ForEach控制器
- 循环控制器
9、工作台
用于查案和管理测试脚本的基本属性信息
六、JMeter参数化
1、参数化
- 由于做批量化操作时,数据中键所对应的值都是写死的,每次只能手动改写,而且手写无法便捷的进行大量的数据操作。所以参数化后用程序代替人工,可以大大提高效率。
- 变量代替常量的过程
- 概念:根据需求动态获取数据并进行赋值的过程。
2、参数化方式
- CSV数据文件设置
- 用户参数
- 用户自定义的变量
- 函数
3、CSV数据文件设置
(1)介绍
概念:一种从外部读取数据功能的组件
过程:
A、设置线程组循环次数
B、CSV数据文件配置-从预先设置好的文档中读取变量配置
C、HTTP请求:BodyData填写JSON报文并设置请求方。法如:POSTD、参数化引用的数据格式: 参 数 名 。 如 {参数名}。如 参数名。如{name}
E、设置HTTP信息头管理器。
(2)参数配置
(3)请求头信息管理器
4、用户自动以变量
(1)创建(局部变量)
(2)创建
记得每次做出修改后,保存
(3)使用
(4)创建全局变量
N、实例
(1)通过“CSV数据文件设置”参数化
- 注意:分隔符
(2)通过函数助手参数化
- 打开
我的jmeter由于分辨率的原因,中间函数参数区域无法正常显示,下面的是网图
- 配置:用生成的代码代替请求的字符串的位置
注意:在点击“生成(Generate&……)”按钮后,The result of ……文本框中出现值,则说明配置正确
- 修改请求参数
六、Jmeter测试FTP请求
1、发送FTP请求
- FTP是一种文件传输协议
- FTP服务器是一个专门提供文件上传和下载功能的系统
- 服务器端口:21
- 服务
- 发送数据端口:20
(1)设置FTP默认请求(缺省值)
设置
- FTP服务器名或者IP
(2)FTP上传设置
在“默认请求”中,已经设置过了的参数,这里就不需要再进性设置
-
本地
- 本地文件内容
- 本地文件地址
-
上传方式
-
用户名
-
密码
(3)FTP下载设置
- 远程
- 远程文件地址
- 获取方式
- 用户名
- 密码
默认下载到Jmeter的bin目录下
七、Jmeter测试数据库
将需要对应版本的Java连接MySQL的驱动放入Jmeter的lib目录下
1、创建JDBC配置
(1)示例
2、创建JDBC请求
- 注意:参数类型必须是varchar
3、创建JDBC预编译请求
- 注意:请求的参数为多个时,参数中间用英文逗号隔开
- 参数类型也是
- 还有:SQL语句后面 不要加分号 “;”
(1)示例
2、察看结果树
八、Jmeter断言设置
1、添加断言
-
断言是针对请求的,一般的断言都隶属于一个请求
-
一般设置响应断言,用来验证服务器是否反悔了必要的信息
-
注意:用的较多的是响应文本和响应代码,不推荐使用文档设置断言,特别耗性能
- 匹配:不区分大小写
- 相等:区分大小写
- 运行脚本,查看断言的执行情况
- 或者单独设置错误的断言信息,用于验证
2、示例以及结果
九、Requests库
1、工具和脚本的区别
- 工具灵活性差,更加灵活
- 工具操作简单,脚本需要一定编程能力
- 工具适用于单一的接口测试,脚本更适用于业务连续的接
2、Requests库简介
- 中文帮助文档:http://2.python-requests.org/zh_CN/latest/
- 它是Python中唯一的一个非转基因的HTTP库,人类可以安全享用
3、安装
- win:
pip install requests
或者easy_install requests
- win(如果是Python3,上面的方法不成功):
pip3 install requests
- linux:
sudo pip install requests
4、Requests使用
(1)示例
def re_test():
re = requests.get("http://www.baidu.com")
te_text = re.status_code
print(te_text)
re_test()
(2)常用方法
- requests.request():构造一个请求,支持以下分钟方法
- requests.get():获取HTML主要方法
- requests.head():获取HTML头部信息的主要方法
- requests.post():向HTML网页提交post请求的方法
- requests.put():向HTML网页提交put请求的方法
- requests.patch():向HTML提交局部修改的请求
- requests.delete():向HTML提交删除请求
(3)Get请求
- 无参
def re_test():
re = requests.get("https://www.v2ex.com/api/topics/hot.json")
print(type(re))
te_text = re.status_code
print("---------")
print(te_text)
print("---------")
print(type(re.text))
print("---------")
print(re.cookies)
print("---------")
print(re.content) # 二进制
print("---------")
print(type(re.content)) # 二进制
print("---------")
print(re.encoding) # 二进制
print("---------")
print(re.content.decode("utf-8"))
# re_test()
- 有参
def re_test_n():
url = "https://www.v2ex.com/api/nodes/show.json"
data = {
"name": "Python",
"name":"Linux"
}
response = requests.get(url=url, data=data)
print(response.status_code)
re_test_n()
(3)Post请求+格式转换
提供了两种装换成Json格式的方法
url = 'http://apigateway.jianjiaoshuju.com/api/v_1/yzmCustomized.html'
header = {
'appCode': 'A292AA84EFADB138DC632C2D93984B34',
'appKey': 'AKID95336308872a6e3c475614e1afadc40a',
'appSecret': '1231af1bf535ca373b59d5b04d4a4a39'
}
data = {
'pri_id': 'ne',
'v_pic': st
}
re = requests.post(url, data=data, headers=header)
print(rejson()["title"])
print(json.loads(re.text)["title"])
十、聚合报告
1、创建
2、查看
- 样本(Samples):总共测试用例请求数
- 平均值(Average):平均响应时间(ms)
- 中位数(Median):50%请求响应时间的中间数值(ms)
- 90%:90%请求的响应时间7762ms
- 95%:95%请求的响应时间9687ms
- 99%:99%请求的响应时间14386ms
- 最小值(Min):最小响应时间
- 最大值(Maximum):最大响应时间
- 异常(Error%):本次测试中出现的错误率,错误的请求的数量/请求的总数
- 吞吐量(Throughput):默认情况下表示每秒完成的请求数
- 接收(Received KB/src):从服务器端接收到的数据量kb/s
- 发送(Sent KB/src):从客户端发送的请求的数量kb/s
3、查看运行日志
十一、分布式压测
1、介绍
- 普通压测:单台机可以对目标机产生的压力比较小,受限因素包括CPU、网络、IO等
- 分布式压测:利用多台机器向目标机器产生压力,模拟几万用户并发访问
2、原理
jmeter分布式压测原理
大多用Linux做服务的原因是GUI图形化界面比较耗性能
-
总控机器的节点master,其他产生压力的机器叫“肉鸡”server
-
master会把压测脚本发送到server上面
-
执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter
-
结束后,server会把压测数据传回master,然后master汇总输出报告
-
master和肉鸡最好是同一个网段
-
mvn package && java -jar 路径
-
linux守护进程:nohup java -jar 名称 &
-
ssh root@IP
十二、Linux下操作jmeter
- master:司令
- slaves:奴隶
- target:目标
- 注意关闭防火墙:service iptables stop
- RMI设置SSL或者将其禁用
- 远程拷贝(内网):scp -r 文件路径 root@IP:目标机器目录
- 启动:./jmeter-server 或者 nohup ./jmeter-server &
- 压测要用内网IP,公网会限制贷款
1、部署
- wget 网址
2、操作
- -h:帮助
- -n:非GUI模式
- -l(L):记录结果的文件,每次运行之间要确保没有运行过,即xxx.jtl不存在,否则会报错
- -t:指定要运行的 jmeter 测试脚本文件
- -r:jmeter.properties文件中指定的所在远程服务器
- -e:在脚本运行结束后生成HTML报告
- -o:用于存放HTML报告的目录(目录不能为空,否则会报错)
- jmeter -n -t 测试计划名 -l 文件名 -e -o 路径
例子:jmeter -n -t HTTP_test.jmx -l result.jtl -e -o /user/local/test/ResultReport
1、日志出现:of run 为压测结束
2、压测结果存在在设置目录的index.html文件中
3、可视化图形报告分析
(1)Dashboard核心指标
- A:Test and Report informathion
- Source File:jtl文件名
- Start Time:压测开始时间
- End Time:压测结束时间
- Filter for Display :过滤器
- Label:sample采样器名称
- B:APDEX(Application Performance Index)
- apdex:应用程序性能指标,范围在0~1之间,1表示达到所有用户均满意
- T(Toleration Threshold):可接受阀值
- F(Frustration THreshold):失败阀值
- C:Requests Summary
- OK:成功率
- KO:失败率
- D:Statistics 统计数据
- label:sampler采样器名称
- samples:请求总数,并发数*循环次数
- KO:失败次数
- Error%:失败率
- Average:平均响应时间
- Min:最短响应时间
- Max:最长响应时间
- 90th pct:90%对的用户响应时间不会超过xx
- 95th pct:95%对的用户响应时间不会超过xx
- 99th pct:99%对的用户响应时间不会超过xx(存在极端值)
- Throughput:Request per Second 吞吐量 qps
(2)Chart
- A:Over Time (随着时间的变化)
- Response Times Over Time:响应时间变化趋势
- Response Time Percentile Over Time(Successful response):最大、最小、平均,用户响应时间分布
- Active Threads Over Time:并发用户趋势
- Bytes Throughput Over Time:每秒接收和请求字节数变化,蓝色表示发送,紫色接受
- Latencies Time Over Time:平均响应时间趋势
- Connect Time Over Time:连接耗时变化趋势
- B:Throughput
- Hits Second(excluding embedded resource):每秒状态码数量
- Codes Per Second(excluding embedded resource):即TPS,每秒事务数
- Response Time VS Request:响应时间和请求数对比
- Latency VS Request:延迟时间和请求数对比
- C:Response Times
- Response Time Percentiles:响应时间百分比
- Response Time Overview:响应时间概述
- Time VS Threads:活跃线程数和响应时间
- Response Time Distribution:响应时间分布图
3、错误解决
(1)
- 一、
- 二、解决
- bin目录中输入
- 修改初始堆内存、最大堆内存
(2)
- 一、
- 二、解决
(3)
- 一、
- 二、
3、实测
(1)指标
(2)修改配置
jmeter.properties中remote_hosts中slave的IP地址和端口号
remote_ hosts=192. 168.0.102: 8899, 192.168.0.101 :8899