API testing là gì? Hướng dẫn kiểm thử API cho tester từ đầu
Giao diện chỉ là lớp vỏ. Phần lớn logic nghiệp vụ — và phần lớn lỗi nghiêm trọng — nằm ở tầng API bên dưới. Tester biết test API phát hiện lỗi sớm hơn, chính xác hơn và ít phụ thuộc vào việc giao diện đã làm xong hay chưa.
API là gì và API testing là gì?
API (Application Programming Interface) là giao diện để các phần mềm trao đổi dữ liệu với nhau. Khi bạn bấm "Đăng nhập" trên trình duyệt, giao diện không tự kiểm tra mật khẩu — nó gửi một request tới API của máy chủ, và máy chủ trả về kết quả.
API testing là kiểm thử trực tiếp ở tầng giao tiếp này: gửi request với dữ liệu do bạn kiểm soát và kiểm chứng response trả về có đúng cấu trúc, đúng giá trị, đúng mã trạng thái và đúng quy tắc nghiệp vụ hay không — bỏ qua hoàn toàn lớp giao diện.
Vì sao nên test API
- Phát hiện lỗi sớm hơn: API thường xong trước giao diện, nên bạn không phải chờ.
- Chính xác hơn: khi test fail, bạn biết ngay lỗi ở tầng dịch vụ chứ không phải đoán giữa giao diện, mạng và máy chủ.
- Nhanh và ổn định hơn: một lời gọi API chạy trong mili-giây và không vỡ vì đổi màu nút bấm.
- Bắt được lớp lỗi mà giao diện che giấu: giao diện có thể chặn nhập dữ liệu xấu, nhưng máy chủ thì sao?
Đọc hiểu một request và response
Trước khi test được API, bạn phải đọc được bốn thành phần của request và ba thành phần của response.
Cấu trúc request
| Thành phần | Vai trò | Ví dụ |
|---|---|---|
| Method | Hành động muốn thực hiện | GET, POST, PUT, PATCH, DELETE |
| URL / Endpoint | Tài nguyên đích | https://api.example.com/v1/orders/1024 |
| Headers | Thông tin phụ trợ: xác thực, kiểu dữ liệu | Authorization: Bearer eyJ… — Content-Type: application/json |
| Body | Dữ liệu gửi lên (với POST/PUT/PATCH) | { "quantity": 3 } |
Cấu trúc response
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1024,
"status": "confirmed",
"quantity": 3,
"total": 450000,
"createdAt": "2026-09-07T10:22:31Z"
}Ba thứ cần kiểm tra ở mỗi response: mã trạng thái (status code), header (đặc biệt là Content-Type và các header bảo mật), và body (cấu trúc, kiểu dữ liệu, giá trị).
Bảng status code tester cần thuộc
| Mã | Ý nghĩa | Khi nào đúng là mã này |
|---|---|---|
| 200 OK | Thành công | GET, PUT, PATCH, DELETE hoàn tất bình thường |
| 201 Created | Đã tạo tài nguyên mới | POST tạo mới thành công |
| 204 No Content | Thành công, không có nội dung trả về | DELETE thành công |
| 400 Bad Request | Dữ liệu gửi lên sai định dạng hoặc thiếu | Thiếu trường bắt buộc, sai kiểu dữ liệu |
| 401 Unauthorized | Chưa xác thực | Thiếu token, token hết hạn hoặc không hợp lệ |
| 403 Forbidden | Đã xác thực nhưng không có quyền | Người dùng thường gọi API của quản trị viên |
| 404 Not Found | Không tìm thấy tài nguyên | ID không tồn tại |
| 409 Conflict | Xung đột trạng thái | Tạo trùng email đã đăng ký |
| 422 Unprocessable | Đúng định dạng nhưng vi phạm quy tắc nghiệp vụ | Ngày kết thúc trước ngày bắt đầu |
| 429 Too Many Requests | Vượt giới hạn tần suất | Gọi quá nhiều lần trong thời gian ngắn |
| 500 Internal Server Error | Lỗi phía máy chủ | Luôn luôn là bug — không có ngoại lệ |
Checklist thiết kế test case cho một API
1. Đường đi đúng (Happy path)
- Request hợp lệ trả về đúng status code và đúng dữ liệu.
- Cấu trúc response đúng như tài liệu đặc tả: đủ trường, đúng kiểu dữ liệu.
- Dữ liệu thực sự được ghi vào cơ sở dữ liệu — kiểm chứng bằng truy vấn SQL hoặc một API GET.
2. Dữ liệu không hợp lệ
- Thiếu trường bắt buộc.
- Sai kiểu dữ liệu: gửi chuỗi vào trường số, gửi số âm vào số lượng.
- Giá trị biên: 0, số âm, độ dài tối đa, độ dài tối đa cộng một.
- Body rỗng, body không phải JSON hợp lệ.
- Trường thừa không có trong đặc tả — API nên bỏ qua hay báo lỗi?
- Ký tự đặc biệt, emoji, chuỗi Unicode dài, chuỗi có dấu tiếng Việt.
3. Xác thực và phân quyền
- Gọi API mà không gửi token.
- Gửi token đã hết hạn, token sai định dạng, token của môi trường khác.
- Người dùng A truy cập tài nguyên của người dùng B bằng cách đổi ID trên URL.
- Người dùng thường gọi endpoint dành cho quản trị viên.
4. Trạng thái và nghiệp vụ
- Gọi hành động không hợp lệ với trạng thái hiện tại: huỷ một đơn đã giao xong.
- Gửi cùng một request hai lần — có tạo ra hai bản ghi trùng không?
- Thao tác đồng thời: hai request cùng trừ kho của sản phẩm còn 1 cái.
Công cụ và cách bắt đầu
- DevTools của trình duyệt — tab Network: miễn phí, luôn có sẵn, là nơi tốt nhất để bắt đầu quan sát request thật do chính ứng dụng gửi đi.
- Postman hoặc Insomnia: gửi request thủ công, lưu bộ sưu tập, thiết lập biến môi trường.
- cURL: hữu ích khi cần chia sẻ một lệnh tái hiện lỗi trong bug report.
- Playwright hoặc REST-assured: tự động hoá kiểm thử API trong pipeline.
# Gửi một request POST kèm token — dạng đưa vào bug report rất tiện
curl -X POST https://api.example.com/v1/orders \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"productId": 88, "quantity": -3}'
# Kỳ vọng: 400 Bad Request kèm thông báo về quantity
# Thực tế: 500 Internal Server Error <-- bugCâu hỏi thường gặp
Test API có cần biết lập trình không?
Ở mức thủ công bằng Postman thì không cần. Bạn chỉ cần hiểu HTTP, đọc được JSON và biết thiết kế test case. Kỹ năng lập trình trở nên cần thiết khi bạn muốn tự động hoá bộ test API và đưa vào pipeline CI.
Nên test API hay test giao diện trước?
Test API trước khi có thể, vì API thường hoàn thành sớm hơn giao diện và cho phản hồi nhanh, chính xác hơn. Test giao diện vẫn cần thiết cho luồng người dùng đầu cuối, nhưng nên giữ số lượng ít và tập trung vào các luồng quan trọng nhất.
API trả về status code 200 nhưng dữ liệu sai thì tính là lỗi gì?
Đó là lỗi nghiệp vụ và thường nghiêm trọng hơn lỗi mã trạng thái, vì hệ thống báo thành công trong khi kết quả sai. Đây là lý do không được dừng ở việc kiểm tra status code — luôn phải kiểm chứng cả nội dung body và dữ liệu thực tế trong cơ sở dữ liệu.
Contract testing là gì?
Là kiểm thử xem response của API có đúng cấu trúc đã cam kết hay không: đủ trường, đúng kiểu dữ liệu, đúng định dạng. Nó bắt được lớp lỗi rất khó chịu khi một dịch vụ âm thầm đổi tên trường hoặc đổi kiểu dữ liệu và làm hỏng mọi bên đang gọi nó.