一、主流性能测试工具

        1、Loadrunner

                是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈。

        支持多协议:Web(http/html)、Windows Sockets、FTP、ODBC、MS SQL Server等

        采用C语言编写

        优点:

        ---多用户(支持用户以万为单位)

        ---详细的分析报表(以秒为单位)

        ---支持IP欺骗功能

        缺点:

        ---收费

        ---体积庞大(安装包单位GB)

        ---无法定制功能

        2、Jmeter

        是apache组织开发的基于java的开源软件,用于对系统做功能测试和性能测试

        优点:

        1、开源免费

        2、小巧(安装包50M左右)

        3、丰富的学习资料和扩展组件

        缺点:

        1、不支持IP欺骗

        2、分析和报表能力相对于LR欠缺精度

granfa性能监控 性能测试监控工具介绍_granfa性能监控

二、JMeter功能概要

        JDK常用文件目录介绍

        Bin目录:存放可执行文件和配置文件

        

granfa性能监控 性能测试监控工具介绍_jmeter_02

 

         docs目录:jmeter的api文档,用于开发扩展组件

        printable_docs:用户帮助手册

        lib目录:存放jmeter依赖的jar包和用户扩展所依赖的jar包

三、元件的基本介绍

        1、元件:多个类似功能组件的容器(类似于类)

        取样器:发送请求

        逻辑控制器:控制语句的执行顺序

        前置处理器:对请求参数进行预处理

        后置处理器:对响应结果进行提取

        断言:检查接口的返回结果是否与预期结果一致

        定时器:设置等待

        测试片段:封装一段代码,供其他脚本调用

        配置元件:测试数据的初始化配置

        监听器:查看jmeter脚本的运行结果

       2、组件的基本介绍

        组件:实现独立的某个功能(类似于方法)

        

granfa性能监控 性能测试监控工具介绍_jmeter_03

 四、元件的作用域和执行顺序

        1、元件的作用域

        是靠测试计划的树形结构中元件的父子关系来确定的

        提示:所有的组件都是以取样器为核心来运行的。组件添加的位置不同,生效的取样器也不同。

        2、作用域的原则:

        取样器:核心,不和其他元件相互作用,没有作用域

        逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用

        其他元件:

                如果是某个取样器的子节点,则该元件只对其父节点起作用

                如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)

        3、元件的执行顺序

                同一个作用域下不同类型元件

                a、配置元件

                b、前置处理程序

                c、定时器

                d、取样器

                e、后置处理程序

                f、断言

                g、监听器

                同一个作用域下多个相同类型元件:

                按照在测试计划中从上到下的顺序一次执行

                

granfa性能监控 性能测试监控工具介绍_测试工具_04

                 正确顺序:

                定时器1-请求1-定时器1-定时器2-请求2-定时器1-定时器3-请求3

五、jmeter使用示例

        第一个案例:使用jmeter访问百度首页接口,并查看请求和响应信息

        步骤:

        1、启动jmeter

        2、在“测试计划”下添加“线程组”

        3、在“线程组”下添加“HTTP请求”取样器

        4、填写“HTTP请求”的相关请求数据

        5、在“线程组”下添加“察看结果数”监听器

        6、点击启动按钮运行,并查看结果

六、线程组

        1、作用:线程组就是控制jmeter用于执行测试的一组用户

        特点:

        模拟多人操作;

        线程组可以添加多个,多个线程组可以并行或串行

        取样器(请求)和逻辑控制器必须依赖线程组才能使用

        线程组下可以添加其他元件下组件

        2、线程组分类

        线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户

        setUp线程组:一种特殊类型的线程组,可用于执行预测试操作

        tearDown线程组:一种特殊类型的线程组,可用于执行测试后工作

      

granfa性能监控 性能测试监控工具介绍_jmeter_05

         3、案例分析

                使用1个线程组,添加http请求访问

                --配置线程数为2,循环次数为3时,运行观察结果

                --配置线程数为3,循环次数为2,运行观察结果

                分析:

                --线程数代表虚拟用户数,用户数越多,负载越大

                --循环次数代表运行时间,次数越多,运行时间越长

七、HTTP请求

        

granfa性能监控 性能测试监控工具介绍_jmeter_06

