Postman Script用法

介紹

Postman提供了一定的腳本編寫功能,用戶可以通過編寫腳本添加一些動態行爲,官方介紹如下:

Postman contains a powerful runtime based on Node.js that allows you to add dynamic behavior to requests and collections. This allows you to write test suites, build requests that can contain dynamic parameters, pass data between requests, and a lot more. 

Pre-request Script

在請求前執行,用於添加一些動態的請求參數。

Tests

在獲取到服務端返回結果後執行,用於編寫測試用例,判斷返回結果是否符合期望。

使用示例

示例簡述

有一個服務,服務調用方式如下:

  • 每次請求都需要添加當前時間戳參數timestamp至請求頭;
  • 每次請求都需要對timestamp進行加密生成數據簽名參數signature,並把signature添加到請求頭,signature參數生成算法:signature=MD5(salt+timestamp)。

模擬接口參考

以下是基於Spring Boot的接口模擬參考代碼:

package cn.centychen.demo.springboot.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author Cent
 * @createAt 2020/10/21
 */
@RestController
@RequestMapping("/postman")
@Slf4j
public class PostmanDemoController {

    private static final String SALT = "yJhjBoiGN8or";
    private static final char[] HEX_CHARS = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


    @GetMapping("/demo")
    public String demo(@RequestHeader("timestamp") String timestamp, @RequestHeader("signature") String signature, String name) {
        if (!accessSignature(timestamp, signature)) {
            return "Sorry,signature is wrong!";
        }

        return String.format("%s,you do it!", name);
    }

    /**
     * 校驗簽名
     *
     * @param timestamp
     * @param signature
     * @return
     */
    private boolean accessSignature(String timestamp, String signature) {
        return StringUtils.hasText(timestamp)
                && StringUtils.hasText(signature)
                && generateSignature(timestamp).equals(signature);
    }

    /**
     * 生成簽名
     *
     * @param string
     * @return
     */
    private String generateSignature(String string) {
        byte[] secretBytes = null;
        try {
            secretBytes = MessageDigest.getInstance("MD5").digest(
                    (SALT + string).getBytes());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("簽名失敗!");
        }
        String signature = new String(encodeHex(secretBytes));
        log.info("signature=====>{}", signature);
        return signature;
    }

    /**
     * Encode
     *
     * @param bytes
     * @return
     */
    private char[] encodeHex(byte[] bytes) {
        char[] chars = new char[32];

        for (int i = 0; i < chars.length; i += 2) {
            byte b = bytes[i / 2];
            chars[i] = HEX_CHARS[b >>> 4 & 15];
            chars[i + 1] = HEX_CHARS[b & 15];
        }

        return chars;
    }
}

Postman調用

接口配置

Header配置

編寫pre-request script

//鹽值
var salt = 'yJhjBoiGN8or'

//請求參數name
var name='Cent';
pm.environment.set('name',name);

//獲取當前時間戳
var timestamp = new Date().getTime();
//添加timestamp到環境變量
pm.environment.set('timestamp',timestamp);

//生成數據簽名,CryptoJS是Node的基礎包,可直接使用
var signatrue = CryptoJS.MD5(salt + timestamp).toString();
//添加signatrue到環境變量
pm.environment.set('signatrue',signatrue);

編寫tests script

pm.test("調用測試",function(){
    var name = pm.environment.get('name');
    pm.expect(pm.response.text()).eql(name+',you do it!');
});

調用測試

執行調用返回結果如下文,驗證通過。

請求頭

返回信息

Tests

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章