接口测试之postman

一、Postman功能简介

3天精通Postman接口测试,全套项目实战教程!!

Postman是由Postdot Technologies公司打造的一款功能强大的调试HTTP接口的工具。在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。进入postman官网Download Postman | Get Started for Free

工作原理:

  1. 在Postman中输入请求地址,并点击Send按钮后;
  2. 对应的应用服务器接收到该请求,并且返回对应的响应报文;
  3. Postman接收到响应报文后,并通过友好的方式进行可视化的显示在界面上。

二、常用接口测试工具以及返回数据

常用的接口测试工具有postman、jmeter

接口返回数据的格式一般有:json、html、xml

  1)json格式

一般有三组数据:{"code":200,"message":"请求成功","dataMap":{"..."}}

code:返回的状态码

message:对返回信息或者状态错误的解释说明

dataMap:真正的返回数据

  2)html格式

复制代码

<html><title></title><body><code>200</code>......</body>
</html>

复制代码

  3)xml格式
<?xml?version="1.0"encoding="utf-8"><code>200</code>......
</xml>

三、接口测试协议

接口测试协议
1.webservice协议:

接口地址:http://......?wsdl

2.dubbo协议:

接口地址以dubbo://......

适用于少量数据的传输

3.http协议(90%):

接口地址:http://.....

http端口为: 80

https = http+ssl 安全传输协议 ,端口为443

市面上主要使用HTTP协议进行数据传输,所以我们主要学习这个协议。

什么是http协议?

http是超文本传输协议,主要用于浏览器和服务器之间传输数据,交互有两个部分:请求和响应。

请求: get、post、put、delete

请求部分一般包含的内容:

1、请求行:请求方式、请求地址和协议版本

2、请求头:HTTP协议使用HTTP头来传递请求的元信息。HTTP头是一个用冒号分隔的名称/值对,冒号前面是HTTP头发名称,后面是HTTP的值,例如:

accept:application/json ---客户端可以接收的数据格式

X-Requested-with:XMLHttpRequest --异步请求

user-agent: --客户端的用户

Host:--请求的主机地址

cookie:--cookie信息(请求的)

accept-encoding: gzip, deflate, br--压缩方式

connection: keep-alive  ---- 保持长链接

content-type: application/json;charset=UTF-8  --- 客户端发送的数据格式

3、空行: 发送回车符和退行,通知服务器一下不再有请求头;

4、消息体: HTTP请求中带有查询字符串时,如果是GET方法,查询字符或表单数据附加值请求行中,则消息体中就没有内容;如果是POST方法,查询字符串或表单数据及添加在消息体中。

2xx:表示请求发送成功;

3xx:表示资源发生转移,俗称重定向;

4xx: 表示接口的路径找不到,客户端错误;

5xx:表示系统内部异常,一般存在接口缺陷或者请求内容不正确,服务器错误。

四、postman的页面内容

主界面如下:

Params:用于在get请求传参

Authorization:postman自带的鉴权功能

Headers:请求头

Body:post请求传参

  -- none:没有参数

  -- form-data:既有文件又有键值对

  -- x-www-form-urlencoded:只传输键值对

  -- raw:JSon、TXT、xml、HTML、javasripts

  -- binary:把文件以二进制方式传输

Pre-request Script:接口请求之前的脚本,用js格式写

Tests:断言的代码

响应的功能页面:

Body:响应内容。

  --Pretty  是json格式数据

  --Raw   是文本格式

  --Preview 是网页格式

Cookies:响应的cookies信息

Headers:响应的头部信息

TestResult:断言的结果

五、发送请求与查看相应

  1)GET请求
  • 选择请求方式为GET,填写接口测试地址URL和输入参数;
  • 确认填写无误后,点击Send按钮发送请求,查看response内容;

  2)POST请求

选择请求方式为POST,采用以下几种传参方式进行接口测试;

  (1)URI 传参

  (2)form-data 传参 

会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息

问题:
对接接口,发现对方的接口使用form-data进行数据提交,直接使用requests库的data参数对接,会报参数错误: 

复制代码

