Postman接口测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

pre-request script 介绍

在过往的工作中,遇到很多测试小伙伴使用 postman 的时候都是直接通过 api 文档的描述请求,检查返回的数据是否正常,很少会用到 pre-request Script 这个功能,甚至也有不少开发的小伙伴也是很少用到这个功能。这个功能类似于 python unittest 里面的 setup 或者是 pytest 里面的 conftest 文件,在执行测试前先执行的函数。

pre-request script 应用

pre-request script 是 postman 执行前的前置条件功能。它能够做到 request 请求前的工作。包括:

  • 对登录验证进行加密或解密
  • 切换环境变量
  • 获取上一个接口的响应值并进行更新

以上都是可以在 pre-request script 功能做的。

postman 执行顺序

首先来讲一下,postman 的执行顺序,其实这个只看一张图就够了。

从 postman 的介绍中,可以知道 postman 执行的顺序会先去到 pre-request script 检查是否有需要执行的前置条件。

pre-request script 场景实践

场景一:登录验证加密

现在有一个我们项目中,登录接口是通过 user token 登录的。前端页面需要填写 username 以及 password,再通过 js 进行 MD5 加密处理,最后请求接口验证返回登录状态。

复制代码
api : /api/login
method : post
headers : 
    token: user_token
    Content-Type: application/json

生成 user_token 方式: username&psaaword 大写

上面就是接口文档说明的,要通过 md5 方式对 username&password 进行加密。那么在 pre-request script 里面,我们可以这样做。

点开环境变量会看到已经生成了 user_token 对应的加密 token 了。

场景二:切换环境变量

可能对应这个场景比较少人会用上,但是不得不说,这个场景确实有用。

平时我们切换测试或者产线环境的时候,都是命名不同的环境名称,然后将对应环境的 HOST 填写到环境变量里面去。经常我们会命名这样的:TEST_HOST,PROD_HOST 这样的方式,当我们切换环境的时候,在 request 中改 HOST 即可。

如果我们可以在请求前,可以自动切换不同的 HOST 就更好。

我们可以这样做,首先在 collection 中定义不同环境的 HOST。

其次,我们在 pre-request script 中定义我们的函数

复制代码
let varbs = new Set()
pm.collectionVariables.values.each(v => {
    varbs.add(v.key.toUpperCase())
})
 
pm.collectionVariables.values.each(v => {
    let envVarbKey = [pm.environment.name, v.key].join("_").toUpperCase()
    if (varbs.has(envVarbKey)) {
        pm.collectionVariables.set(v.key, pm.collectionVariables.get(envVarbKey))
    }
});

这里面的意思,就是根据环境名去 variables 中寻找我们对应的 HOST

最终,我们只需要在不同环境中维护 api-key 等参数即可。

场景三:获取另外接口的响应值并进行更新

在请求的时候,需要获取到另外一个接口的响应值,并将响应值作为当前 request 的参数。在这里,pre-request script 不仅仅能写函数,还能写请求函数。

复制代码
// Refresh the OAuth token if necessary
var tokenDate = new Date(2022,9,3);
var tokenTimestamp = pm.environment.get("OAuth_Timestamp");
if(tokenTimestamp){
  tokenDate = Date.parse(tokenTimestamp);
}
var expiresInTime = pm.environment.get("ExpiresInTime");
if(!expiresInTime){
    expiresInTime = 300000; // Set default expiration time to 5 minutes
}
 
if((new Date() - tokenDate) >= expiresInTime)
{
   pm.sendRequest({
      url:  pm.variables.get("Auth_Url"),
      method: 'POST',
      header: {
        'Accept': 'application/json',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': pm.variables.get("Basic_Auth")
      }
  }, function (err, res) {
      try{
        pm.environment.set("OAuth_Token", res.json().access_token);
        pm.environment.set("OAuth_Timestamp", new Date());
 
        // Set the ExpiresInTime variable to the time given in the response if it exists
        if(res.json().expires_in){
            expiresInTime = res.json().expires_in * 1000;
        }
        pm.environment.set("ExpiresInTime", expiresInTime);
      }
      catch(e) {
        console.log('Unable to load access token from response);
      }
  });
}

这里面的函数,主要是通过检索 token 是否过期,重新生成 token 的请求方法。比较简单理解。

1、检查 token 是否过期

2、如果过期,就生成新的 token

3、将新的 token 设置到环境变量,然后记录设置的时间

总结

以上就是这篇文章主要讲的内容,主要是讲解 pre-request script 在工作中的应用场景,希望可以帮助到大家。

扩展

前面说到的加密方式,有很多种,不仅仅是 MD5 加密,同时还有 RSA,AES,bash64 SHA1 等等。

这几种加密方式有什么不同,在这里简单讲一下:

  • Base64 是一种用64个字符来表示任意二进制数据的方法,这种编码规则是公开的,基本只要有程序能力都能解开,所以请勿用作加密用途,它的作用不在于安全性,而在于让内容能在网络间无错的传输。(常用语编码特殊字符,编码小型二进制文件等)
  • AES 是对称加密算法,也就是说加密和解密都是采用同一个的密钥。当前最为流行的对称加密算法,这个没有之一。它是如此的常用,以至于很多 CPU 在硬件层面上支持 AES 的加密和解密。AES 是美国政府使用的加密标准,这意味着政府的机密文件大都是用 AES 进行加密的。https 就是使用 AES 来进行数据的加密的,因为 AES 是 TLS 和 SSL 标准的一部分。
  • RSA 公开密钥加密(public-keycryptography),也称为非对称加密,一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户公钥加密后所得的信息,只能用该用户的解密的私钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。这种通常我们在 github 上会用到。
  • MD5、SHA1 都是不可逆的,防篡改的,用来校验数据真伪的,不是用来加密数据的。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

相关推荐
明月_清风2 分钟前
FastAPI 从入门到实战:3 分钟构建高性能异步 API
后端·python·fastapi
bellus-9 分钟前
ubuntu26测试win10的ollama大模型性能
python
水木流年追梦10 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
JavaWeb学起来10 分钟前
Python学习教程(六)数据结构List(列表)
数据结构·python·python基础·python教程
liuyunshengsir23 分钟前
PyTorch 动态量化(Dynamic Quantization)
人工智能·pytorch·python
电子云与长程纠缠32 分钟前
UE5制作六边形包裹球体效果
开发语言·python·ue5
DFT计算杂谈41 分钟前
KPROJ编译教程
java·前端·python·算法·conda
念恒123061 小时前
Python(循环中断)
开发语言·python
tsfy20032 小时前
Python 处理中文文件名的3个坑(附 Flask 上传解决函数)
开发语言·python·flask·文件上传·中文编码
AI技术控2 小时前
KV Cache 缓存机制的原理和应用:从 Transformer 推理到大模型服务优化
人工智能·python·深度学习·缓存·自然语言处理·transformer