首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Postman常用断言功能解析

  • 23-12-10 07:02
  • 3085
  • 5448
blog.csdn.net

一、Postman断言模块

二、七种常规业务断言

前4种最常用:

1)Status code:Code is 200 检查返回的状态码是否为200

2)Response body:Contains string 检查响应中包括指定字符串

3)Response body:Json value check 检查响应中其中json的值

4)Response body:is equal to a string 检查响应等于一个字符串

5)Response headers:Content-Type...检查是否包含响应头Content-Type

6)Response time is less than 200ms:检查请求耗时小于200ms

7)Status code :Successfull POST  request :判断post请求的状态码,是不是在201和202这两个之中

三、全局断言:一般是 状态断言

四、常规业务断言

3.1. Status code:Code is 200 检查返回的状态码是否为200

  1. //状态码业务断言 == 全局断言,一个地方处理即可
  2. pm.test("检查返回状态码为200", function () {
  3. pm.response.to.have.status(200);
  4. });

3.1. 总结:

当Status code 不等于200时,断言报错;反之==200时,断言通过

3.2. Response body:Contains string 检查响应中包括指定字符串

  1. //Postman源码
  2. pm.test("Body matches string", function () {
  3. pm.expect(pm.response.text()).to.include("string_you_want_to_search");
  4. });

 

3.3. Response body:Json value check 检查响应中其中json的值

  1. //Postman源码
  2. pm.test("Your test name", function () {
  3. var jsonData = pm.response.json();
  4. pm.expect(jsonData.value).to.eql(100);
  5. });

其中pm.test意为postman中的test模块

pm.test(“assert name”, function()‘{*****}’)

可以理解为是其固定格式而{****}就是断言的主要内容;

{ var jsonData = pm.response.json();--------①
pm.expect(jsonData.code).to.eql(100);}------------②

①主要是对响应做一个json格式的转换,先把响应转换为json格式
②通过取值jsonData.code 取响应结果中key键为code的值 与100进行等值比较
pm.expect(jsonData.code).to.epl(100) 

3.4. Response body:is equal to a string 检查响应等于一个字符串

  1. //Postman源码
  2. pm.test("Body is correct", function () {
  3. pm.response.to.have.body("response_body_string");
  4. });

3.4.总结

其中response_body_string对应的是响应体的全部内容,这种断言方式在响应体内容比较多的时候是不建议使用的,需要注意只有响应体与预期的完全相同才会断言成功

3.5. Response headers:Content-Type...检查是否包含响应头Content-Type

  1. //Postman源码
  2. pm.test("Content-Type is present", function () {
  3. pm.response.to.have.header("Content-Type");
  4. });

3.5.总结

据这个思路我们把断言脚本中的Content-Type替换成Date,就是断言响应头中是不是存在Date这个key值(json是以Key-Value键值对的形式存储的)

3.6. Response time is less than 200ms:检查请求耗时小于200ms

  1. //Postman源码
  2. pm.test("Response time is less than 200ms", function () {
  3. pm.expect(pm.response.responseTime).to.be.below(200);
  4. });

3.6.总结

其中“Response time is less than 200ms”是你为这个断言所起的名字,可以自定义在运行接口测试的时候会在test的结果中显示出来如图:

3.7.Status code :Successfull POST  request :判断post请求的状态码,是不是在201和202这两个之中

  1. //Postman源码
  2. pm.test("Successful POST request", function () {
  3. pm.expect(pm.response.code).to.be.oneOf([201, 202]);
  4. });

3.7.总结

成功的post请求状态码,判断该请求状态码是不是在201和202这两个之中

因为在post请求中存在响应码是201和202或者200的时候都是表示成功只是代表的具体含义不同,这里和断言响应码是不是200有相似之处,不同的地方在于这里断言的是to.be.oneOf([list]),看响应码是不是在这个list里面,多了一个范围

状态码:200(请求成功成功的含义,取决于HTTP方法如POST:描述动作结果的资源在消息体中传输)
状态码:201(该请求已成功,并因此创建了一个新的资源。通常源于POST或某些PUT请求。)
状态码:202(该请求已被接受进行处理,但是处理尚未完成。最终有可能会被处理,也可能不会处理。) 

五、自定义动态参数(全局变量)断言的方式:精确断言

参考文档:

Postman内置动态参数和自定义的动态参数以及断言方式_沫沫1890S的博客-CSDN博客

  1. pm.globals.get("time")
  2. globals["time"]
  3. globals.time

备注:上图断言中拼接的+pm.globals.get("time"),可直接替换成:globals["time"] 或 globals.time