params = {'timestamp':timestamp,'nonce':nonce,'apikey':APIKEY,'signature': signature
}
data = {'name': name,'phone': phone,'idnum': idnum,'products': [201,]
}
resp = requests.post(URL, data=data, params=params,verify=False, timeout=10)                   

复制代码

执行结果:

解决方案

这一块Requests包做的不是很好,做法具体如下:
一种是手动组建form-data并加上headers;
另一种是通过files参数传递form-datal;

复制代码

# 方案一:
params = {'timestamp':timestamp,'nonce':nonce,'apikey':APIKEY,'signature': signature
}
payload = """------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;name=\"phone\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"idnum\"\n\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data;name=\"name\"\r\n\r\n{}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"products\"\r\n\r\n {}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--""".format(phone, idnum, name, [201,])
headers = {"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
resp = requests.post(URL, data=payload, params=params,verify=False, timeout=10, headers=headers)# 方案二:
import json
params = {'timestamp':timestamp,'nonce':nonce,'apikey':APIKEY,'signature': signature
}
data = {'name':(None, name),'phone': (None, str(phone)),'idnum': (None, idnum),'products': (None, json.dumps([201,]))
}
resp = requests.post(URL, files=data, params=params,verify=False, timeout=10)
print resp.status_code
print resp.request.url
print resp.request.body
print resp.text                     

复制代码

  (3)x-www-form-urlencoded 传参

会将表单内的数据转换为键值对

  (4)raw 传参

可以上传任意格式的文本,可以上传text、json、xml、html等 

提示:在编辑器中选择文本并按CMD / CTRL + B可以自动美化XML / JSON内容。

  (5)binary 传参

只可以上传二进制数据,通常用来上传文件,由于没有键值,所以,一次只能上传一个文件。

multipart/form-data与x-www-form-urlencoded区别:multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息;x-www-form-urlencoded:只能上传键值对,并且键值对都是间隔分开的。

六、Cookies 和Code

Postman通过选项卡布局,用于在构建器中发送和管理API请求。上半部分是请求构建器,下半部分是响应查看器。

  Cookies——管理cookie模式是通过点击cookie链接访问的。该特性允许你管理与请求相关的cookie。
  Code——生成的代码片段模式通过保存按钮下面的最右边的Code链接。该特性允许你生成与请求相关的代码片段,该请求支持20多种语言(http、java、go等语言)

(一)cookie鉴权的原理:

当客户端第一次访问服务器时,服务器就会生成cookie,并且把生成的cookie信息放到响应头的set-cookie字段里面,然后发送给客户端,客户端接收到cookie之后就会保存起来,然后在2-N次请求服务器的时候自动的带上cookie信息实现鉴权。

(二)cookie分类

会话cookie:保存在内存中,当浏览器关闭之后会自动消失

持久化cookie:保存在硬盘中,浏览器关闭后不会消失只有当持久化的时间到期了才会消失。

name:cookie的名称

value:cookie的值

domain:cookie作为的ip地址

path:cookie所在的服务器上面的项目路径

exprise:失效时间

 七、环境变量和全局变量

  (1)环境变量和全局变量

在企业当中,一般有开发环境、测试环境和线上环境,有一些企业也会有预发布环境,我们在做接口测试的时候会发现,这些环境中接口的地址除了ip地址不一样,其他的地方都是一样的,我们在实际测试中,不可能每个环境都写一套测试逻辑,这个时候就需要使用到环境变量,环境变量为全局变量。

注意:当全局变量和环境变量的名称一致时,环境变量的权限比较大。

将接口地址中的IP地址参数化格式为{{ip}},试着运行一次

  (2)postman动态参数

一)postman内置动态参数

{{}}中加"$"代表示动态参数,不加"$"表示是全局变量或者是环境变量

{{$timestamp}}  生成当前的时间戳

{{$randomint}}   生成0-1000的随机数

{{$guid}} 生成随机的guid的字符串

二)自定义动态参数

也可以在Pre-request Script(发送请求之前)里面定义动态参数

//请求之前 自定义一个时间戳
var now_time = Date.now();
pm.globals.set("now_time",now_time)

八、接口关联

在实际工作中,有一些变量的值是动态变化的,并且下一个接口请求的时候需要传入该参数的值,比如token。

