Kiểm thử tự động trong Postman với Script Tests

Postman cung cấp cơ chế kiểm thử mạnh mẽ thông qua các script chạy ở giai đoạn trước (Pre-request) và sau (Tests) mỗi yêu cầu. Dưới đây là hướng dẫn thực hành về cách xây dựng các bài kiểm thử hiệu quả bằng JavaScript và thư viện Chai tích hợp sẵn.

1. Kiểm tra mã trạng thái HTTP

Sử dụng cú pháp Chai để xác minh mã phản hồi:

pm.test("HTTP status phải là 200", () => {
  pm.response.to.have.status(200);
});

2. Trích xuất và kiểm tra dữ liệu JSON

Phân tích nội dung phản hồi dưới dạng đối tượng JavaScript, rồi áp dụng các ràng buộc logic:

pm.test("Phản hồi chứa trường 'id' và 'name'", () => {
  const payload = pm.response.json();
  pm.expect(payload).to.include.keys('id', 'name');
  pm.expect(payload.id).to.be.a('number');
});

3. Quản lý biến động – môi trường và toàn cục

Đọc giá trị từ môi trường hoặc biến toàn cục để tăng tính linh hoạt:

// Lấy token từ môi trường hiện tại
const authKey = pm.environment.get("auth_token");
pm.test("Token không được rỗng", () => {
  pm.expect(authKey).to.exist.and.not.be.empty;
});

// Ghi kết quả vào biến toàn cục để chia sẻ giữa các request
pm.globals.set("last_response_time_ms", pm.response.responseTime);

4. Thiết lập giá trị biến trước khi gửi yêu cầu

Trong Pre-request Script, tạo dữ liệu động như timestamp hoặc signature:

// Tạo chuỗi nonce ngẫu nhiên cho bảo mật
pm.environment.set("nonce", Math.random().toString(36).substring(2, 10));

5. Kiểm tra mảng và lặp qua phần tử

Xác minh từng phần tử trong mảng phản hồi đáp ứng điều kiện nhất định:

pm.test("Tất cả sản phẩm đều có giá dương", () => {
  const products = pm.response.json();
  products.forEach((item, index) => {
    pm.expect(item.price, `Sản phẩm thứ ${index + 1}`).to.be.above(0);
  });
});

6. Sử dụng Chai một cách tường minh

Import và cấu hình Chai để tận dụng đầy đủ khả năng so sánh sâu:

const { expect } = require('chai');

pm.test("Cấu trúc phản hồi khớp mẫu dự kiến", () => {
  const res = pm.response.json();
  expect(res).to.deep.include({
    success: true,
    data: { type: 'product' }
  });
});

7. Xử lý yêu cầu bất đồng bộ

Dùng async/await để gọi API phụ trợ trong Tests (chỉ hỗ trợ từ Postman v9.15+):

pm.test("Kiểm tra dữ liệu liên quan từ service khác", async () => {
  const relatedRes = await pm.sendRequest({
    method: 'GET',
    url: `https://api.example.com/v1/items/${pm.response.json().itemId}`
  });
  pm.expect(relatedRes.code).to.equal(200);
  pm.expect(relatedRes.json()).to.have.property('category');
});

8. Kiểm tra tiêu đề và kiểu nội dung

Xác minh các thuộc tính ngoài body như Content-Type hay custom headers:

pm.test("Header 'Content-Type' phải là application/json", () => {
  pm.response.to.have.header('Content-Type');
  pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');
});

9. Bắt lỗi và ghi log chủ động

Ngăn lỗi làm gián đoạn toàn bộ test suite bằng khối try/catch:

pm.test("Phân tích JSON an toàn", () => {
  try {
    const parsed = pm.response.json();
    pm.expect(parsed.timestamp).to.be.a('string');
  } catch (err) {
    console.warn(`Không thể parse JSON: ${err.message}`);
    pm.expect.fail(`Phản hồi không phải JSON hợp lệ`);
  }
});

Ví dụ tích hợp: Kiểm thử API danh sách đơn hàng

Dưới đây là kịch bản kiểm thử hoàn chỉnh cho endpoint /orders/latest, kết hợp nhiều kỹ thuật trên:

// Khởi tạo biến theo ngữ cảnh
const expectedUser = pm.environment.get("current_user_id");
const validCategories = ["electronics", "books", "clothing"];

pm.test("1. Mã trạng thái hợp lệ", () => {
  pm.response.to.have.status(200);
});

pm.test("2. Nội dung phản hồi đúng định dạng", () => {
  pm.response.to.be.json;
});

pm.test("3. Cấu trúc dữ liệu tối thiểu", () => {
  const order = pm.response.json();
  pm.expect(order).to.have.all.keys("orderId", "customerId", "items", "totalAmount");
  pm.expect(order.totalAmount).to.be.a('number').and.to.be.at.least(1);
});

pm.test("4. Danh mục sản phẩm nằm trong tập hợp cho phép", () => {
  const items = pm.response.json().items || [];
  items.forEach(item => {
    pm.expect(validCategories).to.include(item.category);
  });
});

pm.test("5. ID khách hàng khớp với môi trường", () => {
  const order = pm.response.json();
  pm.expect(order.customerId).to.equal(expectedUser);
});

// Ghi nhật ký kết quả tổng quan
const resultSummary = {
  passed: Object.values(pm.testResults).every(r => r),
  timestamp: new Date().toISOString(),
  env: pm.environment.name
};
pm.globals.set("latest_order_test", resultSummary);
console.info("✅ Kiểm thử hoàn tất:", resultSummary);

Thẻ: postman chai JavaScript api-testing rest-api

Đăng vào ngày 19 tháng 5 lúc 03:19