目录
参数化:每次请求,参数值都是变化的。设置为变量,需要的地方直接引用的。
2、CSV文件配置(数据驱动ddt——Data-Driven Tests)
是最常用的一种断言方法,它可以对各种返回类型的结果进行断言,比如Test、html、application/json等
也是测试工作中经常用到的一种断言方法,它只能针对响应结果是applicaton/json格式的请求进行断言
BeanShell断言支持各种开发语言,使用BeanShell断言的好处是可以自由发挥,比如当断言失败,提示预期结果、实际结果,或者失败时把结果输出到日志
断言持续时间通常用于做性能测试,一般用于检查HTTP请求的响应时间是否超过预期值。而这个响应时间是性能测试中常关注的一个性能指标。?编辑
在线程组中添加一个JDBC connection的配置:配置元件—JDBC Connection Configuration
测试计划:默认
线程组: 并发用户数、并发时间、请求循环次数
采样器: 较常用HTTP请求,JDBC Request、soa/webservice
监听器: 查看结果树、断言结果
配置元件:http请求默认值、HTTP信息头管理器、JDBC Connection Configuration、CSV Data Set Config
断言: 响应断言(通过对比服务器返回的响应数据,判断请求是否成功)、json断言、BeanShell断言
参数化: 用户定义的变量参数、CSV 文件配置、函数参数化
关联: 后置处理器:正则表达式提取器、json提取器(jsonpath表达式)
做接口测试,要熟悉接口需求,设计接口测试用例,编写用例执行接口测试(借助工具或代码,脚本设计,本文讨论jmeter工具)
对单个接口需要弄懂:
请求4要素:接口地址、请求方法、请求头、请求正文;
响应3要素:http状态码、响应头、响应正文(code、msg、data...重点,判断接口是否通过)
对于多接口要弄懂:接口之间的业务关联
用例设计方法(8大方法,等价类、边界值、场景法、错误推测法、正交实验法、状态迁移法、因果图、判定表) === 功能测试用例设计思路
接口用例内容包含:请求4要素,响应3要素信息
以简单的 【注册账号---登录---充值】 场景为例
1)jmeter对【注册接口】进行接口测试
直接将请求4要素信息分别填入到jmeter中、用到:【取样器-http请求】、【配置元件-http消息头管理器】
运行,通过【监听器-查看结果树】查看响应结果 请求内容
观察 输出实际结果 和 预期结果(接口文档中定义响应)是否一致
2)jmeter对【充值接口】进行测试(接口之间的业务关联??)
??不能充值单接口去跑! 必须依赖登录状态——建立登录成功之后,才能进入充值界面,进行充值操作 ==== 登录鉴权,这里用到token。
先登录账号,成功后返回token
充值接口需要携带这个token去进行请求=====》服务器就放行资源
?怎么获取登录接口返回的token信息?
——用到【后置处理器-json提取器】放到待提取的请求下面
——填写json表达式 $.data.tokeninfo.token / $..token,变量名定义为user_token
【图-在结果树中-测试提取表达式】
【图-json提取器】
充值接口怎么携带token?通过 ${user_token}引用上述提取的token
【图-请求头中引用提取的变量】
【图-请求体中引用提取的变量】
思考:脚本一旦调通,回归测试/性能测试,每跑一次,手机号码字段,都需要更改一次——引入参数化
{ ?"mobile_phone": "${phone}", ?"pwd": "${pwd}", }
如下图,
很多接口请求中,存在部分相同的请求信息
例如环境地址:测试环境/预发布环境/发布环境,服务器地址不一样 ,在不同环境下测试,得一个个接口去修改地址---麻烦;
不同测试环境,ip和端口不一样,可以把它定义为变量,作为全局变量,在每个接口的服务器地址栏位置,引用该变量${变量名}
针对注册需要用的手机号,用Random函数产生手机号后8位的随机数,使用的时候拼接上运营商前3位,"mobile_phone": "158${phone}"
【图-jmeter工具-Random函数-生成表达式】
【图-添加配置元件-用户定义的变量-可以添加固定值,也可以添加函数表达式】
思考:一个接口,需要正常/异常多用例数据进行测试,得到不同的输出结果。
—— 可以手动每次修改传参的用例数据,然后执行,但效率低。
——可以尝试 CSV文件数据配置+循环控制器 。
添加【逻辑控制器 - 循环控制器】
控制接口执行次数,用例条数,可以写成固定值——不灵活
自动从CSV文件中读取到多少用例,自动循环多少次---- 可以实现,写代码
添加【配置元件 - CSV Data Set Config】
参数引用 ${变量名} 可以在任意位置引用,比如设置请求名称
思考:一个接口,不同用例数据得到不同结果,如何判断测试结果正确性?
——手动测试,凭眼睛一个个请求查看接口返回数据和期望响应是否一致
——jmeter有多种断言方式,自动判断响应结果跟预期的一致性。如 响应断言,json断言,baseshell断言,断言持续时间...
可以结合数据驱动ddt,把期望响应写在csv用例表格中,在【测试模式】引用期望响应的字段,判断响应文本中是否包含【期望内容】
如:"code":${exp_code},"msg":"${exp_msg}"
断言成功--结果绿色;断言失败-结果红色
断言结果,可以通过结果树查看:断言成功--结果绿色;断言失败-结果红色
也可以添加【监听器 - 断言结果】查看
期望值(断言结果)可以写正则表达式,json表达式,引用变量,常量(比如code字段期望是0)
如果使用包含匹配,只需要修改预期结果即可,预期结果需要写在双引号之间,中间的双引号需要添加\转义,如下:
期望包含:【“code”:0】。java脚本可以写:
String response = "";
String Str = "{\"code\":0"; ? //预期结果,需要校验的字段
?
response = prev.getResponseDataAsString(); ? ?//获取当前请求响应结果
?
if(response == ""){ ?
? ?Failure = true; ?
? ?FailureMessage = "系统无响应,获取不到响应数据!"; ?
? ?log.info(FailureMessage);
? }
else if(response.contains(Str) == false){ ?
? ? ? ?//把断言失败置为真 ?
? ? ? ?Failure = true; ? ?
? ? ? ?String Msg = "\n系统返回响应结果与期望结果不一致!请排查是性能问题,还是程序代码问题"; ? ? ? ? ? ? ? ?FailureMessage = Msg + "\n" + "期望结果:\n" + Str + "\n" + "响应内容: \n" + response +"\n"; ?
? ? ? ?log.info(FailureMessage);
? ? ? }
思考:当前接口需要用到前面接口的返回数据,如,充值接口需要用到登录接口返回的token、id等,每次手工操作一遍登录,复制登录的token、id到产品接口传参位置,很麻烦。
前置处理 -- 登录接口作为前置,通过json提取器提取token、id
json提取器,正则表达式提取器——目前工作中比较常用的
后面接口引用变量--${变量名},也可以在用例里面引用变量如下:参数里面引用${user_id}
??问题:${req_data}请求数据中包含${user_id}--- 变量中嵌套了其他变量
解决办法:Jmeter自带的eval函数 生成——> ${__eval(${req_data})}
工具生成
后续接口请求参数
大型项目,脚本编写工作是协同工作的,A负责123模块,B负责456模块,分别保存测试片段
报告生成命令:
jmeter -n -t [.jmx文件路径] -l [指定要生成的.jtl文件名] -e -o [最后html报告要保存的路径]
?
jmeter -n -t /Users/.../api_utils/jmeter/jmeter训练营.jmx -l jmeter报告.jtl -e -o /Users/.../api_utils/jmeter/报告
报告:
思考:对于充值接口——每次充值都是新注册——登录——充值——麻烦。用例中需要多个userid ,想从数据库用户表中直接获取!!
另,例如注册,短信验证码! 存在数据库中, 从数据库中获取短信验证码,然后传给注册参数。
——需要操作数据库:1)数据库连接 2)数据库操作-增删改查、 数据库知识、表结构
项目的数据库信息-找开发:
database url : 不同数据库url不一样,百度
jdbc:mysql://主机:端口/数据库名?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
注意:驱动--不同数据库驱动不一致,添加驱动jar包;放到jmeter安装目录下的lib目录
写sql语句:select id from member where mobile_phone = '${phone}';
获取到的数据保存在userid 数组形式, ${userid_1}
文件操作接口:
请求体数据——文件名称:绝对路径,路径不要包含中文;文件保证在本地存在的