CYBERSOFT
Đăng nhập

Nền tảng k6: kiểm thử tải, VU và script đầu tiên

Chuyên công nghệk6/PerfNền tảng
🗓 1 tháng trước19 phút đọc·👁 1,182 lượt xem👤 455 người đọc

Vì sao cần kiểm thử tải, khái niệm VU/throughput/latency, viết script k6 đầu tiên với http.get + check + sleep, dùng options/stages, đọc summary (throughput, p95, error rate) và phân loại smoke/load/stress/spike/soak — trên domain fintech.

1. Vì sao cần kiểm thử tải và k6 giải bài toán gì

Một hệ thống fintech có thể chạy mượt khi một người kiểm thử bấm thử, nhưng sụp đổ vào lúc 9 giờ sáng ngày lương về khi hàng chục nghìn người cùng đăng nhập, chuyển khoản và tra soát. Kiểm thử chức năng chỉ trả lời câu hỏi 'tính năng có đúng không', còn kiểm thử tải (load testing) trả lời một câu hỏi khác hẳn: 'hệ thống chịu được bao nhiêu người dùng cùng lúc trước khi chậm hoặc lỗi'. Đây là loại rủi ro không thể phát hiện bằng cách click tay, vì nó chỉ xuất hiện khi có áp lực đồng thời thật sự.

k6 (nay là Grafana k6) là công cụ mã nguồn mở để viết và chạy kiểm thử tải bằng cách mô phỏng nhiều người dùng ảo. Điểm mạnh của k6 là kịch bản test được viết bằng JavaScript nhưng nhân chạy bằng Go, nên vừa dễ viết vừa nhẹ tài nguyên, cho phép sinh hàng nghìn người dùng ảo trên một máy khiêm tốn. Trong tài liệu này chúng ta sẽ đi từ khái niệm gốc đến script đầu tiên, rồi tới cách đọc kết quả một cách chuyên nghiệp.

Mô hình Virtual User (VU) trong k6 VU 1 VU 2 iteration → sleep iteration → sleep default fn http.get → check SUT / server đo latency + throughput Mỗi VU là một luồng độc lập lặp default function; tổng VU × tần suất = tải áp lên hệ thống
Mỗi VU lặp default function và tạo tải lên hệ thống
Kiểm thử tải KHÔNG thay thế kiểm thử chức năng — nó bổ sung một chiều rủi ro mới: hiệu năng dưới áp lực.

2. Các khái niệm cốt lõi: VU, iteration, throughput, latency

Trước khi viết dòng code nào, cần nắm bốn khái niệm nền. Một Virtual User (VU) là một luồng độc lập trong k6, lặp đi lặp lại kịch bản của bạn giống như một người dùng thật. Một iteration là một lần chạy trọn vẹn default function. Throughput (thông lượng) là số request hệ thống phục vụ được mỗi giây — thước đo công suất. Latency (độ trễ) là thời gian một request từ lúc gửi tới lúc nhận đủ phản hồi — thước đo trải nghiệm.

Điều quan trọng và hay bị hiểu lầm: nhiều VU không tự động nghĩa là nhiều throughput. Nếu server chậm, mỗi VU phải chờ lâu hơn cho mỗi iteration, nên số request/giây thực tế lại giảm. Vì vậy chuyên gia hiệu năng không nói 'chúng tôi chạy 500 VU' như một mục tiêu, mà nói 'chúng tôi đạt X request/giây với p95 latency Y'. Con số phần trăm (percentile) như p95 hay p99 quan trọng hơn giá trị trung bình, vì trung bình che giấu những người dùng bị chậm nhất — mà chính họ mới là người phàn nàn.

  • VU — người dùng ảo, một luồng lặp kịch bản
  • iteration — một lần chạy trọn default function
  • throughput — req/s hệ thống phục vụ được
  • latency — thời gian request; đọc theo p95/p99, không chỉ trung bình
  • error rate — tỉ lệ request thất bại dưới tải
💡 Khi báo cáo hiệu năng, luôn kèm percentile và điều kiện tải: 'p95 = 420ms tại 1000 req/s' rõ ràng hơn 'trung bình 200ms'.

3. Cài đặt k6 và cấu trúc một script tối thiểu

k6 là một tệp nhị phân độc lập, cài bằng trình quản lý gói của hệ điều hành (Homebrew trên macOS, apt trên Debian/Ubuntu, Chocolatey trên Windows) hoặc chạy qua Docker. Một script k6 luôn có hai phần bắt buộc để chạy được: một hàm mặc định (default function) chứa hành vi mỗi VU sẽ lặp, và (tùy chọn nhưng gần như luôn dùng) một đối tượng options khai báo cách áp tải.

bash
# Cài đặt k6
brew install k6                 # macOS
sudo apt-get install k6         # Debian/Ubuntu (sau khi thêm repo Grafana)
choco install k6                # Windows

# Chạy một script
k6 run script.js

# Chạy qua Docker, ghi đè số VU và thời lượng qua CLI
docker run --rm -i grafana/k6 run - <script.js
k6 run --vus 50 --duration 30s script.js
javascript
// script.js — script k6 tối thiểu tuyệt đối
import http from 'k6/http';
import { sleep } from 'k6';

// Hàm mặc định: MỖI VU lặp lại thân hàm này liên tục
export default function () {
  http.get('https://test.k6.io');   // gửi 1 GET request
  sleep(1);                         // "think time" — nghỉ 1 giây như người thật
}
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 25% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!