服务器和客户端(app,网页)之间有接口,完成两者之间的数据交互;
接口是数据交互的通道,完成数据的传递
按协议分。协议不同,接口的类型不同。HTTP,TCP,UDP,IP,FTP,USB
按语言划分。C++,JAVA,Python等
按范围划分。系统之间和程序内部
系统之间:
程序之间:方法(函数)和方法(函数)之间。类和类之间。模块和模块之间。
# 使用接口
def bird( ) :
something ='虫子'
eat(something)
# 接口
def eat(something) :
# print(f'小鸟在吃{something} ' )
print('小鸟在吃",something)
bird()
接口测试:是对系统或组件之间的接口进行测试,
主要是校验数据的交换、传递和控制管理过程(不能直接跳过前一个过程),以及相互逻辑依赖关系(在访问前须得有一个登录)。
测试系统或组件之间交互的数据的正确性,以及逻辑依赖关系的正确性!
用工具或者代码模拟客户端,向服务器发送请求,校验服务器传回来的响应数据是否和预期的结果一致;
测试可以提前介入,提早发现Bug,符合质量控制前移的理念-
可以发现一些页面操作发现不了的问题(可以绕过前端页面的一些数据传递,跳过校验规则,直接向服务器发送请求):支付密码输入非数字,特殊字符
接口测试低成本高效益(底层的一个Bug能够引发上层8个左右Bug,接口测试可以实现自动化)
不同于传统的单元测试,接口测试是从用户的角度对系统进行全面的检测(各种“不听话”的用户)
测试服务器的健壮性
利用工具代码,代替人工,自动判断响应结果和预期结果是否一致,依赖断言
协议:就是规则!要求使用协议的双方,必须严格遵守
HTTP协议介绍
HTTP:(HyperText Transfer Protocol)超文本传输协议,是一个基于请求与响应模式的、应用层的协议,也是互联网上应用最为广泛的一种网络协议。
HTTP协议的特点
TCP协议:C/S模型---->三次握手建立连接;—>四次挥手断开连接;各个点都有状态,会根据状态调整;而HTTP是无连接的,无状态的。
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",可以允许有多个参数,多个之间用“&"作为分隔符
传参给网页源代码
示例
查询天气信息 :http://www.weather.com.cn/data/sk/101010100.html
作用:
HTTP请求由四部分组成:请求行,请求头,空行,请求体
换行符:\r\n
请求行
请求头
请求体
作用:
整体格式
响应包或响应报文
状态行
详细可以参考Http协议中文版文档
状态码有三位数字组成,第一个数字定义了响应的类别:·
1xx:指示信息–表示请求已接收,继续处理(表示请求需要进一步访问)
2xx:成功–表示请求已被成功接收、理解、接受(200:OK)
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现(404:没有找到文件;403:资源无权访问)
5xx:服务器端错误–服务器未能实现合法的请求(502:badgateway;504:响应时间太长)
响应头
响应体
对用户进行操作的相关接口,包括增删改查
好处:
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
REST:即(Representational StateTransfer)的缩写。词组的翻译是**“表现层状态转化”**。如果一个架构符合REST原则,就称它为RESTful架构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CwDjMpjO-1666678980669)(assets/1650595758022.png)]
界定RESTful风格接口:
RESTful没有强制性,只是一种风格;接口之间传递的数据最常用格式为JSON。
需求分析
接口文档解析
设计测试用例
执行测试
接口缺陷管理 与 跟踪(回归测试)
生成测试报告
接口自动化持续集成(可选)
也叫API文档。是由开发人员编写。描述接口相关信息的文档。
基本信息:
接口描述:URL:(协议+域名)+资源路径。
请求方法
请求参数:
返回结果:
登录接口为例:
http请求:
请求行
请求方法:POST
URL: http:/lihrm-test.itheima.net/api/sys/login
协议版本:默认 http/1.1
请求头:
Content-Type:application/json
请求体:
{“mobile”:“13800000002",“password”:“123456”}
json里面不能用单引号表字符串
http应答:
响应行:
状态码、状态描述:200 ok
响应头: 无
所有接口文档里面的内容,复制过去。
防止漏测
管理工作进度,评估工作量
####功能测试
单接口功能:
手工测试中每个业务功能。在接口测试中就对应唯一的一个接口。针对该接口展开测试。
业务场景功能:(一定是在单接口测试之后)
对应手工测试中,有业务流程。就是接口的调用先后顺序。按调用顺序展开接口测试。
响应时长:
吞吐量:
并发数:
服务器资源利用率:
敏感数据
密码,身份证号,银行卡号…
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、请求头、请求体(请求数据)、预期结果
登录测试点
数值正向:
登录成功
数据反向:
参数正向:
必选参数(全部参数)
参数反向:
多参,少参,无参
分析测试点:
登录成功–添加员工–查询–修改–查询–删除–查询员工列表
依赖关系:
18795963214
掌握如何安装Postman
掌握Postman的基本用法
掌握全局变量与环境变量
掌握Postman断言和关联
掌握如l何读取外部文件实现参数化
掌握如l何使用Newman生成HTML测试报告
Postman是一款非常流行的接口调试工具,它使用简单,而且功能也很强大。不仅测试人员会使用,开发人员也会经常使用。
官方网站: https://www.getpostman.com/
主要特点
一旦安装成功,尽量坚持使用不要卸载!
Postman有个BUG,不能重复安装,如果重复安装,新安装的版本必须大于已安装的版本。
安装教程
https://blog.51cto.com/u_15127674/4283756
https://blog.csdn.net/weixin_41990913/article/details/117664715?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165070122116781435470736%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165070122116781435470736&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-117664715.142v9control,157v4control&utm_term=postman%E5%AE%89%E8%A3%85newman&spm=1018.2226.3001.4187
使用postman发送http请求,访问tpshop商城的“搜索"接口
商城地址:tpshop-test.itheima.net/
postman进入my workspaces
URL中不能出现汉字,只能用ascll码的形式表示,可以用unicode编码解码
1.借助浏览器开发者工具(或者Fiddler)获取搜索接口使用请求方法、URL
1. 请求方法: GET
2. URL:https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&pvid=f43a375b423243cfb1532ebb025d240e
⒉. 使用Postman 创建一个标签页(tab),组织http请求,发送搜索接口请求
使用Postman向topshop商城登录接口发送一个密码错误的登录请求
获取数据:
从接口文档,获取登录接口的http请求,使用Postman发送请求给iHRM人力资源管理系统
导入
断言:让程序判断预期结果和实际结果是否一致。
特点
Postman的断言是使用JavaScript语言编写的,写在**'Tests’标签页**里
Tests中的脚本在发送请求之后执行,
会把断言的结果(PASS/FAIL)最终在’Test Results’标签页中展示
常用Postman断言
断言代码片段介绍
//判断响应状态码是否等于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
//判断响应体中是否包含指定的字符串
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)]
数值也可以正常判断
//断言响应体等于某个字符串(对象)
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" 是预期结果
//校验响应的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中可以有多个环境,每个环境中的变量名可以重复。同一个环境中的变量唯一。常见环境:测试环境、开发环境、生产环境
设置变量
全局变量
环境变量
获取变量值
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")
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")
假设,这样一种场景:
调某接口时,要输入""时间戳”,如果输入的“时间戳"的绝对值,超过标准时间10分钟。则不允许调用。
1970年1月1日,00:00:00~现在秒数
假设,这样一种场景:
调某接口时,要输入"时间戳",如果输入的“时间戳”的绝对值,超过标准时间10分钟。则不允许调用。
概念
案例
调用百度首页接口,传时间戳给服务器
创建“请求前置脚本”用例集和http请页。
指定请求方法GET,URL: http://www.baidu.com
在Pre-request Script标签页中,写入代码,获取时间戳,写入到全局变量中
//获取 时间戳
var timestamp = new Date().getTime()
//将时间戳保存到全局变量中
pm.globals.set("gbl_timestamp",timestamp)
点击Send按钮,促使 Pre-request Script标签页中被自动执行。点击右上角的“眼睛"图标查看Globals中,多出一个全局变量。
在 URL中,借助查询参数,使用全局变量。 {{glb_timestamp}} 点击Send按钮,发送带有时间翟戳的请求。
查看,在Postman 菜单栏中“view" --> Show Postman Console 中查看
介绍:
Postman中的关联,用来解决接口和接口之前调用 依赖关系,需要借助全局变量和环境变量解决
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
实现步骤
以A接口返回的数据,供B接口使用为例:
案例
请求获取天气接口,提取响应结果中的城市,将城市名,给百度搜索接口使用。
请求获取天气的接口,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);
http://www.baidu.com/s?wd={{glb_city}}
7.查看,在Postman菜单栏中“view" --> Show Postman Console 中查看
生成测试报告的前置条件
需要安装插件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
命令说明
生成报告步骤;
导出用例集(建议,创建空目录存储用例集。不建议目录层级过烈)
在用例集所在目录,地址栏输入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 中查看
生成测试报告的前置条件
需要安装插件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
命令说明
生成报告步骤;
导出用例集(建议,创建空目录存储用例集。不建议目录层级过烈)
在用例集所在目录,地址栏输入cmd打开终端。
键入命令,生成测试报告
newman run Postman的断言用例集.postman_collection.json -r html --reporter-html-export 我的报告.html