视频:https://www.bilibili.com/video/BV1h54y1L7kz?spm_id_from=333.337.search-card.all.click
接口
概念
服务器和客户端(app,网页)之间有接口,完成两者之间的数据交互;
接口是数据交互的通道,完成数据的传递
接口的类型
- 按协议分。协议不同,接口的类型不同。HTTP,TCP,UDP,IP,FTP,USB
- 按语言划分。C++,JAVA,Python等
- 按范围划分。系统之间和程序内部系统之间:- 内部系统之间:登录,支付,购物车等等子系统(内部系统)之间的访问交互- 外部部系统之间:(外部)支付,购物车等系统(内部系统)之间的访问交互。
程序之间:方法(函数)和方法(函数)之间。类和类之间。模块和模块之间。
# 使用接口defbird():
something ='虫子'
eat(something)# 接口defeat(something):# print(f'小鸟在吃{something} ' )print('小鸟在吃",something)
bird()
接口测试
概念
接口测试:是对系统或组件之间的接口进行测试,
主要是校验数据的交换、传递和控制管理过程(不能直接跳过前一个过程),以及相互逻辑依赖关系(在访问前须得有一个登录)。
测试系统或组件之间交互的数据的正确性,以及逻辑依赖关系的正确性!
原理
- 数据(预期结果)从哪里来: - 根据用户需求
- 如何校验: - 借助工具或代码,模拟客户端。组织数据
用工具或者代码模拟客户端,向服务器发送请求,校验服务器传回来的响应数据是否和预期的结果一致;
接口测试的特点
- 测试可以提前介入,提早发现Bug,符合质量控制前移的理念-
- 可以发现一些页面操作发现不了的问题(可以绕过前端页面的一些数据传递,跳过校验规则,直接向服务器发送请求):支付密码输入非数字,特殊字符
- 接口测试低成本高效益(底层的一个Bug能够引发上层8个左右Bug,接口测试可以实现自动化)
- 不同于传统的单元测试,接口测试是从用户的角度对系统进行全面的检测(各种“不听话”的用户)> 测试服务器的健壮性
接口测试的实现方式
- 使用接口测试工具来实现(比如: JMeter、Postman、fiddler)
- 通过编写代码来实现(比如: Python + Requests+UnitTest)
什么是自动化接口测试
利用工具代码,代替人工,自动判断响应结果和预期结果是否一致,依赖断言
HTTP协议
协议:就是规则!要求使用协议的双方,必须严格遵守
- HTTP协议介绍HTTP:(HyperText Transfer Protocol)超文本传输协议,是一个基于请求与响应模式的、应用层的协议,也是互联网上应用最为广泛的一种网络协议。
- HTTP协议的特点- 支持客户端/服务器- 模式简单快速- 灵活- 无连接- 无状态TCP协议:C/S模型---->三次握手建立连接;—>四次挥手断开连接;各个点都有状态,会根据状态调整;而HTTP是无连接的,无状态的。
URL格式
URL:(Uniform Resource Locator)统一资源定位符,是互联网上标准资源的地址。
HTTP使用URL来建立连接和传输数据。
语法格式
URL格式
http : //www.itcast.cn:8080/news/index.html?uid=123&page=1
- 协议部分:“http",常见的协议有HTTP,HTTPS、FTP等
- 域名部分:“www.itcast.cn”,也可以使用IP地址作为域名使用(定位网络环境中的一台主机)
- 端口部分:“8080",端口可以省略,默认端口(HTTP:80,HTTPS:443(加密),FTP:21)mysql: 3306****redis: 6379在网络主机上定位不同的应用
- ·资源路径部分:“/news/index.html";对应网页的原代码或者网络中的一个数据资源- 资源路径可以为空(没有),相当于资源路径为“/”- 如有查询参数,资源路径为?之前域名(端口)之后的所有内容!- 如果没有查询参数,资源路径,从域名(端口)之后,直到结束。
- 查询参数部分:“uid=123&page=1",可以允许有多个参数,多个之间用“&"作为分隔符传参给网页源代码- 以?与资源路径隔分- 查询参数可以有多个,之间用&隔分- 参数参数的语法k=v对儿!
示例
查询天气信息 :http://www.weather.com.cn/data/sk/101010100.html
Http请求
作用:
- 由客户端发送给服务器
- 规定了 发送给服务器 的 数据的 语法格式
HTTP请求由四部分组成:请求行,请求头,空行,请求体
换行符:\r\n
请求行
- 作用:指定请求方法、请求资源
- 语法格式:请求方法(空格)URL(空格)协议版本(lrln)请求方法: - GET:查询。—―没有请求体- POST:新增。――登录、注册主要使用。有请求体- PUT:修改。――有请求体。- DELETE:删除。—―没有请求体
- URL:数据资源的定位符
- 协议://域名:端口/资源路径?查询参数&查询参数&…
- 协议版本: - http1.1/http1.2/http2.0
请求头
- 作用:向服务器描述客户端(浏览器)的基本信息。
- 语法:k:v 键值对儿
- User-Agent:向服务器描述浏览器的类型(防爬虫)
- Content-Type:向服务器描述请求体的数据类型- application/x-www-form-urlencoded(表单数据类型)
请求体
- GET、DELETE请求方法,没有请求体。
- POST、PUT请求方法,有请求体。
- 请求体的数据类型,受请求头中Content-Type的值影响
Http响应
作用:
- 由服务器 回 发送给客户端
- 规定了 服务器 回 发送给客户端 的 数据的 语法格式
整体格式
- 响应行(状态行)、响应头、空行、响应体
响应包或响应报文
状态行
- 语法格式:协议版本(空格)状态码(空格)状态码描述\rln
- 协议版本: http1.0/http1.1/http2.0
- 状态码:针对Http请求,响应的状态 - 状态码描述
详细可以参考Http协议中文版文档
状态码有三位数字组成,第一个数字定义了响应的类别:·
1xx:指示信息–表示请求已接收,继续处理(表示请求需要进一步访问)
2xx:成功–表示请求已被成功接收、理解、接受(200:OK)
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现(404:没有找到文件;403:资源无权访问)
5xx:服务器端错误–服务器未能实现合法的请求(502:badgateway;504:响应时间太长)
- 状态描述:对状态码的描述
响应头
- 作用:向客户端描述服务器的基本信息。
- 语法:k:v键值对儿
- Content-Type:向客户端描述 **响应体 **的数据类型!
响应体
- http响应报文,大多数是有响应体
- 响应体的数据类型,受 响应头中 ContentIType 的值影响。 - json 类型- 表单 类型- 图片 类型
传统风格的接口
对用户进行操作的相关接口,包括增删改查
- 使用GET、POST 实现所有数据的增删改查操作。
- 针对用户的某一个操作,URL不唯一。
好处:
- 对开发的技术要求低。只需要掌握get、post即可
- 代码灵活
RESTful
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
REST:即(Representational StateTransfer)的缩写。词组的翻译是“表现层状态转化”。如果一个架构符合REST原则,就称它为RESTful架构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwDjMpjO-1666678980669)(assets/1650595758022.png)]
- 使用GET/POST/PUT/DELETE分别表示查、增、改、删使
- 用一个URL对应一个唯一的资源。
- 状态码,根据实际操作请求加以区分。(但实际开发中,会直接返回一个同意的状态码,然后在响应体中添加一个字段,去描述返回的结果)
界定RESTful风格接口:
- 请求方法 使用get\post\delete\put对应查增删改
- 数据资源定位符是否唯一
- 在URL中不使用动词,替换使用名词,结合请求方法,界定具体操作。
RESTful没有强制性,只是一种风格;接口之间传递的数据最常用格式为JSON。
接口测试流程
- 需求分析- 主要依据需求文档
- 接口文档解析- 一般是由开发人员编写接口文档(API文档)
- 设计测试用例
- 执行测试- 使用接口测试工具实现。通过编写代码实现
- 接口缺陷管理 与 跟踪(回归测试)
- 生成测试报告
- 接口自动化持续集成(可选)
接口文档
什么是接口文档?
也叫API文档。是由开发人员编写。描述接口相关信息的文档。
作用:
- 方便前端开发人员和后端开发人员,在开发时进行对接。
- 在人员更迭时,方便新入职的员工快速接手项目。
- 方便测试人员编写接口测试用例。
展现形式
- 在线文档(html)
- 离线文档 - wordo- xmind- pfd- Excel
接口文档结构
- 基本信息:接口描述:URL:(协议+域名)+资源路径。请求方法
- 请求参数:- 请求头- 请求体(GET、DELETE没有)
- 返回结果:- 状态码、状态描述- 响应体
登录接口为例:
http请求:
- 请求行请求方法:POSTURL: http:/lihrm-test.itheima.net/api/sys/login协议版本:默认 http/1.1
- 请求头:Content-Type:application/json
- 请求体:{“mobile”:“13800000002",“password”:“123456”}> json里面不能用单引号表字符串
http应答:
- 响应行:状态码、状态描述:200 ok
- 响应头: 无
所有接口文档里面的内容,复制过去。
- 响应体: - 第一种情况:“success”:true,“code”:10000,"message"∵"操作成功! ", “data”.“xxx”}- 第二种情况:{“success”:false,“code”:20001 ," message":“用户名或密码错误” ," data":null}- 第三种情况:{“success”.false,“code”:99999,"message"∵"抱歉,系统繁忙,请稍后重试! ",“data”:null}
接口用例设计
为什么写?
- 防止漏测
- 管理工作进度,评估工作量
接口测试的用例点(测试维度)
####功能测试
- 单接口功能:手工测试中每个业务功能。在接口测试中就对应唯一的一个接口。针对该接口展开测试。
- 业务场景功能:(一定是在单接口测试之后)对应手工测试中,有业务流程。就是接口的调用先后顺序。按调用顺序展开接口测试。
性能测试
- 响应时长:- 从发出请求,到服务器回发响应,所经历的时长。
- 吞吐量:- TPS(单位时间事务数)。如1s内,接口所能处理的请求数量
- 并发数:- 同一时间,同时向服务器的接口发送请求,所能正确处理的数量。
- 服务器资源利用率:- 接口工作中,服务器硬件资源使用占比情况。
安全测试
- 敏感数据密码,身份证号,银行卡号…
- SQL注入在用户能够输入的位置,写SQL语句,看是否能够得到数据库查询的结果
设计方法和思路
与手工设计相同之处
接口用例设计的测试点,与手工页面业务功能的测试点几乎完全一样。
手工功能用例设计要点:
- 测试页面布局、控件的位置是否精准
- 针对用户名的编辑框中的数据值,展开测试正确手机号、手机号有特殊字符、手机号不足11位、手机号超11位、手机号为空…
- 针对密码的编辑框中的数据值,展开测试正确密码、错误密码、密码有特殊字符、密码1位、密码100位、密码为空…
- 针对验证码的编辑框中的数据值,展开测试 正确验证码、错误验证码、过期验证码、验证码为空…
接口用例设计要点:
- 手工页面中的用户名编辑框的值,对应接口中key为username的 value值。针对username的值展开测试。
正确手机号、手机号有特殊字符、手机号不足11位、手机号超11位、手机号为空...
- 手工页面中的密码编辑框的值,对应接口中 key为password 的value值。针对 password的value值展开测试。
正确密码、错误密码、密码有特殊字符、密码1位、密码100位、密码为空....
- 手工页面中的验证码编辑框的值,对应接口中key为verify_code value值。针对 verify_code的value值展开测试。
正确验证码、错误验证码、过期验证码、验证码为空...
单接口测试用例
8大要素:编号,标题,项目描述,优先级,预置条件,测试数据、执行步骤 ,预期结果
接口测试用例:
编号、标题、用例名称、优先级、预置条件、接口名称、请求方法、URL、请求头、请求体(请求数据)、预期结果
登录测试点
- 数值正向:登录成功
- 数据反向:- 手机号为空- 手机号有特殊字符。- 手机号不足11位。- 手机号超出11位。- 手机号未注册。- 密码错误。- 密码为空- 密码有特殊字符- 密码1位- 密码100位
- 参数正向:必选参数(全部参数)
- 参数反向:多参,少参,无参
业务场景测试用例
分析测试点:
- 业务场景尽量遵循用户实际使用的场景,按顺序调用接口进行测试。
- 尽量使用最少的测试用例,覆盖最多的业务场景。
- 单接口已经测完:一般情况下只需要 测试正向的 业务场景即可
登录成功–添加员工–查询–修改–查询–删除–查询员工列表
依赖关系:
- 登录成功返回的“令牌”,被添加、查询、修改、删除依赖。
- 添加员工成功,返回员工id,被查询、修改、删除依赖。
添加员工
18795963214
查询员工
修改员工
删除员工
查询员工列表
Postman实现接口测试
掌握如何安装Postman
掌握Postman的基本用法
掌握全局变量与环境变量
掌握Postman断言和关联
掌握如l何读取外部文件实现参数化
掌握如l何使用Newman生成HTML测试报告
1. Postman介绍
Postman是一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用,开发人员也会经常使用。
官方网站: https://www.getpostman.com/
主要特点
- 简单易用的图形用户界面
- 可以保存接口请求的历史记录
- 使用测试集Collections可以更有效的管理组织接口
- 可以在团队之间同步接口数据
2.Postman安装
安装注意事项
一旦安装成功,尽量坚持使用不要卸载!
Postman有个BUG,不能重复安装,如果重复安装,新安装的版本必须大于已安装的版本。
安装插件:newman
安装教程
3. Postman基础使用
案例一:Get搜索请求
使用postman发送http请求,访问tpshop商城的“搜索"接口
商城地址:tpshop-test.itheima.net/
postman进入my workspaces
URL中不能出现汉字,只能用ascll码的形式表示,可以用unicode编码解码
:点击Send
1.借助浏览器开发者工具(或者Fiddler)获取搜索接口使用请求方法、URL
- 请求方法: GET
- URL:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&pvid=f43a375b423243cfb1532ebb025d240e
⒉. 使用Postman 创建一个标签页(tab),组织http请求,发送搜索接口请求
案例二:Post登录请求
使用Postman向topshop商城登录接口发送一个密码错误的登录请求
获取数据:
- 请求方法:POST
- URL: http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login&t=0.5285164048485933
- 请求头:Content-Type: application/×-www-form-urlencoded
- 请求体: username=13800138006 password=6666 verify_code=8888
案例三:iHRM的登录请求
从接口文档,获取登录接口的http请求,使用Postman发送请求给iHRM人力资源管理系统
4. Postman的高级用法
管理测试用例集
用例集导入导出
导入
Postman断言
断言:让程序判断预期结果和实际结果是否一致。
特点
- Postman的断言是使用JavaScript语言编写的,写在**'Tests’标签页**里
- Tests中的脚本在发送请求之后执行,会把断言的结果(PASS/FAIL)最终在’Test Results’标签页中展示
常用Postman断言
断言代码片段介绍
- Status code: Code is 200
//判断响应状态码是否等于200//断言响应状态码为200
pm.test("Status code is 200",function(){
pm.response.to.have.status(200);});
pm: Postman的一个实例
test: Postman实例的一个方法,有两个参数:
参数1:"Status code is 200"”断言完成后,给出的提示信息.
参数2:匿名函数调用。
pm.response.to.have.status(200);的意思是postman的响应结果中,有状态码 200
- Response body: Contains string
//判断响应体中是否包含指定的字符串
pm.test("Body matches string",function(){
pm.expect(pm.response.text()).to.include("string_you_want_to_search");});
pm : Postman的一个实例
test(): Pos tman实例的一个方法,有两个参数:
参数1:"Body matches string"断言完成后,给出的提示信息。
参数2。匿名函数调用。
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
意思是:postman实例预期结果中包含 "string_you_want_to_search" 字符串
"string_you_want_to_search": 是预期结果!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apkcp65j-1666678980674)(assets/1650766222897.png)]
数值也可以正常判断
- Response body: ls equal to a string
//断言响应体等于某个字符串(对象)
pm.test("断言响应体等于某个字符串(对象)",function(){
pm.response.to.have.body("response_body_string");});
pm.response.to.have.body("response_body_string")意思:
postman 的响应结果中有响应体为"response_body_string""response_body_string" 是预期结果
- Response body: JSON value check
//校验响应的JSON数据
pm.test("our test name",function(){var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);});var jsonData = pm. response.json();意思是:
定义一个变量,名称叫jsonData ,值为:json格式的响应体数据pm.expect(jsonData.value).to.eq1(100);意思是:postman预期json格式的响应结果中xxx(key)的值为 xxx
value可以替换为:success. code、 message.data
to.eq1() 中的值对应为, true、10000、"操作成功! "、“fe565654-7540-4c64-9949-3d4bf5ad03a4”
- Response headers: Content-Type header check
//判断响应头中是否包含指定的头标签 pm.test("Content-Type is present",function(){ pm.response.to.have.header("Content-Type");}); pm.response.to.have.header("Content-Type"):postman中的响应头中有Content-Type
注意变化的值就不要去断言了
断言的工作原理
全局变量和环境变量
全局指整个Postman内部
全局变量:全局变量是全局唯一的,不可重复定义的变量
环境变量:
- 一个变量只能属于某个环境,在某一个环境中变量不可重复定义。
- 在环境与环境之间可以定义重复的变量
- 一个环境可以包含多个环境变量
- 常见环境分类:开发环境、测试环境、生产环境> 概念:在特定环境下生效的变量。Postman中可以有多个环境,每个环境中的变量名可以重复。同一个环境中的变量唯一。常见环境:测试环境、开发环境、生产环境
设置变量
- 全局变量1. 手动设置2. 代码设置:pm.globals.set(“var_name”, value);
- 环境变量1. 手动设置2. 代码设置:pm.environment.set(“var_name”, value);
获取变量值
- 全局变量 1. 请求参数中获取:{{var_name}}:直接在界面上用2. 代码中获取:
var value = pm.globals.get("var_name" );
语法:pm.globals.set("全局变量名",全局变量值)
例子:var age_tmp =18//定义js语法的变量
pm. globa1s.set("glb_age ",age_tmp)
语法:var接收变量名 = pm.globals.get("全局变量名")
例子:var ret_age = pm.globa1s.get("glb_age")
- 环境变量 1. 请求参数中获取: {{var_name}}2. 代码中获取:
var value = pm.environment.get("var_name");
语法:pm.environment.set("环境变量名",环境变量值)
例子:
语法:pm.environment.set("环境变量名",环境变量值)
例子:var age_tmp =19//定义js语法的变量
pm.environment.set("env_age ",age_tmp)
Var age_tmp=19//定义js语法的变量
pm.Environment.set(“env_age”,age_tmp)
语法:var接收变量名 = pm.environment.get("环境变量名")例子:var ret_age = p . environment.get("env_age")
Postman请求前置脚本
假设,这样一种场景:
调某接口时,要输入""时间戳”,如果输入的“时间戳"的绝对值,超过标准时间10分钟。则不允许调用。
1970年1月1日,00:00:00~现在秒数
假设,这样一种场景:
调某接口时,要输入"时间戳",如果输入的“时间戳”的绝对值,超过标准时间10分钟。则不允许调用。
概念
- 时间戳:表示当前系统时间。表示方式:从1970年1月1日00:00:00~现在所经历的秒数。
- 请求前置脚本: - 书写在“Pre-request Script”标签中- Postman在 http请求发送之前,会自动执行,该脚本中的代码!
案例
调用百度首页接口,传时间戳给服务器
- 创建“请求前置脚本”用例集和http请页。
- 指定请求方法GET,URL: http://www.baidu.com
- 在Pre-request Script标签页中,写入代码,获取时间戳,写入到全局变量中
//获取 时间戳var timestamp =newDate().getTime()//将时间戳保存到全局变量中pm.globals.set("gbl_timestamp",timestamp)
- 点击Send按钮,促使 Pre-request Script标签页中被自动执行。点击右上角的“眼睛"图标查看Globals中,多出一个全局变量。
- 在 URL中,借助查询参数,使用全局变量。 {{glb_timestamp}} 点击Send按钮,发送带有时间翟戳的请求。
- 查看,在Postman 菜单栏中“view" --> Show Postman Console 中查看
5. Postman的关联
介绍:
- Postman中的关联,用来解决接口和接口之前调用 依赖关系,需要借助全局变量和环境变量解决> 当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
实现步骤
以A接口返回的数据,供B接口使用为例:
- 组织A接口http请求数据,发送A接口请求。
- 获取A接口返回的响应数据,写入全局、环境变量中
- 组织B接http请求,从全局、环境变量中获取A返回的数据。|
案例
请求获取天气接口,提取响应结果中的城市,将城市名,给百度搜索接口使用。
- 请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html
- 获取返回结果中的城市名称
- 调用百度搜索接口: http:/ /rw.baidu.com/s?wd=北京,把获取到的城市名称作为请求参数
实现步骤
- 创建“Postman关联”用例集和http请页 (2个)。
- 组织A接口请求方法、URL,发送 http请求。
- 获取响应结果中的json数据,从数据中提取城市名,保存到全局变量。
//获取响应数据var jsonData = pm.response.json();//获取城市名var city=jsonData.weatherinfo.city;//写入全局变量
pm.globals.set("glb_city",city);
- 点击Postman右上角“眼睛”图标,查看添加的全局变量是否正确!
- 组织B接口请求方法、URL,发送http请求。
- 在B接口的查询参数中,指定使用全局变量{{glb_city}}
http://www.baidu.com/s?wd={{glb_city}}
7.查看,在Postman菜单栏中“view" --> Show Postman Console 中查看
6. 批量执行测试用例
生成测试报告的前置条件
7. Postman生成测试报告
需要安装插件Newman插件
使用newman命令,运行导出的测试集脚本,打开cmd输入:
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html
eg:
newman run demo.postman_collection.json -r html
newman run demo.postman_collection.json -r html --reporter-html-export report.html
-e 环境变量文件 -d 测试数据文件是可选参数
【强调】﹔如果添加“-r htm1”参数之后,执行命令报错!是由于没有安装 newman-reporter-html
命令说明
- run xxx.json:表示要执行的postman脚本,即导出的测试集数据.
- -e source:用来指定环境变量文件的路径
- -d source:用来指定测试数据文件的路径
生成报告步骤;
- 导出用例集(建议,创建空目录存储用例集。不建议目录层级过烈)
- 在用例集所在目录,地址栏输入cmd打开终端。
- 键入命令,生成测试报告
newman run Postman的断言用例集.postman_collection.json -r html --reporter-html-export 我的报告.html
city}}
http://www.baidu.com/s?wd={{glb_city}}
7.查看,在Postman菜单栏中“view" --> Show Postman Console 中查看
6. 批量执行测试用例
生成测试报告的前置条件
7. Postman生成测试报告
需要安装插件Newman插件
使用newman命令,运行导出的测试集脚本,打开cmd输入:
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html
eg:
newman run demo.postman_collection.json -r html
newman run demo.postman_collection.json -r html --reporter-html-export report.html
-e 环境变量文件 -d 测试数据文件是可选参数
【强调】﹔如果添加“-r htm1”参数之后,执行命令报错!是由于没有安装 newman-reporter-html
命令说明
- run xxx.json:表示要执行的postman脚本,即导出的测试集数据.
- -e source:用来指定环境变量文件的路径
- -d source:用来指定测试数据文件的路径
生成报告步骤;
- 导出用例集(建议,创建空目录存储用例集。不建议目录层级过烈)
- 在用例集所在目录,地址栏输入cmd打开终端。
- 键入命令,生成测试报告
newman run Postman的断言用例集.postman_collection.json -r html --reporter-html-export 我的报告.html
版权归原作者 sinian_四年 所有, 如有侵权,请联系我们删除。