Thực hiện chữ ký số, phụ thuộc phiên, phụ thuộc API và kiểm tra kết quả bất đồng bộ trong Postman

Sử dụng Script JS để mở rộng khả năng của Postman

Dựa trên Postman 6.1.4 phiên bản native cho Mac Minh họa kết hợp với user_api_demo

Ghi chú Gần đây tôi nhận được nhiệm vụ kiểm thử một số giao diện đặt hàng cơ bản và tích hợp chúng vào quy trình liên tục. Tôi cần kiểm tra các chức năng thông thường, sau khi nghiên cứu thấy rằng các cách đặt hàng khác nhau có thể yêu cầu đăng nhập (phụ thuộc phiên), hoặc cần xác minh chữ ký số (dịch vụ microservice sử dụng chữ ký số), và nhiều dữ liệu động như ID người dùng, ID địa chỉ, ID công việc, thời điểm hiện tại... Đặc biệt, giao diện đặt hàng là bất đồng bộ, chỉ trả về event_key từ luồng sự kiện. Trong môi trường test, xử lý đơn hàng chậm, cần kiểm tra kết quả trong thời gian dài bằng cách kiểm tra định kỳ. Ban đầu tôi nghĩ chỉ có thể dùng timer của JMeter để kiểm tra kết quả bất đồng bộ, nhưng vì không quen với cách tổ chức thành phần của JMeter nên tôi thử dùng JS + Postman để thực hiện.

Khả thi Phiên bản mới Postman hỗ trợ Pre-request Script và Test với JavaScript, hỗ trợ cấp độ Collection (tập hợp kiểm thử)/Folder (thư mục con) tương tự như setUp và tearDown trong các khung kiểm thử khác, có chức năng Fixtures để chuẩn bị, kiểm tra và dọn dẹp theo từng phạm vi.

Thư viện JS hỗ trợ bởi Postman

  • Lodash: Bộ thư viện hàm hữu ích cho JS, cung cấp nhiều phương thức xử lý chuỗi, mảng, đối tượng, tuy nhiên tôi ít dùng
  • cheerio: Thư viện cốt lõi jQuery, giúp trích xuất và kiểm tra dữ liệu trong HTML/XML dễ dàng
  • tv4 JSON Schema validator: Kiểm tra cấu trúc JSON theo mẫu đã định nghĩa, phù hợp để kiểm tra định dạng phản hồi JSON
  • CryptoJS: Thư viện mã hóa, hỗ trợ AES, DES, HMAC, MD5, SHA1,... dùng để tạo dữ liệu mã hóa hoặc tính toán chữ ký
  • xml2json/json2xml: Chuyển đổi giữa định dạng XML và JSON

Tham khảo API Postman Sandbox

Trong script của Postman có thể đọc/gán biến, biến môi trường, biến toàn cục, đọc thông tin request (chỉ đọc) và response (chỉ đọc), quan trọng hơn là có thể gửi yêu cầu API từ script để giải quyết vấn đề phụ thuộc API và kiểm tra kết quả.

Thực hiện chữ ký số

Nguyên lý: Đặt biến {{sign}} trong yêu cầu -> Pre-request Script tạo sign và thiết lập biến môi trường -> Gửi yêu cầu Thông thường các API có chữ ký đều có sẵn jar, chỉ cần dùng Java hoặc JMeter gọi. Nhưng với người kiểm thử có kỹ năng lập trình, có thể tự triển khai chữ ký để linh hoạt hơn.

Đầu tiên, thiết lập các biến, đặt biến môi trường appsecret để sử dụng trong mã hóa

Triển khai thuật toán chữ ký bằng JS

Thuật toán chữ ký xem tài liệu trong delUser của user_api_demo

Pre-request Script

// Kết nối tham số
function connect_params(params){
    if(typeof(params) == "string")
        return params;
    else {
        var sorted_keys = Object.keys(params).sort();
        var result = '';
        for(var i in sorted_keys) {
            var key = sorted_keys[i];
            result += key + "=" + connect_params(params[key]) + "&";
        }
        return result;
    }
}

