Một mã trạng thái xanh có thể gây hiểu lầm. Điểm cuối POST /orders trả về 201 Created, phản hồi trông đúng và bài kiểm thử HTTP đã vượt qua. Nhưng đơn hàng có thực sự được lưu vào cơ sở dữ liệu với trạng thái chính xác không? Hàng tồn kho có giảm không? Kiểm thử chỉ đọc HTTP response xác nhận điều API nói, không xác nhận điều hệ thống đã làm. Muốn kiểm tra điều đó, bạn cần truy vấn cơ sở dữ liệu.
Bạn có thể thiết lập dữ liệu trước khi gọi API, gửi request, rồi đọc lại bảng để xác minh dữ liệu đã được ghi. Apidog hỗ trợ quy trình này bằng Database Connections và Database Operation processor: chạy SQL hoặc NoSQL ngay trong cùng kịch bản với các request HTTP, không cần script bên ngoài. Nếu mới bắt đầu, hãy xem hướng dẫn cách viết kịch bản kiểm thử với Apidog. Để ôn lại cách ứng dụng phía máy chủ làm việc với dữ liệu quan hệ, xem tổng quan phía máy chủ của MDN.
Những lợi ích của thao tác cơ sở dữ liệu trong bài kiểm thử
Kiểm thử API chỉ dựa vào HTTP response là kiểm thử hộp đen. Cách này có thể bỏ sót các lỗi như:
- API trả về thành công nhưng trường
statuskhông được cập nhật. - Bản ghi có khóa ngoại không hợp lệ.
- Logic xóa mềm (
soft delete) lại xóa cứng (hard delete). - API trả về ID hợp lệ nhưng hàng tương ứng không tồn tại trong database.
Thao tác cơ sở dữ liệu giúp bạn thực hiện ba việc:
- Thiết lập dữ liệu đầu vào để test không phụ thuộc dữ liệu còn sót lại.
- Xác minh dữ liệu thực tế bằng cách đọc bản ghi mà API đã tạo hoặc cập nhật.
- Trích xuất dữ liệu từ database để dùng trong request tiếp theo.
Trong Apidog, bạn tạo kết nối tái sử dụng tại Settings > Database Connections, sau đó thêm Database Operation vào request dưới dạng:
- Pre Processor: chạy trước request.
- Post Processor: chạy sau request.
MySQL, SQL Server (2014 trở lên), PostgreSQL và Oracle hoạt động trên gói miễn phí. ClickHouse, MongoDB và Redis là tính năng trả phí. Phần MySQL bên dưới phù hợp với gói miễn phí.
Bước 1: Tạo kết nối cơ sở dữ liệu
Mở Settings > Database Connections và nhấn + New.
Chọn loại database, sau đó nhập:
-
Host: ví dụ
db.staging.internalhoặc127.0.0.1 -
Port: MySQL mặc định là
3306 - Username và Password
-
Database Name: ví dụ
shop
Nếu database nằm sau bastion host, mở phần SSH Tunnel và cấu hình jump host.
Với MySQL, bạn có thể chọn SSL mode:
-
Prefer: thử SSL, sau đó fallback nếu không khả dụng. RequireVerify CAVerify Full
Ưu tiên chế độ nghiêm ngặt nhất mà máy chủ hỗ trợ, rồi nhấn Save.
Xử lý lỗi kết nối MySQL 8
MySQL 8 dùng plugin xác thực caching_sha2_password theo mặc định. Nếu kết nối bị từ chối do xác thực, có thể chuyển người dùng sang mysql_native_password:
ALTER USER 'tester'@'%'
IDENTIFIED WITH mysql_native_password BY '...';
Xem thêm trong MySQL Reference Manual.
Thông tin kết nối được lưu trên máy cục bộ và không đồng bộ lên cloud. Mỗi thành viên cần tự cấu hình kết nối. Xem thêm hướng dẫn chia sẻ cài đặt kết nối cơ sở dữ liệu.
Bước 2: Nạp dữ liệu bằng Pre Processor
Giả sử bạn kiểm thử API tạo đơn hàng. Trước khi gửi request, hãy đảm bảo khách hàng đã tồn tại và ở trạng thái hoạt động.
Trong request:
- Mở Pre Processors.
- Chọn Add Database Processor.
- Chọn Database operation.
- Đặt tên, ví dụ
seed customer. - Chọn kết nối MySQL.
- Nhập SQL:
INSERT INTO customers (id, email, status)
VALUES ({{customer_id}}, '{{customer_email}}', 'active')
ON DUPLICATE KEY UPDATE status = 'active';
Các biến trong Apidog dùng cú pháp {{variable_name}}.
Kết quả: mỗi lần chạy test, khách hàng cần thiết luôn tồn tại với trạng thái active. Test không còn phụ thuộc vào dữ liệu được tạo bởi lần chạy trước hoặc thứ tự chạy test.
Bước 3: Xác minh dữ liệu bằng Post Processor
Sau khi API tạo đơn hàng, hãy truy vấn bảng orders để kiểm tra bản ghi thực tế.
Request API:
POST /api/orders
Content-Type: application/json
{
"customer_id": {{customer_id}},
"items": [{ "sku": "APRON-01", "qty": 2 }]
}
Giả sử response trả về ID đơn hàng và bạn đã lưu nó vào biến order_id.
Tiếp theo:
- Mở Post Processors.
- Trong Design Mode: vào tab Run.
- Trong Debug Mode: vào tab Request.
- Chọn Add PostProcessor > Database operation.
- Đặt tên
verify order row. - Chọn database connection.
- Chạy truy vấn:
SELECT id, status, total_cents
FROM orders
WHERE id = {{order_id}};
Kết quả truy vấn là một mảng object. Để lấy status của hàng đầu tiên:
- Mở Extract Results (Optional).
- Chọn Extract Result To Variable.
- Đặt Variable Name là
db_order_status. - Nhập JSONPath:
$[0].status
Nhấn Send và kiểm tra Console để xem kết quả query cùng giá trị đã trích xuất.
Bây giờ, thêm assertion cho biến db_order_status:
db_order_status == "pending"
Nếu API trả về 201 Created nhưng database lưu status = 'draft', Post Processor sẽ bắt được lỗi này.
Bước 4: Dùng dữ liệu từ database trong request tiếp theo
Database có thể chứa giá trị nội bộ mà API response không trả về.
Ví dụ: tạo đơn hàng cũng tạo fulfillment_ref, nhưng response không chứa trường này. Request tiếp theo cần giá trị đó:
GET /api/fulfillments/{{fulfillment_ref}}
Trong Post Processor của request tạo đơn hàng, chạy:
SELECT fulfillment_ref
FROM orders
WHERE id = {{order_id}};
Sau đó cấu hình:
-
Variable Name:
fulfillment_ref - JSONPath Expression:
$[0].fulfillment_ref
Request tiếp theo chỉ cần tham chiếu:
{{fulfillment_ref}}
Mẫu này tương tự việc truyền dữ liệu giữa các HTTP request, nhưng nguồn dữ liệu là database. Xem thêm:
MongoDB và Redis: kiểm thử NoSQL
MongoDB và Redis dùng giao diện cấu hình khác SQL. Cả hai là tính năng trả phí. Xem tài liệu Apidog để biết các trường cấu hình đầy đủ.
MongoDB
Thêm Database Operation và chọn MongoDB.
Thay vì SQL, chọn Operation Type:
- Find
- Insert
- Update
- Delete
- Run Database Command
Với các thao tác CRUD, nhập Collection Name và điều kiện JSON trong Query Condition:
{ "_id": "65486728456e79993a150f1c" }
Apidog tự chuyển chuỗi ID phù hợp sang ObjectId.
Khi cần kiểu BSON, bạn có thể dùng các hàm như:
ISODate(...)
ObjectId(...)
NumberDecimal(...)
NumberLong(...)
Xem cách các kiểu này ánh xạ vào dữ liệu lưu trữ trong MongoDB documentation.
Tài liệu MySQL mô tả rõ luồng trích xuất JSONPath vào biến. Với MongoDB và Redis, hãy kiểm tra trực tiếp trong Console trước khi giả định cơ chế trích xuất hoạt động giống SQL.
Redis
Kết nối Redis cần:
- Host
- Port
- Password
- Database Index
Giao diện trực quan hỗ trợ:
GETSETDELETE
Ví dụ, đọc session cache:
Key: user:session:123
Operation: GET
Nếu cần chạy lệnh không có trong danh sách, dùng tab Run Redis Command:
KEYS user:*
Bạn có thể dùng Redis operation để:
- Xác minh API đã ghi cache.
- Xóa cache trước khi test.
- Kiểm tra endpoint có tạo lại cache hay không.
Các biến thể nâng cao và giới hạn
Lặp qua dữ liệu
Khi dùng bước ForEach, tham chiếu phần tử hiện tại bằng:
{{$.StepID.element.field}}
Trong đó StepID là ID thực của bước lặp. Cách này phù hợp để xác minh một bản ghi database cho mỗi phần tử đầu vào.
Rẽ nhánh theo trạng thái database
Trích xuất trạng thái từ database, sau đó dùng logic điều kiện để điều hướng kịch bản:
- Nếu
status = paid, kiểm tra luồng giao hàng. - Nếu
status = pending, kiểm tra luồng thanh toán.
Xem logic điều kiện trong kịch bản kiểm thử API.
Stored procedures
Giao diện trực quan không hỗ trợ các thao tác phức tạp như stored procedure. Nên giữ database step ở các câu lệnh trực tiếp:
SELECT ...
INSERT ...
UPDATE ...
DELETE ...
Oracle
Oracle yêu cầu cài Oracle Client trên máy trước khi kết nối.
Quản lý thông tin đăng nhập theo môi trường
Không nên để test vô tình truy cập dữ liệu production.
Hãy tạo một Database Connection cho mỗi môi trường:
localstaging-
productionnếu quy trình của bạn cho phép kiểm thử tại đó
Mỗi connection có host, username và password riêng.
Sau đó, chọn môi trường từ menu ở góc trên bên phải. Apidog tự định tuyến query đến connection tương ứng:
- Chọn
staging: query chạy trên staging database. - Chọn
local: cùng query chạy trên database máy cục bộ.
Bạn không cần sửa SQL giữa các môi trường.
Vì thông tin đăng nhập được lưu cục bộ, mật khẩu production không bị đồng bộ vào dự án cloud dùng chung. Mỗi kỹ sư quản lý thông tin đăng nhập của riêng mình.
Chạy kiểm thử trong CI với Apidog CLI
Sau khi scenario chạy ổn trong ứng dụng, chạy không giao diện trong CI để pull request xác minh cả HTTP contract lẫn dữ liệu database.
Cài CLI và đăng nhập:
npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>
Chạy scenario theo ID và môi trường:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli
Ý nghĩa tham số:
-
-t: ID kịch bản kiểm thử. -
-e: ID môi trường. -
-r: reporter, hỗ trợcli,htmlhoặcjunit.
Dùng nhiều reporter bằng dấu phẩy:
apidog run --access-token $APIDOG_ACCESS_TOKEN \
-t <scenario_id> \
-e <env_id> \
-r html,cli
Database connection được lưu cục bộ, vì vậy CI runner cần cấu hình đã xuất để truy cập database của bạn.
Nếu chạy scenario theo bộ dữ liệu, xem kiểm thử dựa trên dữ liệu với Apidog CLI. Để chạy theo lịch, xem lên lịch kiểm thử API với Apidog.
Câu hỏi thường gặp
Database nào miễn phí?
MySQL, SQL Server 2014 trở lên, PostgreSQL và Oracle có trong gói miễn phí.
ClickHouse, MongoDB và Redis cần gói trả phí. Bạn có thể tải Apidog để thử với các database miễn phí.
Có thể dùng giá trị từ database trong request sau không?
Có. Chạy SELECT trong Post Processor, sau đó dùng Extract Result To Variable với JSONPath, ví dụ:
$[0].fulfillment_ref
Sau đó dùng biến trong request tiếp theo:
{{fulfillment_ref}}
Đồng đội có tự nhận được database connection không?
Không. Connection credentials được lưu trên từng máy và không đồng bộ lên cloud. Mỗi thành viên cần tự cấu hình kết nối.
Vì sao MySQL 8 không kết nối được?
Nguyên nhân thường gặp là plugin caching_sha2_password. Nếu cần, chuyển user sang mysql_native_password:
ALTER USER 'tester'@'%'
IDENTIFIED WITH mysql_native_password BY '...';
Có thể chạy stored procedure không?
Không qua giao diện trực quan. Hãy dùng các câu lệnh SQL trực tiếp như SELECT, INSERT, UPDATE và DELETE.
Tóm lại
Database query biến kiểm thử API từ:
“Response trông đúng.”
thành:
“Dữ liệu thực sự chính xác.”
Quy trình triển khai cơ bản:
- Dùng Pre Processor để tạo trạng thái dữ liệu đã biết.
- Gọi API cần kiểm thử.
- Dùng Post Processor để đọc lại bản ghi.
- Trích xuất giá trị database nếu request tiếp theo cần dùng.
- Tạo connection riêng cho
local,stagingvà các môi trường khác. - Chạy scenario bằng CLI trong CI.
Bắt đầu với một database MySQL phát triển: tải Apidog, tạo connection, rồi thêm Post Processor để đọc lại bản ghi mà API vừa tạo.

Top comments (0)