jmeter之认识元器件及功能 大杂烩

一、线程组

  线程组是一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下;

  1.1 基础线程组Thread Group

  Ramp_up Periond值是预期Jmeter用于启动所有线程的时间;若是线程数过多,则会>该值启动完所有线程;

  如下图,预期5s 启动200个线程;可以通过"用表格查看结果"查看每个线程的启动时间;

  

   1.2 阶梯加压线程组 jp@gc - Stepping Thread Group (deprecated)

  注意,该线程组需要和Active Threads Over Time(不同时间活动线程数)等结合起来;一般是为了计算每秒最大并发数;

  平衡状态下,并发用户数=rps*响应时间=hps*响应时间;

  1.3 目标线程组 bzm - Arrivals Thread Group

    预期每秒业务量,**时间

    jmeter会根据预期的业务量与业务时间,估算出需要多少线程。如果从业务角度考量,这个线程数就是单位时间的并发数;

    非常适合进行更传统的负载测试。可能的情况可能是“当系统有每分钟100张的订单,我们的系统是否运行良好?”。

 二、取样器

  取样器指示Jmeter向服务器发送请求

  2.1 Debug Sampler

    Debug Sampler会把我们自定义的变量输出在response data中,方便我们调试的时候使用

   2.2 HTTP Request

    Post请求:常用于表单的提交,例如登录请求,新增请求等;

    Get请求:用于信息获取,常用于查询,请求的数据会附在url之后(就是把数据放置在HTTP协议头中),以?分割url和传输数据,多个参数用&连接;

    PUT请求:用于修改;

    Delete请求:常用于删除;

  2.3 JDBC Request

    这个Sampler可以通过sql语句乡数据库发送一个jdbc请求,并对获取返回的数据进行操作。它经常需要和JDBC Connection Configuration(配置数据库连接的相关属性)一起使用;

    Variable names:保存sql语句返回结果的变量名;

    Result variable name:创建一个对象变量,保存所有返回的结果;

  2.4 jp@gc - Dummy Sampler (模拟请求

    它用于模拟一个接口请求,效果类似于Mock

    我们可以设置响应码、响应信息、延迟时间、响应时间、模仿响应时间、请求数据、响应数据;

    它的意义在于:当服务器还没有开发完成时,帮助我们调试脚本;

    我们可以通过后置处理器获取Dummy Sampler里面的信息,供后面的业务使用;

   

   2.5 Java Request(java请求)

    同Dummy Sampler一样,可以用来模拟一个接口的请求和返回;

  2.6 FTP Request(FTP请求)

    ftp请求分为两种,一种是从ftp下载文件,一种是从ftp上传文件;

三、表达式和提取器

  3.1 JSON Extractor (JSON提取)

    JSON Extractor使用json path表达式匹配,可以一次取多个变量值。$表示响应的根对象。取子对象或对象的属性用. 取数组里的对象用[],数组索引从0开始

  3.2 XPath Extractor

    //*[@class,'A']/@href 从根目录下定位所有class=A的href

  3.3 正则表达式提取

    它通过正则表达式获取接口响应,并传入下个接口

    左边界(.+?)右边界

    左边界(.*?)右边界

    正则表达式:利用正则将需要的数据提取出来

    () 括起来的部分就是需要提取的,对于你要提的内容需要用小括号括起来

    . 点号表示匹配任何字符串

    + 一次或多次

    ? 在找到第一个匹配项后停止

    模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来),则可以是$N$等,表示提取第N个括号里面的值;

    匹配数字-1:表示取所有返回值,此事提取结果时一个数组,其余正整数代表第几个匹配的内容提取出来。如果匹配数字选择的是-1,后续还可以通过${xxx_1}的方式来取第1个匹配的内容,${xxx_2}来取第2个匹配的内容;

    匹配数字1:表示第一个返回值;

    匹配数字2:表示随机取一个返回值;

如下图:提取生日;() 要提取的内容;.任意字符;{n} 精确n次;*前面字符出现任意次;.*任意长度的任意字符串;

 

 四、配置元件

  4.1 CSV Data Set Config

  在使用JMeter的时候,往往需要参数化一些数据,常用到的就是CSV Data Set Config

  4.2 HTTP Cookie Manager

  用来存储浏览器产生的用户信息

  4.3 HTTP Header Manager(HTTP信息头管理器)

  默认http请求的值,如server、ip、port、Protocol甚至path、parameters,都可以设置。

  4.4 HTTP 请求默认值

  默认http请求的值,如server、ip、port、Protocol、path、parameters都可以设置

  4.5 JDBC Connection Configuration

  做JDBC请求,首先需要将相应的jar包放到jmeter目录中的lib文件下,然后重启Jmeter

  mysql驱动:mysql-connector-java-5.1.13-bin.jar

  4.6 Random Variable

  配置生成随机数,自定义输出格式,最大最小值,以及是否为每个线程单独生成

  4.7 用户定义的变量

  当前的线程组内所有取样器都可以引用变量。

  4.8 计数器

  初始值,递增,引用名称

  4.9 插件管理器

    不要手动安装各种插件,jmeter提供了用户界面来完成插件的安装、升级、卸载。

    它管理的插件包括jmeter-plugins.org上面常用的插件,和各种第三方插件甚至核心JMeter插件。

    安装插件管理

    1.下载plugins-manager.jar

    2.将plugins-manager.jar放到jmeter的libext目录下;

    3.启动Jmeter;

    4.菜单栏多出一个"Plugins Manager"的选项;

  Installed Plugins:显示已安装的插件;Available Plugins:显示可安装的插件;Upgrades:显示可以升级的插件;

  通过勾选/取消勾选插件,并点击右下角"Apply Changes and Restart JMeter"按钮来卸载、安装、升级插件;