我们需要先在上一个接口的响应中获取token的值,并将该值设置为全局变量,再在下一个接口中使用参数化的形式将该值传入,即可实现了接口的关联。

1、接口关联方法一:json提取器

复制代码

//把responseBody转为json字符串
var jsvalue = JSON.parse(responseBody);
//将jsvalue的值打印到控制台上
console.log(jsvalue)
// 提取token的值,并保存到全局变量
pm.globals.set("token", jsvalue.token);
复制代码

复制代码

2、接口关联方法二:正则表达式提取器

复制代码

{"tag":{"id":100,"name":"张三"}
}

复制代码

假如响应数据的内容如上,我们现在要提取100,则在Tests中使用正则表达式提取的规则为 responseBody.match(new RegExp('"id":(.+?),')),这个方法表示匹配"id":后面且,之前的内容,如果将该结果打印到控制台,为一个数组:[" "id":100,","100"],若只取到100,则需要再加上索引

//通过正则表达式提取
var value = responseBody.match(new RegExp('"timestamp":(.+?),'))[1];
console.log(value );

3、接口关联方法二:cookie提取器

如下图所示,我们需要提取响应结果Cookies中的值,并将结果打印到控制台上。

方法如下:

//提取Cookies中SERVERID中的Value值并保存在cookies_serverid变量中
var cookies_serverid = postman.getResponseCookie('SERVERID').value
//将变量cookies_serverid中的值打印到控制台
console.log(cookies_serverid)

4、接口关联方法三:hearder信息提取

//获取响应headers的值,需要从响应头取值
var Content_Type = postman.getResponseHeader('Content-Type');
console.log(Content_Type)

九、调试和日志

Postman控制台类似于浏览器的开发者控制台,不同之处在于它针对API开发进行了调整。如果API或API测试没有按照我们期望的那样进行,那么Postman控制台将是我们进行调试的得力工具。只要Postman控制台窗口处于打开状态,所有的API活动都将记录在此处,我们可以通过这里查看底层发生了什么。

Postman控制台会记录以下信息:

  • 发送的实际请求,包括所有底层请求头和变量值等;
  • 服务器返回的最原始的响应报文,这里输出的响应报文是没有被Postman处理的响应报文;
  • 用于请求的代理配置和证书;
  • 测试脚本或预先请求脚本的错误日志;
  • 使用console.log()输出的内容。

在脚本中使用consolle.info()或console.warn()将有助于确认执行的代码行。这个使用方法和JavaScript中的console.log()类似

在应用程序菜单中前往View,然后单击“Show Postman Console”或使用键盘快捷键(CMD / CTRL + ALT + C)。每个调用及其标头和有效负载都将记录到Postman控制台。

十、断言

要想完整的实现接口测试,自然是少不了断言的,在postman中,断言的内容写在Tests中,

关于postman语法postman脚本语法大全,不包括插件语法 - 执剑之心 - 博客园

系统提供了八种断言方式:

八种断言方式:

复制代码

//1、返回的状态码为200
pm.test("Status code is 200", function () {pm.response.to.have.status(200);
});//2、返回的结果中包含一个指定的字符串
pm.test("Body matches string", function () {pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});//3、对返回结果做json字段检查
pm.test("Your test name", function () {var jsonData = pm.response.json();pm.expect(jsonData.value).to.eql(100);
});//4、断言返回的结果等于一个字符串
pm.test("Body is correct", function () {pm.response.to.have.body("response_body_string");
});//5、断言响应头中包含有指定的响应头
pm.test("Content-Type is present", function () {pm.response.to.have.header("Content-Type");
});//6、断言接口请求的时间少于200ms
pm.test("Response time is less than 200ms", function () {pm.expect(pm.response.responseTime).to.be.below(200);
});//7、断言一个post请求返回的状态码是否在指定的范围之间
pm.test("Successful POST request", function () {pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});//8、断言返回的状态码信息中包含指定的字符串
pm.test("Status code name has string", function () {pm.response.to.have.status("Created");
});

复制代码

 十一、导入和导出

  1)Colltions测试数据包导出导入
  • 导出

  选择要导出的数据包,点击Export;

  • 导入

