Kiểm thử tải k6: Cẩm nang thực tế cho API

Hướng dẫn thực hành kiểm thử tải k6: cài đặt k6, viết tập lệnh đầu tiên của bạn, thiết lập VUs, các giai đoạn và ngưỡng, đọc kết quả p95/p99, và chạy nó trong CI.

Ashley Goolam

Ashley Goolam

25 tháng 6 2026

Kiểm thử tải k6: Cẩm nang thực tế cho API

Apidog cho doanh nghiệp

Triển khai tại chỗ

SSO & RBAC

Tuân thủ SOC 2

Khám phá Apidog Enterprise

Nếu API của bạn hoạt động tốt cho một người dùng nhưng lại gặp sự cố khi có nhiều lưu lượng truy cập, bạn cần kiểm thử tải, và k6 là một trong những cách sạch sẽ nhất để thực hiện điều đó. Hướng dẫn này sẽ trình bày k6 là gì, cách cài đặt, cách viết script đầu tiên và cách đọc kết quả, để bạn có thể coi kiểm thử tải là một phần của quy trình kiểm thử hiệu suất API thông thường của mình. Chúng ta cũng sẽ xem xét cách k6 phù hợp với kiểm thử chức năng trong CI, dựa trên tài liệu k6 chính thức nơi các chi tiết quan trọng.

k6 là gì?

k6 là một công cụ kiểm thử tải mã nguồn mở, hiện được duy trì bởi Grafana. Bạn viết bài kiểm thử của mình dưới dạng một tệp JavaScript, k6 chạy nó bằng một công cụ Go nhanh, và nó tấn công các điểm cuối của bạn bằng lưu lượng truy cập mô phỏng. Sự phân chia này là có chủ ý: bạn viết các bài kiểm thử bằng một ngôn ngữ mà hầu hết các nhà phát triển đã biết, nhưng trình tạo tải chạy dưới dạng Go đã biên dịch, vì vậy một máy đơn có thể điều khiển nhiều người dùng ảo mà không bị tắc nghẽn.

k6 được xây dựng cho một nhiệm vụ và thực hiện nó rất tốt: tạo ra tải liên tục, có thể lặp lại và đo lường cách hệ thống của bạn phản ứng. Nó báo cáo phần trăm độ trễ, tốc độ yêu cầu, tỷ lệ lỗi và cho phép bạn đặt các quy tắc đạt/không đạt dựa trên các con số đó. Sự tập trung đó là điểm mấu chốt. k6 không phải là một ứng dụng khách API, một công cụ tài liệu hay một khung kiểm thử chức năng. Nó là một công cụ tạo tải.

Một vài thuật ngữ bạn sẽ thường xuyên gặp:

Cài đặt k6

k6 được phân phối dưới dạng một tệp nhị phân duy nhất, vì vậy việc cài đặt rất nhanh chóng. Trên macOS với Homebrew:

brew install k6

Trên Windows với Chocolatey:

choco install k6

Trên Debian hoặc Ubuntu, thêm kho lưu trữ apt của Grafana và cài đặt:

sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg \
  --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" \
  | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

Xác nhận nó hoạt động:

k6 version

Một image Docker cũng có sẵn nếu bạn không muốn cài đặt bất cứ thứ gì cục bộ. Hãy kiểm tra trang cài đặt trong tài liệu để biết các lệnh hiện tại, vì chi tiết gói có thể thay đổi theo thời gian.

Script k6 đầu tiên của bạn

Một bài kiểm thử k6 là một module JavaScript với một hàm mặc định. k6 gọi hàm đó một lần cho mỗi lần lặp, cho mỗi VU. Dưới đây là một script tối thiểu truy cập một điểm cuối và kiểm tra phản hồi:

import http from 'k6/http';
import { check, sleep } from 'k6';

export default function () {
  const res = http.get('https://test-api.example.com/users');

  check(res, {
    'status is 200': (r) => r.status === 200,
    'body is not empty': (r) => r.body.length > 0,
  });

  sleep(1);
}

