• postman|接口测试 | pre-request script 场景应用


    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    生成 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))
        }
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里面的意思,就是根据环境名去 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);
          }
      });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    这里面的函数,主要是通过检索 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),也称为非对称加密(asymmetriccryptography),一种密码学算法类型,在这种密码学方法中,需要一对密钥,一个是私人密钥,另一个则是公开密钥。这两个密钥是数学相关,用某用户公钥加密后所得的信息,只能用该用户的解密的私钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个的秘密性质。称公开的密钥为公钥;不公开的密钥为私钥。这种通常我们在 github 上会用到。

    MD5、SHA1 都是不可逆的,防篡改的,用来校验数据真伪的,不是用来加密数据的。

    现在我邀请你进入我们的软件测试学习交流群:746506216】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。

    喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    【译】为什么Kotlin Synthetics被废弃了?我们用什么来替代?
    初始JDBC 编程
    【ElasticSearch】6亿文档存储的ES集群调优实战
    【iOS】——知乎日报第一周总结
    电商项目-day03
    Mybatis 注解开发 + 动态SQL
    transformer系列1---Attention Is All You Need全文详细翻译
    matlab实现MCMC的马尔可夫转换MS- ARMA - GARCH模型估计
    Effective C++条款03:尽可能使用const(Use const whenever possible)
    C语言-位运算
  • 原文地址:https://blog.csdn.net/m0_67695717/article/details/126735219