八、查看结果树

        作用:查看http请求的请求和响应结果

        组成:

        1、取样结果:查看响应信息头信息、响应状态码

        2、请求:查看请求相关信息(url、方法、参数)

        3、响应:查看响应信息

 九、参数化

        参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法。

        jmeter中常用的参数化方式:

        1、用户定义的变量-----全局变量

                位置:测试计划--线程组--配置元件--用户定义的变量

                例如:定义被测系统的协议、域名、端口号

                使用的时候:${变量名}

                局限性:每次取值(无论是否相同的用户)都是固定值

        2、用户参数-----为每个用户分配不同的参数值

                为什么使用用户参数:性能测试时有多个用户同时请求,每个用户在登录请求时需要使用不同的用户名密码进行登录。

                作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值

                位置:测试计划---线程组---前置处理器---用户参数

                记得设置线程数为n(表示模拟的用户数)

                局限性:同一个用户在多次循环时,取到相同的值

        3、CSV Data Set Config----文件方式参数化

                为什么要使用csv数据文件参数化?

                性能测试时有多个用户登录,登录后循环添加商品,每次添加时商品的参数不能相同,该怎么做?

                作用:让不同用户在多次循环时,可以取到不同的值

                位置:测试计划---线程组---配置元件---csv数据文件设置

                局限性:需要手动进行测试数据的设置

granfa性能监控 性能测试监控工具介绍_jmeter_07

        4、函数----随机数据

                性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同,该怎么做?

                函数(_counter)

                位置:工具---函数助手对话框---counter

                性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同。

                设置:TRUE,每个用户有自己的计数器;FALSE,使用全局计数器

                使用:生成--复制

                局限性:输入数据有特定的业务要求时无法使用(如登录)

        5、数据库

  十、断言

        断言:让程序自动判断预期结果和实际结果是否一致

        提示:

        ---jmeter在请求的返回层面有个自动判断机制(响应状态码)

        ---但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性

        jmeter中常用断言:

        --响应断言

        --json断言

        --持续时间断言(Duration Assertion)

        1、响应断言

        作用:对http请求的任意格式的响应结果进行断言

        位置:测试计划--线程组--http请求--(右键添加)断言--响应断言

        参数配置详细介绍:

        测试字段:要检查的项(实际结果)

        --响应文本:来自服务器的响应文本,即主体

        --响应代码:响应的状态吗,例如:200

        --响应信息:响应的信息,例如ok

        --响应头

        --请求头

        --请求数据

        --URL样本:请求url

        --文档(文本):响应的整个文档

        --忽略状态:忽略返回的响应状态吗

        模式匹配规则:比较方式

        --包括:文本包含指定的正则表达式

        --匹配:整个文本匹配指定的正则表达式

        --相等:整个返回结果的文本等于指定的字符串(区分大小写),重点使用

        --字符串:返回结果的文本包含指定字符串(区分大小写),重点使用

        --否:取反

        --或者:如果存在多个测试模式,勾选代表逻辑或(只要有一个模式匹配,则断言就是OK),不勾选代表逻辑与(所有都必须匹配,断言才是OK)

        测试模式:预期结果

        2、JSON断言

                作用:对http请求的json格式的响应结果进行断言

                位置:测试计划--线程组--http请求--右键添加断言--json断言

                

granfa性能监控 性能测试监控工具介绍_测试工程师_08

 Assert JSON Path exists:$.weather.city     例子

        3、断言持续时间

        作用:检查http请求的响应时间是否超出要求范围

        位置:测试计划--线程组--http请求--右键添加断言---断言持续时间

        参数介绍:

        --持续时间(毫秒):http请求允许的最大响应时间(单位:毫秒)。超过则认为失败

十一、jmeter  关联

        关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。

        jmeter中常用的关联方法:

        1、正则表达式提取器

        正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容。

        公式格式:左边界(.*?)右边界,可以提取出想要获取的内容

    

granfa性能监控 性能测试监控工具介绍_granfa性能监控_09

granfa性能监控 性能测试监控工具介绍_jmeter_10

        2、XPath提取器

        作用:针对html格式的响应结果数据进行提取

        位置:测试计划--线程组--http请求--右键添加后置处理器--XPath提取器

        

granfa性能监控 性能测试监控工具介绍_测试工程师_11

        3、JSON提取器

                作用:针对json格式的响应结果数据进行提取

                位置:测试计划--线程组--http请求--右键添加后置处理器--json提取器

                

