接口测试基础
- 接口是什么
- 接口是系统向外暴露的交互方式。
- 接口可以接收来自用户的数据,并且可以返回来自系统内部的数据。
- 负责数据的校验,加工、存储、权限控制。
- 是系统内外的分界线。
- 比如
- 电脑(系统)上面的各种插口(接口)
- 电路板(系统)上各种金属焊点(接口)
- 12306(系统) 上各种订票方式(接口)
- 为什么要测试接口
- 接口本身测试通过,才能保障前端、app、各种功能顺利对接。(必要的流程)
- 如果接口出现了bug,会比前端的bug更加严重,影响的范围更大(系统上线前降低风险的测率)
- 接口的测试效率(比UI测试的效率要高,便于测试、收益更大)
- 怎么去测试接口
- 模拟软件(需要工具)
- 对接口进行数据收发(需要专业的工具)
- 对结果进行严格的判断(支持灵活的断言)
- 接口测试工具
- jmeter:开源的软件、支持多种接口类型、支持接口测试和性能测试,并且支持二次扩展。
- postman:收费软件,简单、方便,适合开发临时调试接口。
- apifox:市场占比较小,不是主流,适合小团队尝鲜。
jmeter安装配置
1. 安装步骤
- 安装jdk
- 下载jdk:官网下载
- 选择jdk下载版本和操作系统
- 记录安装路径
- 验证安装:Java –version
- 配置jdk环境:
- 安装jmeter:
- 下载jmeter:官网下载
- 解压jmeter,并且记住解压的路径。
- 运行解压后目录中的jmeter.bat 或者 jmeter文件。
- 还可以终端输入 jmeter命令打开(需要配置jmeter环境变量)
2. jmeter目录
- bin目录:存放可执行的文件、命令以及对应的配置文件。
- docs目录:文档的意思、存放的内部API文档。
- extras目录:额外的意思,需要和其他工具进行对接。
- lib目录:库的意思,存放的Java的依赖文件。
- ext文件:jmeter依赖、插件。
- junit文件:开源许可证的内容。
- printable_docs文件:可打印文档,使用的说明(英文)。
核心文件、目录
- bin/jmeter文件:启动文件
- bin/jmeter.properties:jmeter 的配置文件
- lib:jmeter的第三方库
3. jmeter系统结构
1.基本用法
- 语言设置-临时设置
jmeter菜单栏选择“选项”点击“选择语言”然后选择需要的语言。
- 语言设置-永久设置
进入apache-jmeter-5.2.1\bin目录,找到“jmeter.properties”文件,在文件的第37行后添加“language=zh_CN”,保存之后再打开jmeter就永久变为中文环境了。
页面放大或者缩小
2.元件类型
核心元件(必须要有)
- 测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器
- 线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在取样器中定义,它被线程组包含。
- 取样器:是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request 取样器、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。
辅助元件(按需添加)
- 逻辑控制器:对取样器进行逻辑控制、判断、循环
- 定时器:让取样器延迟一段时间后执行
- 监听器:记录和展示取样器执行结果
- 断言:判断取样器的执行结果
- 配置元件:配置、修改取样器中的内容
- 前置处理器:取样器执行之前,自动执行
- 后置处理器:取样器执行之后,自动执行
案例练习
- 请求百度
- 请求三次百度
注意:逻辑控制器应在执行内容的外边。
- 每次请求之前打印你好
3.元件作用域和执行顺序
1. 元件作用域
配置元件:影响其他作用范围的所有元件。
前置处理器:在其他作用范围内的每一个取样器元件之前执行。
定时器:在其作用范围内的每一个取样器有效。
后置处理器:在其作用范围内的每一个取样器元件之后执行。
断言:在其作用范围内的对每一个取样器元件执行后的结果进行校验。
监听器:在其作用范围内对每一个取样器元件的信息收集并呈现。
总结:从各个元件的层次结构判断每个元件的作用域。
元件执行顺序
配置元件——>前置处理器——>定时器——>取样器——>后置处理器——>断言——>监听器
注意事项:
- 前置处理器、后置处理器和断言等组件只能对取样器起作用,因此,如果它们的作用域内没有任何取样器,则不会被执行。
- 如果在同一作用域内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序依次执行。
- 先加载配置元件
- 接着加载线程组:线程组是干活的人
- 加载取样器:最终的目的是干活
- 为取样器加载各种辅助元件,
如果没有取样器,其他的元件就失去了意义- 加载父级元件
- 加载同级元件
- 加载子级元件
- 不加载旁系元件
练习:
问题:
日志的打印内容是什么?
- 一共有2个取样器,需要分析2次。
- http请求A
- 父级元件
- 同级元件
- 子级元件
- http请求B
- 父级元件
- 父级元件
打印结果
- 父级元件
- 同级元件
- 子级元件
- 父级元件
- 同级元件
jemter接口测试实战
使用jmeter进行接口测试的基本步骤如下:
- 测试计划
- 线程组
- HTTP cookie管理器
- http请求默认值
- 取样器(http请求)
- 断言
- 监听器(查看接过书、图形结果、聚合报告等)
jmeter进行接口测试流程步骤详解
1.测试计划
打开jmeter,在菜单左侧出现“测试计划”。
在这里我们可以将“测试计划”理解为新建的空白项目,在这个空白项目下面可以添加一系列的接口。
2.线程组
- 添加方法:右键点击添加 》线程(用户) 》 线程组
- 元件描述:一个线程组可以看作一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户。
- 线程数:即虚拟用户数,设置多少个线程数也就是设置多少虚拟用户数。
- Ramp-Up时间(秒):设置虚拟用户数全部启动的时长。如果线程数为20,准备时长为10秒,那么需要10秒钟启动20个线程。也就是平均每秒启动2个线程。
- 循环次数:每个线程发送请求的个数。如果线程数为“20“,循环次数为”10“,那么每个线程数发送”10“次请求。总请求数为”20*10=200“。如果勾选了”永远“,那么所有的线程会一直发送请求,直到手动点击工具栏上的停止按钮,或者设置的线程时间结束。
3.HTTP cookie管理器
- 添加方法:右键线程组-添加-配置元件-HTTP cookie管理器。
- 元件描述:HTTP cookie管理器可以像浏览器一样存储和发送cookie,如果你要发送一个带cookie的HTTP请求,cookie manager会自动存储该请求的cookie,并且后边如果发送同源站点的http请求时,都会使用这个cookie。
4.HTTP请求默认值
- 添加方法:右键线程组-添加-配置元件-HTTP请求默认值。
- 元件描述:HTTP请求默认值是为了方便填写后续内容而设置,主要填写【服务器名称或ip】和【端口号】,后续的HTTP请求中就不用每次都填写IP地址和端口号了。
5.HTTP请求
- 添加方法:右键线程组-添加-取样器-HTTP请求。
- 元件描述:http请求包括接口请=请求方法、请求路径和请求参数等。
HTTP请求详解:
- 名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
- 注释:对于测试没有任何作用,仅用于记录用户可读取的注释信息。
- 服务器名称或IP:HTTP请求发送的目标服务器名称或者IP地址。
- 端口号:目标服务器的端口号,默认值为 80。
- 协议:向目标服务器发送HTTP请求时的协议,可以是HTTP或者是HTTPS,默认值HTTP。
- 方法:发送HTTP请求的方法,可用方法包括GET、post、head、put、tarce、options、delete等。
- 路径:目标URL路径(不包括服务器地址和端口)。
- 内容编码:内容编码的方式,默认值为iso8859.。
- 自动重定向:如果选中该选项,当发送http请求后得到的响应是302\301时,jmeter自动重定向到新的页面。
- 使用keep alive:保持jmeter 和目标服务器之间的活跃状态,默认选中。
- 对Post使用multipart/from-data:当发送POST 请求时,使用multipart/from-data方法发送,默认不选中。
- 同请求一起发送参数 : 在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。
如何查看http消息请求和响应内容?
- 如何查看请求参数:请求 -request body (请求行 + 请求体)。
- 如何查看响应结果:响应数据 -response body (响应体)。
6.响应断言
- 添加方法:右键HTTP请求-添加-取样器-http请求。
- 元件描述:检查接口是否访问成功,如果检查失败的话会提示找不到断言的内容,没提示的话代表成功。
Apply to:指断言作用范围,通常发出一个请求只触发一个请求,所以勾选“main sample only”就可以;若发一个请求可以触发多个服务器请求,就有main sample 和sub-sample之分了。
- Main sample and sub-samples:作用于主请求和子请求
- Main sample only:仅仅只作用于主请求
- Sub-samples only:仅仅只作用于子请求
- Jmeter Variable:作用于jmeter变量(输入框内输入jmeter变量名称)
测试字段:
响应文本(匹配返回的json数据)、响应代码(匹配返回码:如200, 404,500等)、响应信息(匹配响应信息如“OK”字样)、响应头(匹配响应头)、请求头(匹配请求头)、URL样本(匹配请求的url链接,如果有重定向则包含请求url 和 重定向url)、[文档(文本)](匹配响应数据的文本形式)、忽略状态(一个请求有多个响应断言,第一个响应断言选中此项,当第一个响应断言失败时可以忽略此响应结果,继续进行下一个断言。如果下一个断言成功则还是判定事务是成功的)、请求数据(匹配请求数据)
模式匹配规则:
包括:响应内容包含需要匹配的内容即代表响应成功,支持正则表达式。
匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。
字符串:响应内容包含需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式
相等:响应内容要完全等于需要匹配的内容才代表响应成功,大小写敏感,不支持正则表达式
否:相当于取反,如果结果为true,勾上否就是false
或者:如果不想用AND连接(所有的模式都必须匹配,断言才算成功),用OR选项可以用于将多个断言模式进行OR连接(只要一个模式匹配,断言就是成功的)
测试模式:
其实就是断言的数据。点击“添加”按钮,输入要断言的数据。
7.监听器
- 添加方法:线程组 ->右键添加 ->监听器 ->察看结果树。一般还会一并添加图形结果、聚合报告。
- 元件描述:树状形式显示接口的访问结果,包括请求结果、请求内容、服务器的响应内容。
如何解决jmeter查看结果树的响应中的中文乱码?
修改配置文件:
- 找到jmeter安装目录下的bin目录。
- 打开jmeter.properties文件,修改配置sampleresult.default.eencoding=UTF-8.
- 重启jmeter即可。
DDT数据驱动测试
- 数据决定了用例的梳理和用例的内容。
DDT数据驱动是一种计数、和工具无关。
jmeter参数化
定义:使用不同的测试数据,调用相同的测试方法进行测试。
本质:实现测试数据与测试方法的分离。
实现方式:
- 用户定义的变量–全局变量
- 用户参数—为每一个用户分配不同的参数值
- CSV数据文件设置—文件方式参数化
- 函数—随机数据
- 数据库
1.用户定义的变量
什么时候使用用户定义的变量?
- 定义全局变量
使用“用户定义的变量”进行参数化的步骤?
- 添加线程组
- 添加用户定义的变量。格式:变量名 – 变量值。
- 添加HTTP请求,引用定义的变量名。格式 ${变量名}。
- 添加查询结果树。
2.用户参数
什么时候使用用户参数?
- 针对同一组参数,当不同用户来访问时,可以获取到不同的值。
使用“用户参数”进行参数化的步骤?
- 添加线程组,设置线程数为n(表示模拟的用户数)
- 添加用户参数
- 第一列添加多个变量名
- 后续每一列为一组用户的数据
- 添加http请求,引用定义的变量名。格式${变量名}.
- 添加查看结果树。
CSV数据文件设置
什么时候使用CSV数据文件设置?
- 当不同的用户,或者同一个用户多次循环时,都可以获取到不同的值。
使用“CSV数据文件设置”进行参数化的步骤?
- 定义CSV数据文件
- 添加线程组
- 添加CSV数据文件设置
- 添加HTTP请求,引用定义的变量名。格式:${变量名}.
- 添加查看结果树
函数
什么时候使用__counter函数?
- 自动生成不重复的数据,让每一个用户每次循环都能取到不同的数据,且不需要提前定义。
使用“counter函数”进行参数化的步骤?
- 添加线程组,设置虚拟用户数和循环次数。
- 生成__counter函数
- 添加HTTP请求,使用__counter函数。格式:${__counter(FALSE,)}
- 添加查看结果树
四种参数化方式的对比
什么是参数化?
- 将测试数据组织起来,用不同的测试数据调用相同的测试方法。
4中参数化方式有何不同?如何选择适当的方式?
- 用户定义的变量:
- 作用:定义全局变量
- 局限性:每次取值(无论是否相同的用户)都是固定值。
- 用户参数:
- 作用:保证不同的用户针对同一组参数,可以取到不不同的值。
- 局限性:听一个用户在多次循环时,渠道相同的值。
- CSV数据文件设置:
- 作用:保证不同的用户及同一用户多次循环时,都可以渠道不同的值。
- 局限性:需要手动进行测试数据的设置。
- 函数:
- 作用:保证不同的用户及多次循环时,都可以取到不同的值,不需要提前设置。
- 局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)
jmeter断言
断言:让程序自动判断预期结果和实际结果是否一致。
提示:
- jmeter在请求的返回层面有个自动判断机制(响应状态码)。
- 但是请求成功了,并不代表结果一定正确,因此与需要检测机制提高测试准确性。
jmeter中常用断言:
- 响应断言
- 可以针对任意格式的响应数据进行断言。
- 把响应看成字符串,然后检查有没有指定的字符串出现。
- json断言
- 当响应数据为json格式时,优先使用json断言。
- 从json中提取数据,对这个数据进行匹配。
- 持续时间断言
- 检查http请求的响应时间是否满足要求时,优先使用持续时间。
- 自定义断言
- 根据业务的需求,自定义测试通过或者失败的标准。
- 如果同时出现失败和成功,断言通过
- 如果只出现失败,断言失败。
响应断言:
参数:
案例1:检查百度首页的接口响应中包含“百度一下,你就知道”
- 添加线程组
- 添加HTTP请求
- 添加响应断言
- 测试字段:要检查的项(实际结果)
- 模式匹配规则:比较方式。
- 测试模式:预期结果
- 添加查看结果树
json断言
让程序检查响应的json数据中,city对应的内容是否为北京
什么时候可以使用json断言?
对HTTP请求的响应结果为json格式时,优先使用json断言。
使用json断言的操作步骤?
- 添加线程组
- 添加HTTP请i去
- 添加json断言
- 填写 asset json path exists(实际结果-json路径)。
- 勾选additionally assert value
- 填写expected value(期望结果)
- 查看结果树
断言持续时间
作用:检查http请求的响应时间是否产出要求范围。
位置:测试计划–线程组—HTTP请求—(右键添加)断言—断言持续时间。
参数介绍
- 持续时间(毫秒):HTTP请求允许的最大响应时间(单位:毫秒)。超多规则认为失败。
案例:让程序检查响应时间是否大于100毫秒
使用断言持续时间的操作步骤
- 添加线程组
- 添加http请求
- 添加断言持续时间
- 填写持续时间(允许的最大响应时间,单位:MS)
- 添加查看结果树
自定义断言
作用:根据业务的需求,自定义测试通过或者失败的标准。
添加方式:测试计划–线程组—(右键添加)断言—JSR223…
代码:
sampler_code = prev.getResponsecode() // 实际取样代码
sampler_data = prev.getResponseDataAsString() // 实际取样内容
// 正则统计关键字出现次数
coun_fai1 = (sampler_data =~ /fai1/).size()
coun_success = (sampler_data =~ /success/).size()
log.info("fai1: ${coun_fai1} success:${coun_success}")
// 判断关键字出现的四处
if (coun_success == 0 && coun_fai1 > 0) {
log.info('断言失败')
AssertionResult.setFailure(true)
prev.setSuccessful(false) // 修改取样器结果
AssertionResult.setFailureMessage("有fai1出现")
} else {
log.info('断言成功')
AssertionResult.setFailure(false)
prev.setSuccessful(true) // 修改取样器结果
log.info("自定义断言完成")
}
- 获取 状态码 和 响应数据,保存为字符串
- 使用字符串的方法没检查字符串的内容。
- 根据需求和检查结果,设置断言的结果。
接口调试
- 接口报文:查看结果树
- 内部变量:debug取样器
- 代码的执行情况:查看日志记录
jmeter关联
关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
jmeter中常用的关联方法
- 正则表达式提取器
- xpath提取器
- json提取器
正则表达式介绍
正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容。
公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容
. :是通配符,可以代表任意字符(除换行回车)
* :代表前面的字符出现0次或者多次
.*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来
?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找左边界和右边界
公式格式:左边界(.*?)右边界
<title>百度一下,你就知道</title><title>百度一下,你就知道</title>
<title>(.*?)</title>
案例:原始文本
021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239027-1234-1230
要求:匹配出,城市号,地区号,个人号码三组。
正则表达式匹配:(.*?)-(.*?)-(.*?) \n
结论:
- 通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和有边界即可。
- 每一组数据都可以有一个或者多个值。
正则表达式提取器
什么时候可以使用正则表达式提取器?
- 任意格式的响应数据,都可以使用正则表达式进行提取。
使用“正则表达式提取器”的操作步骤。
- 添加线程组
- 添加HTTP请求-博客
- 添加正则表达式提取器
- 引用名称:存放提取出的值的“参数名称”,如填写 title。
- 正则表达式:左边界(.*?)有边界。
- 模板:用$$引用起来,表示解析出第几个的值,比如$1$解析出第一个的值。
- 匹配数字:1表示第一个值,-1表示所有取值。
- 添加http请求百度-百度
- 引用正则表达式中的引用名称,使用${参数}引用他。
- 添加查看结果树
xpath提取器
//a[@id=’kw’]:在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)。
//a:找出所有的a标签。
作用:针对HTML格式的响应结果数据进行提取。
添加方式:测试计划—线程组—HTTP请求—(右键添加)后置处理器—XPATH提取器。
参数介绍:
- Use Tidy (tolerant parser):当需要处理的页面是HTML格式时,必须选中该选项。
- 当需要处理的页面是XML格式时,取消选中该选项。
- 引用名称:存放提取出的值的参数名称。
- Xpath query:用于提取值的xpath表达式。
- 匹配数字:如果xpath路径查询出许多结果,则可以选择提取哪个。
- 0:表示随机,
- -1:表示提取所有结果,
- 1:表示第一个值。
- 缺省值:参数的默认值。
案例:获取博客首页的title,并作为参数传递。
- 添加线程组
- 添加HTTP请求-博客
- 添加xpath提取器
- 勾选Use Tidy (tolerant parser)
- 引用名称:存放提取值的参数名称。如填写title。
- xpath query:用于提取xpath表达式。
- 匹配数字:0(表示随机)-1(表示提取所有结果)1(表示第一个值)
- 添加HTTP请求-百度
- 引用正则表达式中的引用名称。
- 添加查看结果树
什么时候可以使用xpath提取器?
- 针对HTML格式的响应数据,可以使用xpath提取器进行提取。
使用xpath提取器的操作步骤
- 添加线程组
- 添加HTTP请求
- 添加xpath提取器
- 勾选Use Tidy (tolerant parser)
- 引用名称:存放提取值的参数名称。如填写title。
- xpath query:用于提取xpath表达式。
- 匹配数字:0(表示随机)-1(表示提取所有结果)1(表示第一个值)
- 添加HTTP请求
- 引用正则表达式中的引用名称。
- 添加查看结果树
json提取器
作用:针对json格式的响应结果数据进行提取。
添加方式:测试计划—线程组—HTTP请求—(右键添加)后置处理器—json提取器。
参数介绍
- name of created variables:存放提取出的值的参数名称。
- json path expressions:json路径表达式。
- match no:如果json路径匹配出许多结果,则可以选择提取哪个。
- 0:表示随机,
- -1:表示提取所有结果。
- 1:表示提取第一个值。
- default values:参数的默认值。
案例:提取天气接口中的城市信息,作为参数访问百度首页时传递
- 添加线程组
- 添加HTTP请求-天气
- 添加json提取器
- name of created variables:存放提取出的值作为参数名称。
- json path expressions:用于提取值的json路径表达式。
- match no:
- 0:表示随机。
- -1:表示提取虽有结果。
- 1:表示提取第一个结果。
- 添加HTTP请求-百度
- 引用正则表达式中的引用名称。
- 添加查看结果树。
jmeter属性
为什么要使用jmeter属性?
- 当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来使用数据传递。
当有关联关系的两个请求在不同线程组中时,如何进行数据传递呢?
jmeter接口加密解密
在普通接口的基础上,对参数(数据)进行动态修改,从而隐藏原始内容。
原理:根据对应加密算法,对于内容进行变换,实现隐藏、无法伪造。
算法:
- 不需要还原:哈希算法
- 速度快,但是无法还原
- 用于:签名、文件校验
- 常用算法:MD5、SHA
- 需要还原:加密算法
- 速度慢,但是可以还原
- 对称加密:加密、解密过程对称:AES
- 非对称假面:加密、解密过程不对称:RSA
接口加密实战
添加方法:测试计划—线程组—(右键添加)HTTP请求—(右键添加)前置计划—JSR223预处理程序。
import org.apache.commons.code.digest.DigestUtils;
username_md5 = DigestUtils.md5Hex("admin");
password_md5 = DigestUtils.md5Hex("123");
vars.put("username_md5",username_md5);
vars.put("password_md5",password_md5);
- 使用的apache中的MD5
调用:
- ${变量名}
- 例如${password_md5}
jmeter自动录制脚本
原理:
jmeter录制脚本,在没有接口文档的就项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。
jmeter录制脚本原理
录制时,jmeter作为代理服务器来拦截和转发请求与响应数据。
jmeter脚本录制
- 添加HTTP代理服务器,并进行配置
- 测试计划(右键)—非测试元件—HTTP代理服务器
- 配置代理服务器的参数
- 开启Windows操作系统的浏览器代理
- 启动代理服务器,开始录制
- 在浏览器页面中进行操作,成功后,就能在jmeter当中看到抓取到的接口请求了。
当使用代理的过程中,发现抓不到包,几个可能的情况
- 过滤规则设置问题
- 重启jmeter代理服务器或者重启jmeter
- 换浏览器来使用
- 检查PC机中的代理设置是否处于可用状态。
- 拔掉网线,抓包
jmeter外部集成
- MySQL等中间件
- 系统命令、外部程序
- Java系统工具(and、jenkins)
jmeter直连数据库
步骤
添加MySQL驱动jar包
- 方式一:在测试计划面板点击“浏览”按钮,将你的jdbc驱动添加进来。
- 方式二:将MySQL驱动jar包放入到lib/ext目录下,重启jmeter
- 配置数据库连接信息
- 添加方式:测试计划—线程组—(右键添加)配置元件—JDBC Connection…(连接数据库)
参数介绍:
- varilable name:mysql数据库连接名称(jdbc请求时要引用)
- database url:jdbc:mysql://localhost:3306/数据库名称
- 组成:协议 + 数据库ip + 数据库端口 + 连接数据库的名称
- jdbc driver class:MySQL驱动包位置固定格式–可下拉框选择。
- username:root(连接数据库用户名,如实填写)。
- password:MySQL数据库密码,如实填写,如果密码为空不写。
- 添加JDBC请求
- 添加方式:测试计划—线程组—取样器—JDBC request(执行SQL)
参数介绍
- variable name:数据库连接池的名字,需要与JDBC Connection Configurtion 的 varilable name bound pool名字保持一致。
- query type:
- 查询操作:选择 select statement。
- 增加、删除、修改操作:选择updata seatement
- query:填写的sql语句,末尾不要加“;”
- variable names:保存sql语句返回结果的变量名。
jmeter调用python
使用python的方式去获取特殊的加密结果,并作为接口请求参数。
- python代码就绪
- jmeter调用python代码
- 将结果保存到变量中
- 添加方式:测试计划–线程组–(右键添加)取样器–JSR223
jmeter+ant+Jenkins持续集成
1. jmeter命令行调用模式
jmeter # 启动gui界面
jmeter -n -t jmeter脚本路径 # 不启gui界面,直接执行用例。
jmeter -n -t <测试脚本.jmx> -l <结果文件.jtl> -e -o <报告输出目录>
参数说明:
-n
:非 GUI 模式运行 JMeter-t
:指定 JMX 测试脚本路径-l
:生成.jtl
或.csv
格式的测试结果文件-e
:测试完成后生成 HTML 报告-o
:指定报告输出目录(目录必须为空或不存在)
问题:
如果产生了报告,无法重复产生。
同一个命令,无法重复执行。
2. ant执行自动化操作
Apache Ant 是一个基于 Java 的构建工具,主要用于自动化编译、测试和部署 Java 项目。以下是 Ant 的详细配置方法,适用于 Windows 和 Linux 系统:
1. 安装前准备
- JDK 环境:确保已安装 JDK(Java 8+),并配置
JAVA_HOME
环境变量 - 验证命令:Java -version
2. 下载并安装 Ant
- 下载 Ant:
- 从 Apache Ant 官网 下载最新版本(如
apache-ant-1.10.12-bin.zip
)
- 从 Apache Ant 官网 下载最新版本(如
- 解压安装:
- 将压缩包解压到指定目录(如 Windows 的
D:\apache-ant-1.10.12
或 Linux 的/opt/ant
)
- 将压缩包解压到指定目录(如 Windows 的
3. 配置环境变量
- 新增系统变量
ANT_HOME
,值为 Ant 的安装路径(如D:\apache-ant-1.10.12
) - 在
Path
变量中添加%ANT_HOME%\bin
- 验证安装:ant -version
4.基本使用
- 创建文件buidl.xml文件(自动化脚本,可以同时兼容Linux、macos、Windows)
代码:
<project name="ShellScriptExecution" basedir="." default="execute-scripts">
<property name="jmeter.home" value="E:\temp\apache-jmeter-5.6.3" />
<property name="jmx" value="JMeter从小白到大神.jmx" />
<!-- 以下无需修改 --><target name="task1">
<delete file="result.jtl"/>
</target>
<target name="task2">
<delete dir="report"/>
</target>
<target name="task3">
<exec executable="cmd" dir="${basedir}">
<arg value="/c"/>
<arg value="${jmeter.home}/bin/jmeter.bat"/>
<arg value="-n"/>
<arg value="-t"/>
<arg value="${jmx}"/>
<arg value="-l"/>
<arg value="result.jtl"/>
<arg value="-o"/>
<arg value="./report"/>
<arg value="-e"/>
</exec>
</target>
<target name="execute-scripts" depends="task1,task2,task3">
</target>
</project>
执行命令:ant
Jenkins持续集成
CI/CD:持续集成/持续部署
一个软件是由多个组件共同构成的。
- 集成
- 编译
- 测试
- 部署/发布
持续的进行集成、编译、测试、部署。
实际工作中的风格
- 分别对接每一个接口,最后整理元件的关系,后期往往忘记了整理。
- 全面分析项目,根据项目特征、元件之间的关系,使用公共组件,减少后期的维护。
接口协议
- HTTP:默认端口号80,明文传输,没有安全可言,在可发测试环境中使用。
- HTTPS:默认端口号44.,加密传输,证书校验,防止中间人攻击,生产环境标配。
cookies:常用的鉴权机制,还有session、token(多用户)、api-key(单用户)。
- 接口发送给客户端一个数据,并要求下次请求自动带上。
session:基于cookies,只不过在cookies里面存储了id。
- cookies规则比较复杂,通常使用cookies管理器元件自动处理。
第一种风格
分别对接每一个接口,最后整理元件的关系。
参数格式
- 表单:用来发送键值对的数据,“application/x-ww-form-urlencoded”
- json:发送json数据(支持多层嵌套、支持多种数据类型)。“application/json”
- 文件上传:上传文件“multiparty/form-data;xxxx”
通过请求头声明参数的格式。
第二种风格
- 先进项项目的分析。
- 创建公共元件。
- 补全取样器和私有元件。
cookies管理器:
在jmeter配置文件中修改。
CookieManager.save.cookies=true //将cookie自动的保存为变量