Mmaiqai.com
🧭 API Testing · Chương 2 · Mục 2.3

Test API loại POST — validate input, chống tạo trùng

🎯 Mục tiêu học: test đúng trọng tâm của POST — validate dữ liệu đầu vào và hành vi "tạo mới" đặc trưng, vốn không bắt buộc idempotent.

Ví dụ minh hoạ

POST https://api.example.com/v1/orders
Body:
{
  "customerId": "CUS1001",
  "items": [{ "sku": "SKU001", "qty": 2 }],
  "note": "Giao giờ hành chính"
}

Response 201 Created (Location: /v1/orders/ORD1003):
{
  "orderId": "ORD1003",
  "customerId": "CUS1001",
  "status": "PENDING",
  "total": 250000,
  "createdAt": "2026-08-04T10:15:00Z"
}

Checklist test cho POST — nhóm theo 7 kịch bản (xem Mục 2.1)

1. Happy path

Mã TCNội dungKỳ vọng
TC-POST-01Tạo thành công với dữ liệu hợp lệTrả 201, có orderId và createdAt

2. Dữ liệu bắt buộc

Mã TCNội dungKỳ vọng
TC-POST-02Thiếu customerIdTrả lỗi validate rõ ràng
TC-POST-03items rỗng ([])Trả lỗi, không tạo đơn hàng 0 sản phẩm

3. Định dạng & kiểu dữ liệu

Mã TCNội dungKỳ vọng
TC-POST-04qty là số âm hoặc không phải số nguyên (vd 1.5)Trả lỗi validate, không tạo đơn với số lượng vô lý
TC-POST-05customerId sai định dạng (vd không đúng pattern CUSxxxx)Trả lỗi rõ ràng thay vì lỗi hệ thống chung chung

4. Quy tắc nghiệp vụ & dữ liệu tham chiếu

Mã TCNội dungKỳ vọng
TC-POST-06sku không tồn tại trong khoTrả lỗi nghiệp vụ, không tạo đơn hàng với sản phẩm không có thật
TC-POST-07customerId không tồn tại trong hệ thốngTrả lỗi rõ ràng (vd 404/422), không tạo đơn 'mồ côi'

5. Đặc thù POST (không bắt buộc idempotent)

Mã TCNội dungKỳ vọng
TC-POST-08Gọi lại đúng request giống hệt 2 lần liên tiếp (mô phỏng double-submit)Xác nhận có tạo ra 2 bản ghi khác nhau, hay hệ thống có cơ chế chặn trùng (idempotency key)

6. Bảo mật & phân quyền

Mã TCNội dungKỳ vọng
TC-POST-09Token thuộc khách hàng A nhưng body gửi customerId của khách hàng BBị từ chối, hoặc hệ thống tự lấy customerId từ token — không tin theo giá trị client tự khai
TC-POST-10Payload SQL injection/script trong field noteDữ liệu được lưu như chuỗi thường hoặc bị từ chối, không thực thi injection

7. Response contract

Mã TCNội dungKỳ vọng
TC-POST-11Kiểm tra response khi tạo thành côngĐúng status 201 (không phải 200), có header Location trỏ đúng /v1/orders/{orderId} vừa tạo

📌 Ghi nhớ

Response thành công của POST nên trả đúng mã 201 kèm thông tin tài nguyên vừa tạo (id, thời gian tạo) — nhiều API trả nhầm 200 hoặc thiếu id, gây khó khăn cho phía client khi cần dùng lại id đó ngay sau đó.

📖 Thuật ngữ Anh–Việt (mục này)

Đề thi dùng thuật ngữ tiếng Anh — nhớ đúng cụm bên trái. Bấm 🔊 để nghe từng từ, hoặc "Đọc tất cả" để nghe lần lượt Anh → (vài giây) → Việt.

Thuật ngữ (EN)Nghĩa & ghi nhớ nhanh
Double-submitGửi trùng request — do người dùng bấm 2 lần hoặc client tự động retry
201 CreatedStatus code chuẩn cho việc tạo mới thành công
Location headerHeader trỏ tới URL của tài nguyên vừa được tạo
Idempotency keyKhoá gửi kèm request để server nhận biết và chặn xử lý trùng lặp

📎 Nội dung do maiqai.com biên soạn — endpoint và dữ liệu trong ví dụ chỉ mang tính minh hoạ, không thuộc hệ thống thật nào.