五、 定时器

  5.1 用户集合点(Synchronizing Timer)

    加载到一定的user(线程数)才进行并发操作;

  5.2 固定定时器(Constant Timer)

    线程的标准等待时间,性能测试中相当于用户行为中的思考时间;

  5.3 固定吞吐量定时器(Constant Throughput Timer)

    这种定时器可以限制吞吐量(tps),约定事物每分钟的执行数;

六、逻辑控制器

  逻辑控制器允许我们定制JMeter发送的请求。控制器可能包含如下的子元件:取样器,配置元件,其它的逻辑控制器;

逻辑控制器能够更改它元件中的请求顺序。

  6.1 ForEach控制器

    ForEach控制器一般和用户自定义变量一起使用,用于可以遍历读取相关的返回值。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。

注:foreach控制器通常和表达式提取器一起使用。表达式提取值应为-1,表示取全部值,然后sampler在foreach控制器下执行遍历。

   6.2 循环控制器

    指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量。

  1.勾选永远:表示一直循环下去。

  2.如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两个数值相乘(线程数*循环控制器数值)

   6.3 While控制器

     直到条件为false时,停止运行。

   6.4 if控制器

    根据给定表达式的值决定是否执行该节点下的子节点,默认使用javascript的语法进行判断。

  6.5 交替控制器(交替执行控制器下的业务)

七、常见监听器、断言

  7.1 查看结果树

  一、左侧的结果列表

    1.通常执行成功的请求在左侧会显示绿色,执行失败会显示红色。

    2.其实,当我们没有加断言时,显示绿色并不一定就是成功了,只代表响应码是200或300系列,显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。

    3.在左侧最下面有一个复选框Scroll automotically?勾选后,当请求很多时,滚动条会自动向下滚动。

  二、右侧的“取样器结果”

  

   三、Raw和Parsed

    默认情况下我们看到的是raw状态的数据,也可以点击下面的标签切换到Parsed状态。

  四、结果数据项的配置

    点击右侧的Configure,会弹出配置框,在这里可以根据自己的需要选择想要在“察看结果树”中展示的数据,默认是全选的,我们可以自由配置。

   五、“请求”选项卡

    请求中会显示请求的url、参数、请求头、cookies等详细信息。

  六、“响应数据”选项卡

    1.这里是服务器的响应结果数据。

    2.通过左侧的下拉框来设置响应的数据显示方式。

    3.通过下面的search行可以进行对当前请求的内容搜索。

 

   7.2 BeanShell断言

  利用beanshell断言,获取实际响应字段与预期值进行比对,自定义断言结果。

  Failure=true;

  FailureMessage="断言失败";

  7.3 响应断言

  要测试的响应字段:针对响应的不同部分进行匹配。

  响应文本、响应code、响应头...

  匹配规则:

  包括:响应内容包括需要匹配的内容就算成功。

  匹配:响应内容要完全匹配匹配内容,不区分大小写。

  equals:完成相等,区分大小写。

  7.4 断言持续时间

  约定响应时间,响应时间如果超出约定,则断言为失败。

  7.5 监听器—断言结果

    所有脚本的断言结果都会写入这里,可以很清晰的查看请求的结果是否符合预期。

八、关联

  关联的意义:接口请求中的某一个变量需要用到上一个接口的某个返回值(或者主键id),此时我们就需要关联。

   Cookie管理器关联session。

  一个增删改查流程,想要做自动化检验就必须形成一个闭环,那么删除-修改-查看就必须调用同一个必填参数,例如唯一性的id。

  JDBC关联

九、参数化

  参数化是自动化测试的一种常用方法。通常用法就是将脚本中的某些固定值通过参数来代替,在脚本运行时可以指定参数的取值范围和规则,它可以是常量也可以是变量。这样,脚本在运行时就可以根据需要选取不同的参数值作为输入。它通常被称为数据驱动测试,参数的取值范围被称为数据池。

  全局变量在测试计划中设置,作用于整个线程组。

  局部变量设置于各个控制器中,通过前置处理器—用户参数或者配置元件——用户定义的变量来设置。