Lưu nó dưới dạng script.js và chạy nó:

k6 run script.js

Theo mặc định, k6 chạy một VU cho một lần lặp. `sleep(1)` đó thêm một giây tạm dừng giữa các lần lặp, mô phỏng người dùng thực đang tạm dừng giữa các hành động. Không có sleep, mỗi VU lặp lại nhanh nhất có thể theo mạng, điều này hữu ích cho các bài kiểm thử thông lượng thô nhưng không thực tế cho mô phỏng hành vi người dùng.

Các lệnh gọi `check()` là các xác nhận mềm. Một kiểm tra thất bại sẽ hiển thị trong phần tóm tắt nhưng không dừng quá trình chạy. Điều đó là có chủ ý. Dưới tải nặng, bạn mong đợi một số lỗi, và bạn muốn bài kiểm thử tiếp tục đo lường để bạn có thể thấy mức độ tồi tệ của nó.

VU, các giai đoạn và ngưỡng

Script đầu tiên chỉ chạy một người dùng một lần. Kiểm thử tải thực tế là về việc kiểm soát số lượng người dùng truy cập API của bạn và trong bao lâu. Bạn cấu hình điều đó bằng một đối tượng `options` được xuất.

Dạng đơn giản nhất đặt số lượng VU cố định và thời lượng:

export const options = {
  vus: 50,
  duration: '30s',
};

Điều đó chạy 50 người dùng ảo trong 30 giây. Hữu ích hơn là một hồ sơ tăng dần được xây dựng từ các giai đoạn, cho phép bạn mô phỏng lưu lượng truy cập tăng lên, giữ ổn định và giảm xuống:

export const options = {
  stages: [
    { duration: '1m', target: 100 },  // tăng lên 100 VU
    { duration: '3m', target: 100 },  // giữ ở 100 VU
    { duration: '1m', target: 0 },    // giảm xuống 0
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],   // 95% yêu cầu dưới 500ms
    http_req_failed: ['rate<0.01'],     // ít hơn 1% lỗi
  },
};

Ngưỡng là nơi k6 khẳng định vị trí của mình trong CI. Nếu một ngưỡng thất bại, k6 sẽ thoát với mã không bằng không. Điều đó có nghĩa là một bước trong pipeline có thể làm hỏng bản dựng khi độ trễ hoặc tỷ lệ lỗi vượt quá một ngưỡng bạn đã đặt. Bạn đang mã hóa một ngân sách hiệu suất dưới dạng mã, giống như cách bạn mã hóa một xác nhận chức năng.

Sơ đồ nhanh về các hồ sơ tải phổ biến và câu hỏi mà mỗi hồ sơ trả lời:

Hồ sơ Mục tiêu Điều nó cho bạn biết
Kiểm thử khói (Smoke) Tải nhỏ, xác minh script chạy Bản thân bài kiểm thử là chính xác
Tải (Load) Lưu lượng truy cập bình thường dự kiến API có duy trì hoạt động tốt hàng ngày không
Kiểm thử áp lực (Stress) Đẩy qua mức đỉnh dự kiến Nó bắt đầu hỏng ở đâu
Đột biến (Spike) Tăng đột ngột số lượng VU Nó có thể sống sót sau một đợt tăng lưu lượng truy cập không
Ngâm (Soak) Tải vừa phải trong nhiều giờ Rò rỉ bộ nhớ, suy giảm chậm

Bạn không cần cả năm loại. Bắt đầu với kiểm thử khói và tải. Thêm kiểm thử áp lực và đột biến khi bạn đã biết các con số bình thường của mình. Để có một cái nhìn tổng quan rộng hơn về các phương pháp và các chỉ số đằng sau chúng, các nguyên tắc cơ bản của kiểm thử hiệu suất áp dụng cho mọi công cụ, không chỉ riêng k6.

Đọc kết quả k6

Khi một lần chạy kết thúc, k6 in một bản tóm tắt ra terminal. Các dòng quan trọng nhất:

Hãy đọc các phần trăm, không phải giá trị trung bình. Thời gian phản hồi trung bình 200ms nghe có vẻ ổn cho đến khi bạn thấy p99 là 4 giây, có nghĩa là một trong một trăm người dùng phải chờ bốn giây. Phần đuôi đó là nơi người dùng bỏ đi.

Đối với bất kỳ điều gì vượt xa việc chỉ nhìn vào terminal, k6 có thể truyền kết quả đến các đầu ra bên ngoài. Nó ghi ra JSON hoặc CSV, và tích hợp với bảng điều khiển Grafana và Prometheus để phân tích trực quan, trực tiếp trong quá trình chạy. Sự kết hợp đó, k6 cộng với Grafana, là lý do tại sao bạn thường thấy công cụ này được gọi là “grafana k6.” Đối với một bài kiểm thử một lần, bản tóm tắt trên terminal là đủ; đối với việc giám sát liên tục, hãy gửi các chỉ số đến nơi bạn có thể biểu đồ hóa chúng.

Vị trí của k6 và vị trí của Apidog

k6 là một công cụ tạo tải. Nó trả lời câu hỏi “hệ thống của tôi hoạt động như thế nào dưới lưu lượng truy cập liên tục.” Nó không kiểm tra xem API của bạn có trả về đúng dữ liệu, có khớp với hợp đồng hay xử lý xác thực chính xác trên mọi điểm cuối hay không. Đó là các câu hỏi kiểm thử chức năng và hợp đồng, và chúng cần một công cụ khác.

Đây là sự phân chia đáng được làm rõ. Bạn muốn cả hai loại kiểm thử trong pipeline của mình, và chúng không cạnh tranh nhau:

Mối quan tâm Được xử lý tốt nhất bởi Điều nó trả lời
Tải nặng liên tục, phần trăm ở quy mô lớn k6 Nó có duy trì tốc độ dưới lưu lượng truy cập không
Tính đúng đắn chức năng, hợp đồng, xác thực Apidog Nó có trả về đúng thứ không
Hồi quy trong CI trên mỗi commit Apidog (apidog run) Thay đổi này có làm hỏng một điểm cuối không
Ngân sách hiệu suất trong CI Ngưỡng của k6 Độ trễ hoặc lỗi có vượt quá giới hạn không

Apidog xử lý khía cạnh chính xác. Bạn thiết kế hoặc nhập API của mình, xây dựng các kịch bản kiểm thử với các xác nhận trực quan và chạy chúng trong CI bằng apidog run, giống như cách bạn chạy một script k6. Hướng dẫn CLI của Apidog sẽ hướng dẫn cách tích hợp các kiểm thử chức năng đó vào một pipeline. Apidog cũng bao gồm các tính năng kiểm thử hiệu suất nhẹ hơn để kiểm tra nhanh, được trình bày trong hướng dẫn kiểm thử hiệu suất API trong Apidog, nhưng nó không phải là một trình tạo tải đẳng cấp k6 và cũng không cố gắng trở thành như vậy.

Một quy trình làm việc thực tế trông như thế này. Trên mỗi commit, Apidog chạy các kiểm thử chức năng và hợp đồng của bạn để xác nhận API vẫn hoạt động đúng như mong đợi. Theo lịch trình hoặc trước khi phát hành, k6 chạy một hồ sơ tải đối với môi trường staging để xác nhận API duy trì tốc độ dưới lưu lượng truy cập. Cổng kiểm tra tính đúng đắn và cổng kiểm tra hiệu suất, mỗi cái đều có công cụ được xây dựng riêng cho nó.

Nếu bạn đang so sánh các công cụ trước khi quyết định, k6 đứng cạnh JMeter, Gatling và Locust. Tổng quan về các công cụ kiểm thử tảiso sánh các lựa chọn thay thế Locust này sẽ trình bày những đánh đổi nếu ngôn ngữ script hoặc quy mô thay đổi lựa chọn của bạn.