在Postman中断言也属于比较重要的一块内容,因为关系到如何准确的判断我们测试的接口是否达到我们的期许和要求,断言脚本语言除了系统自带的一部分外还有很多可以灵活自己编写的,在不断的学习中还会不断的总结。

一、Stream的读写操作

在 Node.js 中,Stream 是处理大数据文件和持续数据流的强大工具。它允许你以更高效的方式读取和写入数据,避免一次性加载大量内容到内存中。

1. 什么是 Stream

Stream 是 Node.js 中用于处理流数据的接口。它们是 EventEmitter 的实例,有四种基本类型:

  • Readable:可读流,例如 fs.createReadStream()。
  • Writable:可写流,例如 fs.createWriteStream()。
  • Duplex:可读可写流,例如 TCP 套接字(例如net.Socket)。
  • Transform:在读写过程中可以修改或转换数据的流,例如 zlib 压缩流(zlib.createDeflate())。

2、创建可读流(Readable Stream)

js
复制代码
const fs = require('fs'); fs.readFile('input.txt', (err, data) => { if (err) return console.error(err); console.log('读取到数据:', data); }); //一次性读取我们都知道这样也可以上文读取,但是有缺点 // 缺点一:没有办法精准控制从哪里读取,读取什么位置 // 缺点二:读取到某一个位置的,暂停读取, 恢复读取, // 缺点三:文件非常大的时候,多次读取 //后面参数可选可不选 const readStream = fs.createReadStream('input.txt',{ start: 2, // 开始读取的位置 end: 22, // 结束读取的位置 highWaterMark: 3 // 读取几个字节回调一次,可以做为精准回调,默认是64kb }); readStream.on('open', (fd) => { console.log('通过流将文件打开~',fd); }); readStream.on('data', chunk => { console.log('读取到数据:', chunk.toString()); }); readStream.on('end', () => { console.log('读取完毕'); }); readStream.on('error', err => { console.error('读取出错:', err); });
image.png

后续不再赘述fs操作了。

3、创建可写流(Writable Stream)

js
复制代码
const writeStream = fs.createWriteStream('output.txt'); // const writeStream = fs.createWriteStream('output.txt', { // flags: "a+",// a+表示追加内容 // start: 1, // 开始写入的位置 // }); // 这里也可以自行传参数查看效果; writeStream.write('写入一些内容\n'); // end方法: // 操作一:将最后的内容写入到文件中,并且关闭文件 //-操作二:关闭文件 writeStream.end('最后一行\n'); writeStream.on('finish', () => { console.log('写入完成'); }); writeStream.on('error', err => { console.error('写入出错:', err); }); // writeStream.on('close', () => { // console.log('流写入关闭'); // }); // writeStream.close();

4、读写结合:文件复制操作

js
复制代码
const readStream = fs.createReadStream('input.txt'); const writeStream = fs.createWriteStream('output.txt'); readStream.pipe(writeStream);

使用 .pipe() 方法可以将可读流中的数据自动传递给可写流。

5、进阶:Transform 流

Transform 流是 Duplex 流的一种,允许在数据传输过程中对数据进行转换。

js
复制代码
const { Transform } = require('stream'); const upperCaseTr = new Transform({ transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } }); process.stdin.pipe(upperCaseTr).pipe(process.stdout);

Transform 流示例:文件中每行添加行号

js
复制代码
const fs = require('fs'); const readline = require('readline'); const { Transform } = require('stream'); let lineNumber = 1; const lineNumberTransform = new Transform({ transform(chunk, encoding, callback) { const lines = chunk.toString().split('\n').map(line => `${lineNumber++}: ${line}`); this.push(lines.join('\n')); callback(); } }); fs.createReadStream('input.txt') .pipe(lineNumberTransform) .pipe(fs.createWriteStream('numbered_output.txt'));

二、http模块web服务

什么是Web服务器?

  • 当应用程序(客户端)需要某一个资源时,可以向一台服务器,通过Http请求获取到这个资源;
  • 提供资源的这个服务器,就是一个Web服务器;
  • 开源的Web服务器:Nginx、Apache(静态)、ApacheTomcat(静态、动态)、Node.js

1、引入 http 模块并创建服务器

js
复制代码
const http = require('http'); //http.createServer会返回服务器的对象; //底层其实使用直接 new Server 对象。 const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, World!'); }); //监听端口时,监听1024以上的端口,666535以下的端口;因为这里和字节 2进制有关 server.listen(3000, () => { console.log('服务器已启动:http://localhost:3000'); });