点击Import按钮,选择要导入的文件;

  2)工作环境

选择Settings->data,在Export data下点击Download导出工作环境,在Import data下点击选择文件导入工作环境

十二、批量执行测试用例

1)在进行批量运行的时候 ,使用的数据驱动为csv或者是json  csv文件的编码必须是utf-8

2)在请求参数里面取数据和取全局变量的方法一直({{变量名称}}),在断言里面取数据文件的值使用:data["变量名称"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87549.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【记录】Ubuntu安装Mysql

本文记录Ubuntu系统下安装Mysql 1 查看系统信息 lsb_release -a 2 使用apt下载安装Mysql 1 打开终端,首先更新你的系统包索引,以确保所有包都是最新的 sudo apt update 2 安装mysql服务器 sudo apt install mysql-server (也可以选择对应的mysql-server 版本) 3 查看mysql状…

【深度学习:进阶篇】--4.1.循环神经网络(改进)

RNN存在的问题&#xff1a;梯度爆炸&#xff0c;长期依赖参数量过大等问题 目录 1.GRU(门控循环单元) 1.1.什么是GRU 1.2.直观理解 1.3.本质解决问题 2.LSTM(长短记忆网络) 2.1.作用 3.结构扩展与效率优化​ 1.GRU(门控循环单元) 2014年&#xff0c;出现的算法&#x…

中心化钱包安全方案

先来看独立的密钥安全技术 1 自建或单租户 CloudHSM 优点&#xff1a;密钥永不出硬件&#xff0c;无法导出&#xff0c;只能对外提供公钥。 交易时&#xff0c;外部应用把消息哈希传进去签名&#xff0c;再把签好名的结果拿出来用。 这种方式安全性拉满&#xff0c;但成本高、…

Android 实现底部弹窗

文章目录在 Android 中创建优雅的底部选项弹窗 (BottomSheetDialogFragment) &#x1f4f1;第一步&#xff1a;设计底部弹窗的布局 &#x1f3a8;第二步&#xff1a;创建 BottomSheetDialogFragment 类 ⚙️第三步&#xff1a;触发并显示底部弹窗 &#x1f680;在 Android 中创…

LAN8720 寄存器概览和STM32 HAL库读写测试

目录 寄存器0x00:Basic Control Register&#xff08;BCR&#xff09;0x01:Basic Status Register&#xff08;BSR&#xff09; 连接测试寄存器读写测试 补充 寄存器 // 0x00:Basic Control Register&#xff08;BCR&#xff09; BIT15:Soft Reset 写1复位&#xff0c;写1之…

渗透测试深度分析:空密码Administrator账户引发的安全风暴

渗透测试深度分析&#xff1a;空密码Administrator账户引发的安全风暴0x01 测试背景 在内网渗透测试中&#xff0c;对Windows主机 192.168.1.98 使用 enum4linux 进行枚举&#xff1a; enum4linux -u Administrator -p -a 192.168.1.98关键发现&#xff1a;Administrator账户空…

OpenCV CUDA模块设备层-----高效地计算两个 uint 类型值的带权重平均值

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个设备端内联函数&#xff0c;用于高效地计算两个 uint 类型值的带权重平均值。 该函…

[学习记录]Unity毛发渲染[URP]-Shell基础版

毛发&#xff0c;无论是人类的头发、动物的皮毛&#xff0c;还是奇幻生物的绒毛&#xff0c;都是构成生命感和真实感不可或缺的元素。它对光线的独特散射、吸收和反射&#xff0c;赋予了物体柔软、蓬松、有生命力的质感。它不仅仅是让角色看起来更“毛茸茸”那么简单&#xff0…

数字孪生技术引领UI前端设计潮流:增强现实(AR)的集成应用

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;AR 与数字孪生融合的设计革新浪潮在体验经济与技术融合的双重驱动下&…

碰一碰发视频源码搭建与定制化开发:支持OEM

在近场通信&#xff08;NFC&#xff09;技术与移动终端深度融合的背景下&#xff0c;“碰一碰发视频” 功能凭借便捷的交互体验&#xff0c;在商业推广、信息传递等场景中快速落地。不同于标准化解决方案的黑盒模式&#xff0c;基于源码的定制化开发能从底层优化传输效率、提升…

Ubuntu 24.04 安装配置 Redis 7.0 开机自启

下载源码 wget https://download.redis.io/releases/redis-7.0.12.tar.gz安装依赖 & 准备环境 sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential tcl curl解压 tar xzf redis-7.0.12.tar.gz编译安装 cd redis-7.0.12 make -j$(nproc) …

【Linux 系统】基础IO——Linux中对文件的理解

13.基础IO(1) 文章目录13.基础IO(1)文件的基本概念&#xff1a;内容与属性文件的打开机制&#xff1a;fopen 和 open被打开的文件与磁盘文件的区别文件的内核数据结构文件与进程的交互方式标准输入/输出/错误与文件流系统调用与文件描述符文件打开模式&#xff08;r/w/a/a&…

Go调度器的抢占机制:从协作式到异步抢占的演进之路|Go语言进阶(7)

想象一下这样的场景&#xff1a;你在餐厅排队等位&#xff0c;前面有个人点了餐却一直霸占着座位玩手机&#xff0c;后面的人只能干等着。这就是Go早期版本面临的问题——一个goroutine如果不主动让出CPU&#xff0c;其他goroutine就只能饿着。 今天我们来聊聊Go调度器是如何解…

开源模型应用落地-让AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j与Streamlit的创新实践(四)

一、前言 在人工智能迅速发展的今天,如何让AI系统更懂“你”?答案或许藏在个性化的记忆管理之中。Mem0作为一个开源的记忆管理系统,正致力于为AI赋予长期记忆与个性化服务能力。通过结合高性能向量数据库Qdrant、图数据库Neo4j的强大关系分析能力以及Streamlit的高效可视化交…

基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot

school-market 介绍 基于微信小程序的校园二手交易平台 功能结构图 软件架构 系统分为三个端&#xff0c;分别是客户端、管理端、服务端&#xff1b; 客户端&#xff1a;使用原生微信小程序实现 管理端&#xff1a;使用Layui实现 服务端&#xff1a;使用Java SpringBoot…

IDEA与Gradle构建冲突,导致java重复类的解决方案

项目构建总是报错&#xff1a;错误提示1&#xff1a;java:重复类或错误提示2&#xff1a;Internal error in the mapping processor: java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file排查发现build/generated/sources/an…

如何调节笔记本电脑亮度?其实有很多种方式可以调整亮度

长时间面对屏幕工作、学习或娱乐&#xff0c;很多人会感到眼睛干涩、疲劳&#xff0c;甚至出现视力下降等问题。其实&#xff0c;这些问题的背后&#xff0c;往往隐藏着一个看似简单却极易被忽视的设置—屏幕亮度。 合适的屏幕亮度不仅能提升视觉体验&#xff0c;还能有效缓解…

国际数字影像产业园创作空间升级 打造更优质营商环境

国际数字影像产业园创作空间升级后表现显著&#xff0c;聚焦设施数字化与用户体验优化。整体提升了创意生态系统的竞争力&#xff0c;有效吸引全球企业。 升级核心改进 基础设施现代化&#xff1a;引入智能硬件如5G网络和云渲染设备&#xff0c;支持高清影像处理&#xff0c;…

浅谈 webshell 构造之如何获取恶意函数

前言这篇文章主要是总结一下自己学习过的如何获取恶意函数的篇章&#xff0c;重点是在如何获取恶意函数get_defined_functions(PHP 4 > 4.0.4, PHP 5, PHP 7, PHP 8)get_defined_functions — 返回所有已定义函数的数组我们主要是可以通过这个获取危险的函数比如比如当然还有…

Python 单例模式与魔法方法:深度解析与实践应用

在 Python 编程领域,设计模式解决常见问题的通用方案,而魔法方法则是 Python 语言赋予类强大功能的特殊接口。单例模式和魔法方法看似独立,实则紧密关联,魔法方法常被用于实现单例模式。深入理解并熟练运用它们,能够帮助开发者编写出结构清晰、高效且具有高复用性的代码。…