// Tính toán chữ ký
function calculate_signature(appsecret,params){
    var param_string = connect_params(params);
    console.log(param_string + "appsecret=" + appsecret);
    return CryptoJS.MD5(param_string+"appsecret="+appsecret).toString();
    
}

var secret= pm.environment.get("appsecret");  // Lấy appsecret từ biến môi trường
params = JSON.parse(request.data);  // Lấy dữ liệu yêu cầu
delete params.sign;                 // Loại bỏ sign, giữ lại các tham số yêu cầu
signature = calculate_signature(secret, params); // Tính chữ ký

pm.environment.set("sign", signature);   // Thiết lập biến môi trường sign

Phụ thuộc phiên / Phụ thuộc API (liên kết)

Nguyên lý thực hiện: Phụ thuộc phiên: Gửi yêu cầu đăng nhập trong Pre-request Script, giữ phiên làm việc Phụ thuộc API: Gửi yêu cầu API phụ thuộc trong Pre-request Script, lấy tham số từ phản hồi -> thiết lập biến môi trường -> dùng trong yêu cầu

Phụ thuộc phiên (cần đăng nhập) Thêm script gửi yêu cầu đăng nhập vào Pre-request Script của API cần đăng nhập:

base_url = pm.environment.get("base_url");

// Yêu cầu đăng nhập, dùng script Postman gửi yêu cầu dạng form (urlencoded) (không tìm thấy trong tài liệu Baidu, cũng không có trên trang chính thức!)
const loginRequest = {
    url: base_url + '/api/user/login/',
    method: "POST",
    body: {
        mode: 'urlencoded',
        urlencoded: 'name=ZhangSan&password=123456'
    }
};
pm.sendRequest(loginRequest, function (err, res) {
    console.log(err ? err : res.text());
});

Phụ thuộc API API phụ thuộc token, đặt tham số động token trong yêu cầu, trong Pre-request Script gọi API getToken để lấy token và thiết lập biến môi trường

Pre-request Script

appid = pm.environment.get("appid");
base_url = pm.environment.get("base_url");

pm.sendRequest(base_url+'/api/user/getToken/?appid='+appid, function (err, res) {
    if (err) {
        console.log(err);
    } else {
        token = res.text().split("=")[1];
        pm.environment.set("token", token);
    }
});

Kiểm tra kết quả bất đồng bộ

Kiểm tra kết quả bất đồng bộ là khó khăn trong kiểm thử API, một phương pháp là có API lấy trạng thái, ở đây sử dụng setInterval trong JS trong Test để kiểm tra định kỳ

Tests

event_key = pm.response.json().data.event_key; // Lấy event_key từ phản hồi
base_url = pm.environment.get("admin");

// API kiểm tra kết quả đơn hàng
const getOrderResult = {
  url: base_url + '/customer/COrder/getOrderResult',
  method: 'POST',
  body: {
    mode: 'urlencoded',
    urlencoded: 'event_key='+event_key
  }
};

var count = 0; // Đếm lần kiểm tra

// Hàm gửi yêu cầu dùng cho bộ đếm
function checkResult(){
    pm.sendRequest(getOrderResult, function (err, res) {
        count += 1;
        if(err){
            console.log(err);
        }
        else{
            message = res.json().data.msg;
            if(message == 'finish' || count > 10){   // Dừng khi msg từ working chuyển thành finish, tối đa 20 lần kiểm tra, tối đa 1 phút
               clearInterval(timer); 
            }
        }
    });
}

timer = setInterval(checkResult, 3000);  // Gọi API mỗi 3 giây để kiểm tra trạng thái

Thẻ: postman JavaScript API Testing Asynchronous API Signature Verification

Đăng vào ngày 23 tháng 5 lúc 06:51