granfa性能监控 性能测试监控工具介绍_granfa性能监控_12

                json表达式:$.

     十二、jmeter属性

                当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来实现数据传递。

                当有关联关系的两个请求在不同线程组中时,如何进行数据传递呢?

                1、jmeter属性的配置函数;

                _setProperty函数:将值保存程jmeter属性

                _property函数:在其他线程组中使用property函数读取属性

                2、jmeter属性的函数执行:

                _setProperty函数执行(保存jmeter属性):需要通过BeanShell取样器来执行

                3、操作步骤

                1、添加线程组1

                2、添加http请求--天气

                3、添加json提取器

                4、添加BeanShell取样器(将json提取器提取的值保存为jmeter属性)

                5、添加线程组2

                6、添加http请求--百度(读取jmeter属性)

                7、添加查看结果树

十三、jmeter录制脚本

                有api文档时,可以根据api文档的定义来编写http接口测试脚本,那没有api文档时?

                jmeter录制脚本:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。

                录制原理:jmeter作为代理服务器来拦截和转发请求与响应数据

                操作步骤:

                1、添加http代理服务器,并进行配置

                测试计划(右键)---非测试元件---http代理服务器

                配置代理服务器的参数

                2、开启windows操作操作的浏览器代理

 十四、jmeter直连数据库

                1、直连数据库的使用场景

                        --用作请求的参数化,例如登录的用户名

                        --用作结果的断言

                        --清理垃圾数据,例如添加商品编号不能重复

                        --准备测试数据,例如通过数据库来准备大量(几十万条)的性能测试数据

                2、直连数据库的关键配置

                        添加mysql驱动jar包

                        --方式一:在测试计划面板点击“浏览”按钮,将JDBC驱动添加进来

                        --方式二:将mysql驱动jar包放入到lib/ext目录下,重启jmeter

                        配置数据库连接信息:

                        添加方式:

                        测试计划--线程组--邮件添加配置元件--JDBC Connection Configuration

                        

granfa性能监控 性能测试监控工具介绍_测试工具_13

                         添加JDBC请求:

                                添加方式:

                                测试计划--线程组--取样器---JDBC Request

                        

granfa性能监控 性能测试监控工具介绍_granfa性能监控_14

十五、jmeter逻辑控制器

                可以按照设定的逻辑控制取样器的执行顺序

                jmeter中常用的逻辑控制器:

                1、如果(if)控制器

                if控制器用来控制它下面的测试元素是否运行

                位置:测试计划--线程组--右键添加逻辑控制器--if控制器

                参数介绍:

                --js语法形式

                        

granfa性能监控 性能测试监控工具介绍_测试工程师_15

                --函数形式(推荐)

                

granfa性能监控 性能测试监控工具介绍_granfa性能监控_16

                 案例1:

                使用用户定义的变量定义一个变量name,name的值等于baiduh或者tao

                根据值的不同访问不同的网站

                步骤:

                1、添加线程组

                2、用户定义的变量

                3、添加if控制器,判断name是否等于baidu,用js语法是"${name}"=="baidu"

                4、添加http请求,访问百度

                5、添加if控制器,判断name是否等于淘宝,用函数先用函数助手,填写值"${name}"=="baidu",点击生成,拷贝到if控制器里面

                6、添加http请求,访问淘宝

                7、添加查看结果树

                

                2、循环控制器

                        作用:通过设置循环次数,来实现循环发送请求

                        位置:测试计划--线程组--右键添加逻辑控制器--循环控制器

                        案例:

                        百度循环10次

                        1、添加线程组

                        2、添加循环控制器

                        3、添加http请求

                        4、查看结果树

                        思考:线程组属性可以控制循环次数,那么循环控制器有什么用?

                        不同点:线程组的循环次数对线程组下的所有http请求有效,循环控制器的循环次数对子节点下的http请求有效

                        关联:循环控制器次数为M,线程组循环次数为N

                                --循环控制器下的请求运行:M*N次

                                --线程组下,非循环控制器下的请求运行:N次

                        

                3、foreach控制器

                                

granfa性能监控 性能测试监控工具介绍_测试工具_17

         案例:

         1、有一组关键字【hello,python,测试】,使用用户定义的变量存储

          2、要依次取出关键字,并在百度搜索

        步骤:

        1、添加线程组

        2、添加用户定义的变量,命名规范:前缀_编号

        3、添加控制器

        4、添加http请求

        5、查看结果树

十六、jmeter定时器--同步定时器

        同步定时器:阻塞线程(累计一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。

        位置:测试计划--线程组--http请求--右键添加定时器--Synchroning  Timer 

        

granfa性能监控 性能测试监控工具介绍_测试类型_18

         案例:模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况