说明:

  • 可以创建多个服务器

  • http.createServer() 创建一个 HTTP 服务实例。

  • req 是请求对象,包含客户端请求的所有信息。

  • res 是响应对象,用于向客户端返回数据。

  • server.listen() 启动服务器监听指定端口。

提示

可以全局安装nodemon工具npm install nodemon -g以做到修改后不需要再进行重启node执行;可以直接使用nodemon XXX.js来运行即可

2、request 请求对象解析

req 对象包含了客户端请求的所有信息:

js
复制代码
const server = http.createServer((req, res) => { //request对象中包含哪些信息? console.log('请求方法:', req.method); console.log('请求路径:', req.url); console.log('请求头:', req.headers); res.end('已收到请求'); });

常用属性包括:

  • req.method: 请求方法(如 GET、POST)
  • req.url: 请求路径(包括查询字符串)
  • req.headers: 请求头对象
  • 根据这一特性我们可以根据不同请求路径或者方式去做不同的返回值操作执行数据内容。

3、response 响应对象解析

res 对象用来返回响应数据给客户端:

js
复制代码
res.writeHead(200, { 'Content-Type': 'text/html' }); res.write('

Hello Web

'
);
res.end();

常用方法:

  • res.writeHead(statusCode, headers): 设置状态码与响应头
  • res.write(data): 向响应体写入数据
  • res.end([data]): 结束响应,data 为可选

4、根据不同 URL 返回不同内容

js
复制代码
const server = http.createServer((req, res) => { if (req.url === '/') { res.end('欢迎来到首页'); } else if (req.url === '/about') { res.end('这是关于页面'); } else { res.statusCode = 404; res.end('页面未找到'); } });

这一操作可以根据不一样请求参数进行分割处理展示,node中模块引入url,解析参数可以用URLSearchParams(queryString弃用了)

5、处理 POST 请求数据

POST 请求中的数据是通过流的方式传递的,需要监听 data 和 end 事件:

js
复制代码
//request时象本质是上是一个readable可读流 const server = http.createServer((req, res) => { if (req.method === 'POST' && req.url === '/submit') { let body = ''; req.on('data', chunk => { body += chunk; }); req.on('end', () => { console.log('接收到的数据:', body); res.end('数据接收成功'); }); } });

6、静态文件服务示例

js
复制代码
const fs = require('fs'); const path = require('path'); const server = http.createServer((req, res) => { const filePath = path.join(__dirname, req.url === '/' ? '/index.html' : req.url); fs.readFile(filePath, (err, data) => { if (err) { res.writeHead(404); res.end('文件未找到'); } else { res.writeHead(200); res.end(data); } }); });

7、总结

使用 Node.js 原生的 http 模块可以快速搭建小型 Web 服务,虽然比不上 Express 那样方便,但足够应对基础场景,并能帮助我们更深入理解 Web 服务的底层原理。

三、axios node中使用

Http Node请求

1. http.request —— 更灵活,支持 GET / POST / PUT 等所有方法

js
复制代码
const http = require('http'); const options = { hostname: 'jsonplaceholder.typicode.com', port: 80, path: '/posts/1', method: 'GET' }; const req = http.request(options, res => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => console.log(JSON.parse(data))); }); req.on('error', error => console.error(error)); req.end();

2. http.get —— 简化 GET 请求写法的语法糖

js
复制代码
const http = require('http'); http.get('http://jsonplaceholder.typicode.com/posts/1', res => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => console.log(JSON.parse(data))); }).on('error', err => console.error(err));

✅ 适合只发 GET 请求时使用,不支持 POST、PUT、DELETE。

🛠 1、安装 axios

bash
复制代码
npm install axios

📦 2、基本使用方式

1. 发起 GET 请求

js
复制代码
const axios = require('axios'); axios.get('https://jsonplaceholder.typicode.com/posts/1') .then(res => { console.log(res.data); }) .catch(err => { console.error('请求失败', err.message); });

2. 发起 POST 请求

js
复制代码
axios.post('https://jsonplaceholder.typicode.com/posts', { title: 'Hello', body: 'World', userId: 1 }) .then(res => { console.log(res.data); }) .catch(err => { console.error('POST 请求出错', err.message); });

⚙️ 3、带参数的请求

GET 请求携带参数:

js
复制代码
axios.get('https://jsonplaceholder.typicode.com/posts', { params: { userId: 1 } }) .then(res => { console.log(res.data); });

POST 请求设置 headers:

js
复制代码
axios.post('https://example.com/api', { name: '张三' }, { headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_token' } })

🧪 4、async/await 写法

js
复制代码
const axios = require('axios'); async function getData() { try { const res = await axios.get('https://jsonplaceholder.typicode.com/posts/1'); console.log(res.data); } catch (err) { console.error('请求出错', err.message); } } getData();

📤 5、文件上传(multipart/form-data)

js
复制代码
const axios = require('axios'); const FormData = require('form-data'); const fs = require('fs'); const form = new FormData(); form.append('file', fs.createReadStream('./test.jpg')); axios.post('https://example.com/upload', form, { headers: form.getHeaders() }) .then(res => console.log('上传成功', res.data)) .catch(err => console.error('上传失败', err));

📁 6、设置超时 / 自定义配置

js
复制代码
axios({ method: 'get', url: 'https://example.com/api', timeout: 3000, // 3秒超时 headers: { 'X-Custom-Header': 'value' } })

🔁 7、axios 实例(适合封装)

js
复制代码
const instance = axios.create({ baseURL: 'https://api.example.com', timeout: 5000, headers: { 'X-Token': 'abc123' } }); instance.get('/user').then(res => console.log(res.data));

四、文件上传的细节分析


📌 1、文件上传的基本流程

  1. 前端使用表单或 JS 提交文件(multipart/form-data)
  2. 后端接收请求并解析上传的文件内容
  3. 存储文件到指定目录(本地或云存储)
  4. 返回文件上传结果或链接

使用原生 http 和 fs

js
复制代码
const http = require('http'); const fs = require('fs'); const path = require('path'); http.createServer((req, res) => { if (req.method === 'GET') { res.writeHead(200, {'Content-Type': 'text/html'}); res.end(`

`); } else if (req.method === 'POST') { let data = ''; req.setEncoding('binary'); req.on('data', chunk => { data += chunk; }); req.on('end', () => { // 获取 boundary 分隔符 const boundary = '--' + req.headers['content-type'].split('boundary=')[1]; const parts = data.split(boundary); const filePart = parts[1]; // 提取文件名 const match = filePart.match(/filename="(.+)"/); const filename = match && match[1] ? match[1] : 'upload.bin'; const start = filePart.indexOf('\r\n\r\n') + 4; const end = filePart.lastIndexOf('\r\n'); const fileData = filePart.substring(start, end); fs.writeFile(path.join(__dirname, filename), fileData, 'binary', err => { if (err) { res.writeHead(500); res.end('上传失败'); } else { res.writeHead(200); res.end('上传成功,文件名:' + filename); } }); }); } }).listen(3000, () => { console.log('Server running at http://localhost:3000'); });

🧰 2、常用 Node.js 文件上传模块

✅ 推荐使用 multer

bash
复制代码
npm install multer

📤 3、Express + Multer 实现文件上传

1. 创建 upload.js

js
复制代码
const express = require('express'); const multer = require('multer'); const path = require('path'); const app = express(); // 配置存储位置和文件名 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './uploads'); // 上传目录 }, filename: function (req, file, cb) { const ext = path.extname(file.originalname); cb(null, Date.now() + ext); // 文件名 } }); const upload = multer({ storage }); app.post('/upload', upload.single('file'), (req, res) => { // req.file 就是上传的文件信息 res.json({ message: '上传成功', filename: req.file.filename }); }); app.listen(3000, () => console.log('服务已启动,端口3000'));

🖥 4、前端上传方式

1. 表单方式

html
复制代码
<form action="http://localhost:3000/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">上传button> form>

2. Axios 上传文件

js
复制代码
const formData = new FormData(); formData.append('file', fileInput.files[0]); axios.post('http://localhost:3000/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) .then(res => console.log('上传成功', res.data)) .catch(err => console.error('上传失败', err));

🧠 5、上传细节与注意事项

细节描述
文件大小限制limits: { fileSize: 5 * 1024 * 1024 }
多文件上传upload.array('files', maxCount)
文件类型校验fileFilter: (req, file, cb) => {...}
跨域后端需设置 Access-Control-Allow-Origin
文件夹不存在处理可用 fs.mkdirSync('uploads', { recursive: true }) 创建

🛠 6、常见问题排查

问题原因
req.file 为 undefined表单名错误或未使用 multipart/form-data
文件未保存destination 路径不存在或无权限
文件名乱码可以使用 Buffer.from(filename, 'binary').toString('utf8') 转码
大文件上传失败默认大小限制过小,可通过 limits 配置放宽
注:本文转载自blog.csdn.net的沫沫18S的文章"https://blog.csdn.net/weixin_37600187/article/details/128103282"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top