介紹
Postman提供了一定的腳本編寫功能沧踏,用戶可以通過編寫腳本添加一些動態(tài)行為寡壮,官方介紹如下:
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
在請求前執(zhí)行,用于添加一些動態(tài)的請求參數(shù)细办。
Tests
在獲取到服務(wù)端返回結(jié)果后執(zhí)行土浸,用于編寫測試用例罪针,判斷返回結(jié)果是否符合期望。
使用示例
示例簡述
有一個服務(wù)黄伊,服務(wù)調(diào)用方式如下:
- 每次請求都需要添加當(dāng)前時間戳參數(shù)timestamp至請求頭泪酱;
- 每次請求都需要對timestamp進(jìn)行加密生成數(shù)據(jù)簽名參數(shù)signature,并把signature添加到請求頭还最,signature參數(shù)生成算法: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);
}
/**
* 校驗(yàn)簽名
*
* @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調(diào)用
接口配置
Header配置
編寫pre-request script
//鹽值
var salt = 'yJhjBoiGN8or'
//請求參數(shù)name
var name='Cent';
pm.environment.set('name',name);
//獲取當(dāng)前時間戳
var timestamp = new Date().getTime();
//添加timestamp到環(huán)境變量
pm.environment.set('timestamp',timestamp);
//生成數(shù)據(jù)簽名斯撮,CryptoJS是Node的基礎(chǔ)包,可直接使用
var signatrue = CryptoJS.MD5(salt + timestamp).toString();
//添加signatrue到環(huán)境變量
pm.environment.set('signatrue',signatrue);
編寫tests script
pm.test("調(diào)用測試",function(){
var name = pm.environment.get('name');
pm.expect(pm.response.text()).eql(name+',you do it!');
});
調(diào)用測試
執(zhí)行調(diào)用返回結(jié)果如下文扶叉,驗(yàn)證通過勿锅。