API,应用编程接口,简称接口;通过接口,可以是程序和程序之间,能够相互交互;
接口分为两大类:基于TCP全双工(不适用于Postman)和基于HTTP半双工(适用于Postman)
接口测试是测试项目和项目之间,模块和模块之间,组件和组件之间的数据交互和权限鉴定。
内部:开发的接口给内部系统使用
外部:①被测项目调用外部接口;②被测项目提供接口给外部使用
测试重点: 接口功能正确性,参数的正确性,异常的处理能力,鉴权,兼容性
HTTP协议是一种超文本传输协议,是客户端和服务端互交数据,分为请求和响应两个部分;
请求:请求行(请求方式和请求路径),请求头,请求报文
请求方式:get post put delete
请求路径:url
请求头:Accept : application/json指定客户端接受的数据格式;
X-Requested-with :异步请求(登录,ajax);
User-Agent :客户端的类型;
Content-Type :客户端发送的数据的类型;
Cookie :服务器返回给客户端并且保存的Cookie信息。
响应:响应行(响应码和响应信息),响应头,响应报文
什么是JMeter?
JMeter是一款Java开源工具,用于性能负载测试,它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。
JMeter工作原理?
JMeter就像一群将请求发送到目标服务器的用户一样,他收集来自目标服务器的响应以及其他统计数据,这些统计数据通过图形或表格显示应用程序或服务器的性能。
性能测试指标:①响应时间;②并发用户数;③吞吐量;④系统性能计数器;⑤思考时间
backups:备份目录,jmx的脚本。自动的保存你的接口项目。
bin目录:存放jmeter的启动脚本,配置文件,模块文件。
jmeter.bat,启动文件
jmeter.propties全局配置文件
如果要修改为中文,则在此配置 language = zh_CN
docs离线帮助文档
extras存放和第三方集成构建文件。比如: Ant, build.xml
lib 库文件,jar包
licenses许可证文件
printable_docs用户手册
执行顺序:测试计划 -> 线程组 -> 配置元件 -> 前置处理器 ->定时器 ->取样器 -> 后置处理器 -> 断言 -> 监听器(察看结果树)
定时器:固定,高斯,同步
作用域:组件会作用于它的父级组件,同级组件以及同级组件的子组件 。
1:拿到接口文档(抓包、录制),熟悉接口业务,接口地址,鉴权,入参,出参,错误码,兼容。
2:接口测试用例的设计和评审
正例:
反例:①鉴权反例(必填,错误,鉴权码过期…)
②参数反例(必填,参数类型异常,参数长度异常)
③其他场景(黑名单,调用次数限制,分页场景)
④兼容性(一个接口对应多个版本App)
3:执行接口测试
4:团队协作,持续集成并生成报告发送邮件等。
cookie鉴权(HTTP Cookie管理器)的原理:
客户端第一次访问服务器,服务器就会自动生成Cookie,然后通过响应头里的Set-Cookie传输到客户端,然后保存客户端;
第2~N次访问服务器时,那么在请求头里面通过Cookie把我们保存在本地的Cookie信息传输到服务器以实现鉴权。
1:正则表达式提取器
2:Jsonpath提取器
① $ 表示根目录
②取子节点 $[“access_token”]
③取得复杂节点的值(结合下标和子节点用法) $.tags[17].name
①抓包
②badboy
③jmeter自带的HTTP代理服务器
新建线程组 -> 新建代理服务器(测试计划上:非配置元件->代理服务器) -> 端口8888 -> 目标控制器:设置为你录制的目标线程组 -> Type:默认httpclient4 -> 启动,运行代理服务器 -> 客户端设置:让客户端的请求通过代理服务器发送 -> 客户端设置:让客户端的请求通过代理服务器发送。 在控制面板 -> Internet选项 -> 连接 -> 局域网配置
④调试接口测试脚本
① 引入数据库的驱动jar包;放到jmeter/lib目录下
② 新建JDBC connection configuration
1.请求方法
2.接口地址 URL
3.查询字符串 GET参数,会成为URL的一部分
4.鉴权方式:
继承上级
不需要鉴权
APIKEY:常用,在请求头添加指定的内容
Bearer Token:有明确约定的使用方式
form-data:表单(会进行编码) kv结构+文件上传
x-www-form-urlencoded : 表单(会进行编码) kv结构
raw:原始内容(不会进行编码) json传递数据
binary:选一个文件会将二进制内容上传
GraphQL:特殊的接口类型
json的数据格式:
基本特点:数据结构简单,适合程序解析
基本数据类型:数字、字符串、布尔值、空值null
容器数据类型:数组、对象
特殊的规范:①字符串一定使用双引号
②容器的最后一项,不加逗号
7.请求预处理:请求发送之前执行js,改变请求
8.测试用例:响应收到后执行js,断言响应
9.设置:改变传输细节
10.发送请求
11.cookies:自动更新,自动发送; 可以禁用
接口四要素:方法、地址、鉴权、参数
第二个接口,需要第一个接口的数据时,需要用到接口关联
最常用的方式:使用变量
①创建变量 ② 使用变量
步骤:
获取变量
使用变量:从变量值取值
{{vars}}
①变量是一个标签,代表着一个动态改变的值;
②创建变量
1).变量有作用域:GCEDL
基本规则:作用域优先级,范围越小优先级越高
G:全局变量 C:集合变量 E:环境变量
③设置变量值
1).创建时
2).选中字符串时
1.使用js语言;
let a ;
a = 1+1;
console.log(a)
1:json引用
//接口响应
console.log(pm.response.json())
//获取token
let token = pm.response.json().access_token
console.log(token)
//自动保存到全局变量
pm.globals.set('token',token)
2:正则表达式
处理非结构化文档
//接口响应
console.log(responseBody)
//re的方式获取token
let token = responseBody.math('"access_token":"(.*?)"')
console.log(token)
//自动保存到全局变量
pm.globals.set('token',token[1])
3:自动断言封装
底层使用BDD测试框架
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);//断言状态码
});
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");//断言响应正文包含指定字符
});
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);//断言json值==100
});
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
//断言响应正文完全相等
});
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
//断言响应头
});
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
//断言响应时长小于等于200
});
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
//断言状态码[201,202]之间
});
pm.test("Status code name has string", function () {
pm.response.to.have.status("Created");
//断言状态文本
});
状态码201的文本是Created
集合:统一断言条件
//响应耗时 小于3000ms
pm.test("响应耗时 小于3000ms",function(){
pm.expect(pm.response.responseTime).to.be.below(3000)
})
//响应字节 小于10MB
pm.test("响应字节 小于10MB",function(){
pm.expect(pm.response.responseSzie).to.be.below(1024*1024*10)
})
请求:专属的断言条件
状态码、数据格式、数据值