JMeter相关知识

1、若请求参数为json串,则需要在HTTP信息头管理器中添加如下配置,而后在HTTP请求Content encoding字段值填写:utf-8,而后在Body Data中放入请求参数;

名称:Content-Type;

值   :application/json;

2、JMeter中Parameter和Body Data区别:

Parameters:

xx=xx&xxx=xx格式的参数为GET或者POST请求中,URL中带的参数值,如:

在如下URL中:/api/vl/courseware/list?index=0&thumb=1;

?号后面的可以写在URL中,也可以写在Parameters中。

使用parameters时,Content-Type不传默认值为:application/x-www-from-urlencoded或者直接传application/x-www-from-urlencoded,若传application/json出错;

 

Body Data:

json格式的是POST请求中的参数,POST请求参数时,看请求的格式,是否需要在请求中添加HTTP信息头管理器,将请求的Content-Type或者User-Agent等进行定义;

使用Body Data时,Content-Type可传application/x-www-from-urlencoded或者application/json,区别是数据格式不同;

 

3、输入部分参数化:

A、用JMeter中的函数获取参数值,函数如下:__Random,__threadNum,__CSVRead,__StringFromFile,具体调用方法如下:${__Random(,,)}等;

通过菜单选项-》函数助手对话框找到JMeter函数;

 

B、用户定义变量:添加配置元件-》用户定义的变量,名称中输入变量名称,以登录为例,定义两个变量username和password。值中可以直接输入值,也可以通过JMeter函数__CSVRead,__StringFromFile从csv或dat文件中读取,还可以通过前缀加随机数的方法设置参数;

 

C、从CSV文件中读取:当参数的值没有规律且量不大时,可以用这种方法:首先,创建一个CSV文件,内容为参数的值集,每个参数占一列,第一行就开始写参数值,不要写参数名;在测试计划或线程组中添加一个配置元件-》CSV Set Config;其次,在filename中填写上述步骤中CSV文件的完整路径;Virable Names中填写变量名,如果CSV文件中有多个变量,则用逗号隔开;

 

D、从数据库中读取:当参数的值没有规律且量比较大时,可以选用这种方法:

具体操作如下:

在如下网址中下载相应的JDBC文件MySQL JDBC “http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.12.zip/from/http:ftp.jaist.ac.jp/pub/mysql/”;

解压下载的zip包后,将其中的mysql-connector-java-java-5.1.12-bin.jar放到JMeter的lib目录下;

添加配置元件-》JDBC Connection Configuration,设置如下参数列:

Database URL:jdbc:mysql://host:port/db(如jdbc:mysql://localhost:3306/testlink
           JDBC Driver class:com.mysql.jdbc.Driver
           username:连接数据库的用户名(如root)
           password:连接数据库的密码

添加Sampler-》JDBC Request,在SQL Query中输入查询语句,如下:

SELECT CONCAT (“[",
                GROUP_CONCAT(
                CONCAT("{username:'",login,"'"),
                CONCAT("{password:'",password),"'}"),"]“) AS json FROM users

而后在上述JDBC请求中添加后置处理器-》正则表达式,以提取查询得到的用户名和密码,例如设置正则表达式提取器的参数:引用名称:user

正则表达式:username:'(.+?)'\{password:'(.+?)'}

模板:$1$$2$

使用时,user_g1即为用户名,user_g2即为对应用户名的密码

D、在Body Data中参数设置为:

{
           "empCode": "${num}",
           "month" : "201806"
            }

 

4、JMeter正则表达式提取器

A、引用名称:就是变量名,调用使用${name};

B、正则表达式:()里表示你要的数值,相当于LR的左边界和右边界;

C、模板:$$表示你要用哪个正则表达式哪个模板获取的值,-1全部,0随机,1第一个,2第二个,如果只有一个正则则一般就写1;即:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$$3$等等,表示解析到第几个值给title。如:$1$表示解析到的第一个值;

D、匹配数字:-1表示全部、0表示随机、1第一个、2第二个;

F、缺省值:这个如果没有匹配到,给它定义的一个默认值;

正则表达式:

.:匹配任何字符串;

+:一次或者多次;

?:不要太贪婪,在找到第一个匹配项后停止;

 

举例说明:

      1、提取单个字符串:
    假如想匹配Web页面的如下部分:name = "file" value = "readme.txt">并提取readme.txt。一个合适的正则表达式:name = "file" value = "(.+?)">。
      ():封装了待返回的匹配字符串。
      .:匹配任何单个字符串。
      +:一次或多次。
      ?:不要太贪婪,在找到第一个匹配项后停止。

  2、提取多个字符串:
    假如想匹配Web页面的如下部分:name = "file.name" value = "readme.txt">并提取file.name和readme.txt。一个合适的正则表达式:name = "(.+?)" value = "(.+?)"。这样就会创建2个组,分别用于$1$和$2$

  比如:

    引用名称:MYREF
    模板:$1$$2$

   如下变量的值将会被设定:
    MYREF:     file.namereadme.txt
    MYREF_g0:   name = "file.name"value = "readme.txt"
    MYREF_g1:  file.name
    MYREF_g2:  readme.txt

注意事项:

正则表达式提取中Apply to应该选择:Main sample only;

正则表达式中要检查的响应字段应该选择:主题;

响应断言中Apply to应该选择Main sample only;

响应断言中要测试的响应字段应该选择:响应文本;

响应断言中模式匹配规则:可以任意选择;

响应断言中要测试的模式:应为"success":${test};

 

5、JMeter之集合点实现仿真高并发测试:

JMeter测试常见问题:

A、线程启动后就会直接发送测试请求;如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机的性能,往往无法支持较大的并发数,无法控制每次测试的瞬间并发量;

B、如果使用constant throughput timer,可以模拟较长时间的并发测试,但是仍无法满足稳定的瞬间高并发测试;

 

解决方法:

A、使用集合点,作用:阻塞线程,直到指定的线程数量达到后一起释放,可以瞬间产生很大的压力;

B、操作步骤:添加线程组-》添加定时器-》Synchronizing Timer;

wKioL1gsPmrQVImnAADDgUBgQtk199.png

C、Number of Simulated Users to Group by:即每集合够多少个模拟用户后发送一次测试请求;如果设置为0则等同于设置为线程组中的线程数;确保设置的值不大于它所在线程组包含的用户数;

D、Timeout in milliseconds:超时时间,即多少毫秒后同时释放已集结的的线程,发送测试请求;如果设置为0,Timer将等待线程数达到了"Number of Simultaneous Users to Group"中设置的值才释放。如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间(毫秒为单位)后还没达到"Number of Simultaneous Users to Group"中设置的值,Timer将不再等待,释放已到达的线程。

6、Jekins环境部署注意事项:

下载Jmeter解压文件到任意目录,安装JDK配置环境变量;备注:应避免JDK路径与Jmeter路径有中文和空格,否则会有异常;

重点介绍:

bin:包含启动、配置等相关命令;

extras辅助库;

lib:核心库,包含Jmeter用到的各种基础库和插件;

Bin目录下的重点文件:

Jmeter.properties:Jmeter核心配置文件,各种配置基本在这完成;

Jmeter.bat:Windows下Jmeter启动文件;

Jmeter-server.bat:windows下Jmeter服务器模式启动文件;

关键配置:

#默认语言设置

language=en

#捕捉cookie开关

CookieManager.save.cookies=true

#配置编辑器的字体和尺寸

jsyntaxtextarea.font.family=宋体

jsyntaxtextarea.font.size=20

#配置默认编码格式

sampleresult.default.encoding=UTF-8

# 配置远程主机host

remote_hosts=127.0.0.1

# 设置日志输出级别

log_level.jmeter=INFO

# 设置junit日志输出级别

log_level.jmeter.junit=DEBUG

# 设置输出报告模板格式

jmeter.save.saveservice.output_format = csv

7、Jmeter基础原件

线程组中的Stepping Thread Group可用于模拟阶梯加压!

通俗的讲一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户,Ramp-up period:单位是秒,默认是1秒,它指定启动所有线程所话费的时间。如果你需要Jmeter立即启动所有线程,将此设定为0即可。

取样器:

取样器是测试中向服务其发送请求,记录响应时间的最小单元;

8、Jmeter配置原件

HTTP Cookie Manager用来存储浏览器产生的用户信息;

HTTP Header Manager信息头管理,常用信息头如下:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Encoding:gzip,deflate,br

Accept-Language:zh-CN,zh;q=0.8

Connection:keep-alive

User-Agent:Mozilla/5.0

Content-Type:

application/w-www-form-urlencoded:from表单数据被编码为key/value格式发送到服务器,是表单默认的提交数据格式;

mutiipart/form-data:需要在表单中进行文件上传时,就需要使用该格式;

application/json:JSON数据格式;

9、逻辑控制器详解

循环控制器:指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量;如果设置了具体值的同时设置了线程组的循环次数和循环控制其的循环次数,那循环控制器的子节点运行的次数为两个数值相乘;

Foreeach控制器:

其一般和用户自定义变量一起使用,用于可以便利读取相关的返回值。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值;foreeach控制器通常和表达式提取器一起使用。表达式提取值为-1,表示取全部值,然后sampler在foreeach控制器下执行;

10、Jmeter函数

__BeanShell:beanshell函数,其有两个参数,第一个参数是要执行的语句,可以是beanshell语句或者是文件地址,是必选参数;第二个参数是保存结果的变量名称,非必选参数。示例如下:

${__BeanShell(123*456)}:返回值56088;

${__BeanShell(source("function.bsh"))}:会执行外部脚本function.bsh,并返回结果;

${__BeanShell(import java.util.*;Properties props = System.getProperties();String osName  = props.getProperty("os.name");if(osName.contains("Windows"))return 443;return 8443;)}:判断端口

与beanshell元件比较:

该函数与beanshell元件(beanshell sampler、beanshell preprocess等)作用是一样的,只是beanshell函数更常用于一些简单的判断或计算等,可以把少量的脚本放在函数中直接赋值给一个变量,而不用总是添加beanshell元件。

__regexFunction:正则表达式函数,该函数使用用户提供的正则表达式来解析前面的服务器响应(或者是某个变量值)。函数会返回一个有模板的字符串,其中携带有可变的值。

__counter:计数器函数

每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。

如果每个虚拟用户的计数器是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求。

计数器使用一个整数值来记录,允许的最大值为2,147,483,647。

目前计数器函数实例是独立实现的(JMeter 2.1.1及其以前版本,使用一个固定的线程变量来跟踪每个用户的计数器,因此多个计数器函数会操作同一个值)。全局计数器(FALSE)每个计数器实例都是独立维护的。

该函数也有对应的配置元件:计数器,功能类似。

__intSum:整数求和函数,函数__intSum可以被用来计算两个或者更多整数值的合。至少需要两个整数,如果指定变量名则名称中必须包含一个非数字字母,否则它会被当成另一个整数值,而被函数用于计算。当有多个整数时点击添加按钮来增加参数,但是需要注意的是,添加完参数后,点击”生成”的函数默认是把手动添加的函数放在后面,这时需要手动调整变量名的位置,把它放到最后,否则会报错。

__longSum:长整型求和函数,该函数用来计算两个或更多长整型值的和,使用方法跟上面的__intSum函数一样。

__StringFormFile:读取文件中的字符串函数

该函数用来从文本文件中读取字符串。支持读取多个文件。

使用配置元件CSV Data Set Config ,也能达到相同的目的,而且方法更简单,但是它目前不支持多个输入文件。

每次调用函数,都会从文件中读取下一行。当到达文件末尾时,函数又会从文件开始处重新读取,直到最大循环次数。如果在一个测试脚本中对该函数有多次引用,那么每一次引用都会独立打开文件,即使文件名是相同的(如果函数读取的值,在脚本其他地方也有使用,那么就需要为每一次函数调用指定不同的变量名)。

如果在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。

示例
${_StringFromFile(demo.txt,,,)} 读取demo.txt
${_StringFromFile(PIN#'.'DAT,,1,2)} 读取demo1.txt, demo2.txt
${_StringFromFile(PIN.DAT,,,2)} 读取demo.txt两次

函数的第三个参数:初始的序列号,如果省略,那么结束序列号就代表文件的循环读取次数。

函数的第四个参数:结束序列号,如果省略,那么序列号会无限增长。

需要在文件名中使用序列号:当使用序列号时,文件名需要使用格式字符串java.text.DecimalFormat。当前的序列号会作为唯一的参数。如果不指明可选的初始序列号,就使用文件名作为起始值。一些有用的格式序列如下:

#:插入数字,不从零开始,不包含空格。

000:插入数字,包含3个数字组合,不从零开始。

例如:

pin#'.'dat -> pin1.dat, ...  pin9.dat, pin10.dat, ...   pin9999.dat   

pin000'.'dat -> pin001.dat ... pin099.dat ... pin999.dat ... pin9999.dat   

pin'.'dat# -> pin.dat1, ... pin.dat9 ... pin.dat999  

如果不希望某个格式字符被翻译,需要为它加上单引号。注意上面的"."是格式字符,必须被单引号所包含。

比如现在要同时读取两个文件,分别是PIN1.DAT, PIN2.DAT:

${_StringFromFile(PIN#'.'DAT,,1,2)}:同时读取 PIN1.DAT, PIN2.DAT。

${_StringFromFile(PIN.DAT,,,2)}:读取 PIN.DAT 两次。

${_StringFromFile(test#'.'txt,,1,2)}:同时读取test1.txt,test2.txt

__javaScript:函数__javaScript可以用来执行JavaScript代码片段(非Java),并返回结果值。JMeter的_javaScript函数会调用标准的JavaScript解释器,还可以直接调用jmeter的内置函数。请记得为文本字符串添加必要的引号。另外,如果表达式中有逗号,请确保对其转义。例如,${__javaScript('${sp}'.slice(7\,99999))},对7之后的逗号进行了转义。

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

__split:字符串分割函数,函数__split会通过分隔符来拆分传递给它的字符串,并返回原始的字符串。如果分隔符紧挨在一起,那么函数就会以变量值的形式返回"?"。拆分出来的字符串,以变量${VAR_1}、{VAR_2}…以此类推的形式加以返回。分隔符默认是逗号,如果你想要多此一举,明确指定使用逗号,需要对逗号转义,如“\,”。例如,在测试计划中定义变量VAR="a||c|":

${__split(${VAR},VAR),|} :该函数调用会返回VAR变量的值,例如"a||c|",并设定VAR_n=4、VAR_1=a、VAR_2=?、VAR_3=c、VAR_4=?、VAR_5=null变量的值。

__setProperty:函数__setProperty用于设置JMeter属性的值。函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

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

__evalVar:函数__evalVar可以用来执行保存在变量中的表达式,并返回执行结果。如此一来,用户可以从文件中读取一行字符串,并处理字符串中引用的变量。2、例如,假设变量"query"中包含有"select ${column} from ${table}",而  "column"和"table"中分别包含有"name"和"customers",那么${__evalVar(query)}将会执行"select name from customers"。

__eval:函数__eval可以用来执行一个字符串表达式,并返回执行结果。如此一来,用户就可以对字符串(存储在变量中)中的变量和函数引用做出修改。例如,给定变量name=Smith、column=age、table=birthdays、SQL=select ${column} from ${table} where name='${name}',那么通过${__eval(${SQL})},就能执行"select age from birthdays where name='Smith'"。这样一来,就可以与CSV数据集相互配合,例如,将SQL语句和值都定义在数据文件中。

__escapeHtml:函数__escapeHtml用于转义字符串中的字符(使用HTML实体)。支持HTML 4.0实体

__unescapeHtml:函数__unescapeHtml用于反转义一个包含HTML实体的字符串,将其变为包含实际Unicode字符的字符串。支持HTML 4.0实体。如果函数不认识某个实体,就会将实体保留下来,并一字不差地插入结果字符串中。例如,">&zzzz;x"会变为">&zzzz;x"。

__FileToString:函数__FileToString可以被用来读取整个文件。每次对该函数的调用,都会读取整个文件。如果在打开或者读取文件时发生错误,那么函数就会返回字符串"**ERR**"。

11、Jmeter发送JDBC请求

做JDBC请求,首先需要两个jar包:首先需要两个jar包:mysql驱动-mysql-connector-java-5.1.13-bin.jar 和 sqlServer驱动-sqljdbc4.jar,将这两个jar包放到Jmeter目录中的lib文件下,然后重启Jmeter。而后:添加线程组、添加D+JDBC Connection Configuration、配置 JDBC Connection Configuration 基本参数(注意Variable Name命名必须和之后JDBC Request中的Variable Name 命名一致)Driver Class 可写成org.gjt.mm.mysql.Driver,也可写成com.mysql.jdbc.Driver,以响应正确为基准、添加JDBCrequest。

获取JDBC响应做接口关联,在JDBC request中添加变量及变量名如var_id,在新的JDBC request请求中输入Var_id_1即取第一行数据。

12、正则表达式关联

Jmeter接口自动化关键在于参数关联,比如需要登陆的接口,如何调用登陆口令,一个增删改查的闭环,接口参数的上下传递;

如登陆接口,在响应中返回一串token,则可在登陆接口后添加后置处理器-正则表达式提取,正则表达式中设置如下:

要检查的响应字段:主题

引用名称:center-token

正则表达式:"token":"(.*?)"

模板:$1$

匹配数字:0代表随机取值、1代表取第一个值、2代表取第二个值,依次类推;

此处正则表达式的写法是贪婪匹配token之后两个双引号之间的所有数据;

而后在接下来的接口中可以将获取的token作为变量调用,变量名为${center-token}。

正则表达式简要说明:

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

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

+   表示一次或多次匹配,*表示匹配所有

?   在找到第一个匹配项后停止,不加?表示找到最后一个匹配项停止

模板:用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来的东东),则可以是$2$,$3$等等,表示解析到的第几个值给user_id。例如:$1$表示匹配到的第一个值

匹配数字:0代表随机取值,-1代表所有值,此时提取结果是一个数组,其余正整数代表第几个匹配的内容提取出来。如果匹配数字选择的是-1,还可以通过${XX_1}的方式来取第1个匹配的内容,${XX_2}来取第2个匹配的内容。

13、针对响应不明确的接口做关联

即接口关联时,发现接口响应没有可以利用的信息。比如接口返回只有一个成功的标识,通过抓包观察后发现后续的修改功能,发现需要传入一个id和一个title,但接口没返回,于是考虑到从数据库中读取数据,即在循环控制器里加一个用户变量,用来定义新增时候传入的必填参数title,为了便面从数据库里查询出重复数据,title这里设置的是随机变量。

14、Jmeter打印时间戳

Jmeter中提供一种函数__time可以打印时间戳,用于获取当前时间;

       年: yyyy 月:MM 日:dd 
  时: HH 分: mm 秒:ss

关于时间戳的格式,可以自由组合定义,这里我写成这样 yyyy-MM-dd HH:mm:ss

生成的函数是这样的:${__time(yyyy-MM-dd HH:mm:ss,)}

如果时间偏移需要打印,这时候不光想打印当前时间,还想打印明天,后天,甚至明年的时间就需要我们用BeanShell Sampler处理了。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

try{
Date date =new Date(); //获取当前时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowDate = sf.format(date);
Calendar cal = Calendar.getInstance();
cal.setTime(sf.parse(nowDate));
cal.add(Calendar.DAY_OF_YEAR,+0);    #此处0指当前时间,+1为加一天,依次类推
String orderDate = sf.format(cal.getTime());
cal.add(Calendar.DAY_OF_YEAR,+365); 
String senderDate = sf.format(cal.getTime());
vars.put("orderDate",orderDate);
vars.put("senderDate",senderDate);

}
catch(Exception e){

}

使用时直接${orderDate}和${senderDate}引用。

15、代理服务器录制脚本

Jmeter如何利用自身的代理服务器录制脚本:

首先,工作台下创建代理服务器,选择工作台,添加非测试元件-HTTP代理服务器;

配置代理服务器:端口号必须与浏览器开启的代理一致,目标控制器:工作台->HTTP代理服务器;

在requests Filtering下添加排除模式,配置正则表达式,否则会录制出很多凌乱的请求;.*\.XXX.*|.*\.XXX.*,根据需要进行增删

启动代理服务器

录制好后接口及请求参数自动生成,此时需移动到线程组下,否则无法运行;

 

Jmeter录制APP接口:

首先手动设置手机代理,配置代理IP,需与本机的IP一致,默认端口80;

配置Jmeter代理服务器IP,注意IP和端口号与手机代理一致;

观察代理服务器录制app相应的接口;

16、Jmeter自动生成测试报告

环境要求:

Jmeter3.0版本之后开始支持动态生成测试报告;

JDK版本1.7以上;

需要JMX脚本文件;

基本操作:

在脚本文件路径下,执行CMD命令:jmeter -n -t test.jmx -l result.jtl -e -o /tmp/ResultReport

参数说明:

-n:非GUI模式执行Jmeter;

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

-l:指定生成测试结果的保存文件,jtl文件格式;

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

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

备注:结尾的ResultReport是自己手动创建的报告文件夹。每次启动命令之前,文件夹内容必须金额jtl文件一起清空;

考虑到每次执行命令都要先去目录下清空报告文件夹和jtl,还要敲命令,所以后续写了一个bat文件,每次执行bat都自动去清空之前的报告,然后执行命令:

接口运行自动化.bat代码如下:

del /s /Q D:\gongju\apache-jmeter-3.2\bin\result.jtl
rd /s /Q D:\gongju\apache-jmeter-3.2\bin\HttpReport
md D:\gongju\gongju\apache-jmeter-3.2\bin\HttpReport
jmeter -n -t D:\gongju\apache-jmeter-3.2\bin\lsmsp.jmx -l result.jtl -e -0 D:\gongju\apche-jmeter-3.2\bin\HttpReport

del是删除jtl

rd是删除报告文件夹

md是重建报告文件夹

17、Jmeter实现上传和下载

Jmeter上传:

Jmeter上传文件首先确认参数名称、MIME类型、文件名称,或者直接在页面抓包后从请求头里面查看;打开HTTP请求在Files Upload中填写相应的参数。其次在Advanced里面选择Java类型;

Jmeter下载:

首先确定你的下载文件接口,确保接口响应正确;

其次Jmeter本身不支持将文件保存到本地的,需要写一点Java。添加beanshell sample写入Java:

import java.io.*;
byte[] result = prev.getResponseData(); 
String file_name = "D:\\gongju\\apache-jmeter-3.2\\bin\\download\\sqlEnt_${id}.zip"; 
File file = new File(file_name); 
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();

18、Docker部署接口自动化持续集成环境

 

19、Jmeter中ForEach控制器实现网页爬虫

Jmeter的爬虫原理其实很简单,就是对网页提交一个请求,然后把返回的所有href提取出来,利用ForEach控制器实现URL遍历,首先需要对网页提交一个请求,而后从返回值中提取href标签和文字标题的URL;

20:、Jmeter实现Mock接口:

Mock通常是指在测试一个对象时,我们构建一些假的对象来模拟与其交互。而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否正常;

引入Mock的最大优势:

Mock的行为固定它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果。Mock接口就是用一些合理的手段构造对象去模拟真实的接口,达到我们需要的测试效果;

Mock适用的测试场景:

依赖的上游系统的接口尚未开发完成,下游系统无法进行联调,一直处于等待状态;

接口不满足目前的测试需求。虽然接口已经实现,但个别字段/返回不满足测试要求;

常见的Mock方式:

将模拟数据直接写在代码里;

利用JavaScript拦截请求;

利用Charles、Fiddler等工具拦截请求;

21、Jmeter服务器性能监控

访问网址http://jmeter-plugins.org/downloads/all/,下载三个文件。其中JMeterPlugins-Standard和JMeterPlugins-Extras是客户端的,ServerAgent是服务端的。

前两个是jmeter扩展插件,解压后将jar拷贝包到jmeter的lib/ext目录下,最后一个是服务器监控插件,解压到服务器上

将ServerAgent-2.2.1.zip解压后放在需要监控的服务器上,并执行

chmod 777 startAgent.sh 赋权

./startAgent.sh 执行

Jmeter开始监控-添加监听器jp@gc-PerfMon Metrics Collector,配置端口和IP,默认端口是4444即可运行;

22、Jmeter实现Xpath关联

在Jmeter中,除了正则表达式可以用作关联,还有一种方式也可以做关联,即Xpath Extractor,其利用Xpath提取出关键信息,传递变量;

具体操作:

添加一个后置处理器XPath Extractor,配置相应参数:引用名称即变量名、Xpath query即Xpath表达式、匹配数字同正则表达式:0代表随机、1代表第一个、-1代表全部;

.//a[@class='linkto']/@href 具体是什么意思呢?意思就是通过a>class>href这三层标签进行逐级检索,找到class=linkto标签下的所有href,进行匹配

这里如果我想匹配到href标签下的文字标题怎么办?改一下表达式吧--.//a[@class='linkto'],我们发现取出来都是标题,后面可以再进行拼接

 xpath基本语法

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

//*[@class,'A ']  从根目录下定位所有class=A标签内的文本

//*[contains(@class,'A ')]  从根目录下@class值中包含A的节点

substring-before(.//*[@class='A']/text(),'0') 返回根目录下[@class='A']/text()中第一个'0'前面的部分,如果不存在'0',则返回空值

substring-after(.//*[@class='A']/text(),'0') 返回根目录下[@class='A']/text()中第一个'0'后面的部分,如果不存在'0',则返回空值

23、Jmeter实现数据驱动测试

该方法只适用单个接口测试,具体运用到接口自动化时还是要靠手动编写脚本;

首先我们要有个接口测试用例存放的地方,我们在Excel模板管理中输入用例编号、入参、优先级、请求方式、URL等等;

新建一个txt文件,命名为sjqd,后续名改为CSV,右键Excel格式打开,从左到右依次为:用例编号、优先级、接口编号、接口,名称、URL、请求方式、参数;

Jmeter中添加CSV Data Set Config读取测试用例。填入CSV文件路径和参数名称;配置相应参数如下:

Filename:D:\gongju\apche-jmeter-3.2\bins\siqd.csv

变量名:caseCode,priority,apiCode,apiName,URL,function,parameter

分隔符:,

stop thread on EOF:True  即文件末尾停止循环;

添加if控制器,判断优先级:"${priority}"=="H",再第一个的基础上添加第二个控制器:"${function}"=="post"。

24、Beanshell保存响应内容到本地

利用Jmeter-Beanshell PostProcessor可以提取响应结果并保存到本地文件,这种操作在Jmeter做爬虫时非常有用,可以帮助你迅速的获取想要的内容文件到本地;

首先,在本地新建一个CSV文件,新建一个Beanshell PostProcessor后置处理器;在配置中编写脚本获取5次循环登陆的token并执行脚本。

FileWriter fstream = new FileWriter("D:\\gongju\\apache-jmeter-3.2\file\\demo.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("apiName")+"token"+":"+vars.get("center-token"+","));
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();

登陆测试后爬去腾讯新闻网链接存储本地:

FileWriter fstream = new FileWriter("D:\\gongju\\apache-jmeter-3.2\file\\url.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("url")+":"+vars.get("url"));
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();

25、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值