Các câu hỏi thường gặp

k6 có miễn phí không?

Có. k6 là mã nguồn mở theo giấy phép AGPL, và tệp nhị phân miễn phí để chạy cục bộ mà không giới hạn số lượng người dùng ảo ngoài khả năng phần cứng của bạn. Grafana cũng cung cấp k6 Cloud, một dịch vụ trả phí để chạy các bài kiểm thử phân tán lớn và lưu trữ kết quả, nhưng bạn không bao giờ phải sử dụng nó. Công cụ cốt lõi đáp ứng hầu hết các nhóm. Nếu bạn muốn xem xét các lựa chọn miễn phí khác trước, tổng quan về các công cụ kiểm thử tải liệt kê những gì mỗi công cụ cung cấp.

Tôi có cần biết JavaScript để sử dụng k6 không?

Bạn chỉ cần kiến thức JavaScript cơ bản, không cần chuyên môn sâu. Hầu hết các script k6 là một hàm mặc định, một số lệnh gọi `http.get` hoặc `http.post`, một vài kiểm tra và một đối tượng tùy chọn. Nếu bạn có thể đọc các ví dụ trong hướng dẫn này, bạn có thể viết một bài kiểm thử hoạt động. Không có bước xây dựng và không có framework nào để học, chỉ cần API của k6.

Sự khác biệt giữa k6 và Apidog trong kiểm thử hiệu suất là gì?

k6 là một trình tạo tải chuyên dụng được xây dựng để điều khiển lưu lượng truy cập nặng liên tục và báo cáo phần trăm ở quy mô lớn. Apidog là một nền tảng API tập trung vào thiết kế, kiểm thử chức năng và kiểm thử hợp đồng, với các tính năng kiểm thử hiệu suất nhẹ hơn để kiểm tra nhanh. Sử dụng k6 khi bạn cần tải thực tế và ngân sách hiệu suất CI. Sử dụng Apidog cho tính đúng đắn, xác thực hợp đồng và chạy các kiểm thử chức năng trên mỗi commit. Chúng giải quyết các vấn đề khác nhau và hoạt động tốt cùng nhau.

Tôi có thể chạy k6 trong CI/CD không?

Có, và đó là một thiết lập phổ biến. k6 thoát với mã không bằng không khi một ngưỡng thất bại, vì vậy bất kỳ hệ thống CI nào cũng có thể làm hỏng bản dựng nếu có sự suy giảm hiệu suất. Chạy `k6 run script.js` như một bước trong pipeline, trỏ nó đến một môi trường staging và đặt ngưỡng cho độ trễ p95 và tỷ lệ lỗi. Kết hợp nó với các kiểm thử chức năng từ `apidog run` để mỗi commit đều nhận được cả kiểm tra tính đúng đắn và kiểm tra tải.

Kết luận

k6 cung cấp cho bạn một cách sạch sẽ, có thể script được để đặt tải thực tế lên API của bạn và đo lường những gì xảy ra. Cài đặt tệp nhị phân, viết một tệp JavaScript ngắn, thiết lập VU và các giai đoạn, thêm ngưỡng và đọc các phần trăm. Đó là toàn bộ chu trình. Giữ kiểm thử tải tách biệt khỏi kiểm thử chức năng, vì mỗi loại trả lời một câu hỏi khác nhau, và chạy cả hai trong CI để không có gì bị bỏ sót.

Đối với khía cạnh chính xác của sự phân chia đó, Apidog cho phép bạn thiết kế, kiểm thử, mô phỏng và tài liệu hóa API của mình ở một nơi, sau đó chạy các kiểm thử chức năng trong CI với apidog run. Tải xuống Apidog để kết hợp sự tự tin ở cấp độ hợp đồng với các lần chạy tải k6 của bạn.

Tải ứng dụng

Thực hành thiết kế API trong Apidog

Khám phá cách dễ dàng hơn để xây dựng và sử dụng API