DEV Community

Cover image for Cách sử dụng truy vấn cơ sở dữ liệu trong kiểm thử API với Apidog (MySQL, MongoDB, Redis)
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Cách sử dụng truy vấn cơ sở dữ liệu trong kiểm thử API với Apidog (MySQL, MongoDB, Redis)

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.

Dùng thử Apidog ngay hôm nay

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 ConnectionsDatabase 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 status khô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:

  1. 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.
  2. 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.
  3. 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.internal hoặc 127.0.0.1
  • Port: MySQL mặc định là 3306
  • UsernamePassword
  • Database Name: ví dụ shop

Cấu hình Database Connection trong Apidog

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.
  • Require
  • Verify CA
  • Verify 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 '...';
Enter fullscreen mode Exit fullscreen mode

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:

  1. Mở Pre Processors.
  2. Chọn Add Database Processor.
  3. Chọn Database operation.
  4. Đặt tên, ví dụ seed customer.
  5. Chọn kết nối MySQL.
  6. Nhập SQL:
INSERT INTO customers (id, email, status)
VALUES ({{customer_id}}, '{{customer_email}}', 'active')
ON DUPLICATE KEY UPDATE status = 'active';
Enter fullscreen mode Exit fullscreen mode

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 }]
}
Enter fullscreen mode Exit fullscreen mode

Giả sử response trả về ID đơn hàng và bạn đã lưu nó vào biến order_id.

Tiếp theo:

  1. Mở Post Processors.
    • Trong Design Mode: vào tab Run.
    • Trong Debug Mode: vào tab Request.
  2. Chọn Add PostProcessor > Database operation.
  3. Đặt tên verify order row.
  4. Chọn database connection.
  5. Chạy truy vấn:
SELECT id, status, total_cents
FROM orders
WHERE id = {{order_id}};
Enter fullscreen mode Exit fullscreen mode

Kết quả truy vấn là một mảng object. Để lấy status của hàng đầu tiên:

  1. Mở Extract Results (Optional).
  2. Chọn Extract Result To Variable.
  3. Đặt Variable Namedb_order_status.
  4. Nhập JSONPath:
$[0].status
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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}}
Enter fullscreen mode Exit fullscreen mode

Trong Post Processor của request tạo đơn hàng, chạy:

SELECT fulfillment_ref
FROM orders
WHERE id = {{order_id}};
Enter fullscreen mode Exit fullscreen mode

Sau đó cấu hình:

  • Variable Name: fulfillment_ref
  • JSONPath Expression:
$[0].fulfillment_ref
Enter fullscreen mode Exit fullscreen mode

Request tiếp theo chỉ cần tham chiếu:

{{fulfillment_ref}}
Enter fullscreen mode Exit fullscreen mode

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" }
Enter fullscreen mode Exit fullscreen mode

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(...)
Enter fullscreen mode Exit fullscreen mode

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ợ:

  • GET
  • SET
  • DELETE

Ví dụ, đọc session cache:

Key: user:session:123
Operation: GET
Enter fullscreen mode Exit fullscreen mode

Nếu cần chạy lệnh không có trong danh sách, dùng tab Run Redis Command:

KEYS user:*
Enter fullscreen mode Exit fullscreen mode

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}}
Enter fullscreen mode Exit fullscreen mode

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 ...
Enter fullscreen mode Exit fullscreen mode

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:

  • local
  • staging
  • production nế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>
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ý nghĩa tham số:

  • -t: ID kịch bản kiểm thử.
  • -e: ID môi trường.
  • -r: reporter, hỗ trợ cli, html hoặc junit.

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Sau đó dùng biến trong request tiếp theo:

{{fulfillment_ref}}
Enter fullscreen mode Exit fullscreen mode

Đồ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 '...';
Enter fullscreen mode Exit fullscreen mode

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, UPDATEDELETE.

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:

  1. Dùng Pre Processor để tạo trạng thái dữ liệu đã biết.
  2. Gọi API cần kiểm thử.
  3. Dùng Post Processor để đọc lại bản ghi.
  4. Trích xuất giá trị database nếu request tiếp theo cần dùng.
  5. Tạo connection riêng cho local, staging và các môi trường khác.
  6. 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)