十、常用的函数

  Jmeter函数是一种特殊值,可用于除测试计划外的任何组件。

  Jmeter函数有两种函数:自定义函数和内置函数。

  自定义函数可以通过beanshell脚本来定义。

  内置函数是jmeter自带,允许写进任何非控制器测试组件的任何域,这包括取样器,定时器,监听器,修改器,断言,前置处理器,后置处理器和配置元件。

__counter:计数器函数

每次调用计数器函数都会产生一个新值,依据循环次数,每次迭代加1;该函数也有对应的配置元件:计数器,功能类似。

 __Random:随机数函数

函数__Random会返回指定最大值和最小值之间的随机数。

 __RandomString():随机字符串函数

Random string length:随机字符的长度。

Char to use for random string generation:用来生成随机字符串的字符,可以是纯数字,纯字符,字符字母数字组合。

 __time

1、函数__time可以通过多种格式返回当前时间。

2、如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。

  YMD=yyyyMMdd

  HMS=HHmmss

 _matchNr

用于统计前一个接口返回值的总数。可以给后续的控制器提供可控的循环次数。

 十一、必学的Beanshell脚本

  Beanshell保存响应内容

  利用BeanShell脚本可以提取响应结果并保存到本地文件。如,可以保存cookie相关信息。

  在本地新建一个csv文件,新建一个BeanShell PostProcessor后置处理器

参考:https://www.cnblogs.com/canglongdao/p/12986709.html

  Beanshell断言

  Beanshell断言相对于jmeter自带的断言,比较灵活,也可以自定义断言结果。

参考:https://www.cnblogs.com/canglongdao/p/13025002.html

  Beanshell解析jsonlist

  将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中,否则会报错。

 解析思路

  利用beanshell获取到json响应,然后通过JSONObject和JSONArray将数组解析,遍历数组的length之后,提取参数值。

参考:https://www.cnblogs.com/canglongdao/p/13042684.html

  Beanshell常用内置变量

  Jmeter在BeanShell中内置了变量,用户可以通过这些变量与Jmeter进行交互,主要的变量及其使用方法如下:

  log:写入信息到jmeter.log文件,使用方法:log.info("ok?");

  vars:操作jmeter变量,它是测试用例与BeanShell交互的桥梁,常用方法:

    vars.get(String key):从jmeter中获得变量值。

    vars.put(String key,String value):数据存到jmeter变量。

  props:操作jmeter属性,该变量引用了Jmeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。

  prev:获取前面的sample返回信息,常用方法:

    prev.getResponseDataAsString();获取响应信息

    prev.getResponseCode();获取响应code

十二、高级测试技巧

  录制http/https请求

  生成HTML测试报告

    jmeter -n -t 路径脚本.jmx -l 路径结果.jtl -e -o 路径HttpReport

参数说明:

  -n:非GUI模式执行Jmeter

  -t:执行测试文件所在的位置

  -l:置顶生成测试结果的保存文件,jtl文件格式

  -e:测试结束后,生成测试报告

  -o:指定测试报告的存放位置

   上传文件到服务器

  首先确认你的文件名称,参数名称,MIME类型,这些可以从接口文档里面获取,或者直接在页面抓包然后从请求头里面查看。注意,文件名称可以写成绝对路径。

  其次,Advanced里面选择java类型,切记。 执行脚本之后,文件会上传到服务器上。

 

 

   内存溢出解决方案

  内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述。

  内存溢出是指你应用的内存已经不能满足正常使用了,堆栈已经达到系统设置的最大值,进而导致奔溃,这是一种结果描述。

  通常都是由于内存泄露导致堆栈内存不断增大,从而引发内存溢出。

  在利用jmeter测试过程中,如果内存溢出的话,一般会出现这个提示:java.lang.OutOfMemoryError:java heap space:意思就是堆内存溢出,不够用了。

 HEAP最多设置为物理内存的一半;

NewSize:表示新生代的内存空间

NewRatio:表示新生代和老年代的比例。此处新生代:老年代=1:2

SurvivorRatio:表示伊甸园和space的比例。此处伊甸园:space=8:2

  跨线程组的关联

  Jmeter的接口关联通常只在当前线程中实现。如果想要实现跨线程的关联,需要一些小技巧。

  跨线程传递参数

  可以在BeanShell Sampler中用${__setProperty(,,)}函数实现。它可以将需要关联的参数设置为系统属性。

  比如我们利用正则表达式提取了title,紧接着就可以在BeanShell Sampler将其设置为全局变量。

 后续在其它的线程中如果需要关联这个title,需要用到${__P(,)}函数来调用它。

  

  

  

  

     

 

  

 

  

  

    

  

  

      

  

 

    

 

 

越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13100609.html