Kiểm thử hiệu năng là gì? Load test, stress test và các chỉ số cần đọc
Một hệ thống chạy hoàn hảo với một người dùng có thể sập hoàn toàn với năm nghìn người. Kiểm thử hiệu năng trả lời câu hỏi mà kiểm thử chức năng không chạm tới: hệ thống chịu được đến đâu, và khi vượt ngưỡng thì nó hỏng theo cách nào.
Kiểm thử hiệu năng là gì?
Kiểm thử hiệu năng là nhóm kiểm thử phi chức năng đánh giá tốc độ, khả năng chịu tải, độ ổn định và khả năng mở rộng của hệ thống dưới một khối lượng công việc xác định. Nó không hỏi "chức năng có đúng không" mà hỏi "chức năng đó còn đúng và còn nhanh khi có bao nhiêu người dùng cùng lúc".
| Loại | Kịch bản tải | Câu hỏi trả lời |
|---|---|---|
| Load test | Tải dự kiến trong điều kiện bình thường | Hệ thống có đáp ứng được lượng người dùng thực tế không? |
| Stress test | Tăng tải dần đến khi hệ thống hỏng | Điểm gãy nằm ở đâu, và hỏng theo cách nào? |
| Spike test | Tăng đột ngột rồi giảm đột ngột | Hệ thống chịu được đợt truy cập bất ngờ không (flash sale, tin nóng)? |
| Soak test | Tải vừa phải kéo dài nhiều giờ | Có rò rỉ bộ nhớ hay suy giảm dần theo thời gian không? |
Các chỉ số phải biết đọc
| Chỉ số | Ý nghĩa | Điều cần chú ý |
|---|---|---|
| Response time | Thời gian từ lúc gửi yêu cầu đến khi nhận đủ phản hồi | Đọc theo percentile, không đọc trung bình |
| Throughput | Số yêu cầu xử lý được mỗi giây | Tăng tải mà throughput không tăng nghĩa là đã bão hoà |
| Error rate | Tỉ lệ yêu cầu lỗi | Tăng vọt là dấu hiệu đã vượt ngưỡng chịu tải |
| Concurrent users | Số người dùng đồng thời | Khác với tổng số người dùng — đây là số đang hoạt động cùng lúc |
| Tài nguyên máy chủ | CPU, RAM, I/O, số kết nối cơ sở dữ liệu | Nơi chỉ ra nút thắt thực sự nằm ở đâu |
Percentile đọc như sau: p95 = 800ms nghĩa là 95% yêu cầu hoàn thành trong vòng 800ms, 5% chậm hơn. Ngưỡng thường được đặt trong tiêu chí chấp nhận dưới dạng "p95 dưới 1 giây với 500 người dùng đồng thời".
Quy trình chạy một đợt kiểm thử hiệu năng
- Xác định mục tiêu định lượng: bao nhiêu người dùng đồng thời, ngưỡng p95 là bao nhiêu, tỉ lệ lỗi tối đa chấp nhận được.
- Chọn kịch bản đại diện: các luồng chiếm phần lớn lưu lượng thật, không phải luồng dễ viết nhất.
- Chuẩn bị môi trường càng giống production càng tốt — kết quả trên máy cấu hình yếu hơn không suy ra được gì.
- Chuẩn bị dữ liệu đủ lớn: truy vấn trên bảng 1.000 dòng và trên bảng 10 triệu dòng là hai câu chuyện khác nhau.
- Chạy thử ở tải thấp để xác nhận kịch bản đúng trước khi chạy tải cao.
- Chạy chính thức, đồng thời theo dõi tài nguyên máy chủ.
- Phân tích: tìm nút thắt, đề xuất cải thiện, chạy lại để so sánh.
Chọn công cụ để bắt đầu
| Công cụ | Kịch bản viết bằng | Phù hợp khi |
|---|---|---|
| JMeter | Giao diện đồ hoạ, không cần code | Người mới, đội không có nền lập trình |
| k6 | JavaScript | Đội quen code, muốn đưa vào CI |
| Gatling | Scala hoặc Java | Dự án JVM, cần hiệu suất tạo tải cao |
| Locust | Python | Đội dùng Python, cần kịch bản linh hoạt |
// k6 — kịch bản load test tối giản
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 200 }, // tăng dần lên 200 người dùng
{ duration: '5m', target: 200 }, // giữ tải trong 5 phút
{ duration: '2m', target: 0 }, // giảm dần
],
thresholds: {
http_req_duration: ['p(95)<1000'], // p95 phải dưới 1 giây
http_req_failed: ['rate<0.01'], // tỉ lệ lỗi dưới 1%
},
};
export default function () {
const res = http.get('https://staging-api.example.com/v1/products?page=1');
check(res, {
'status 200': (r) => r.status === 200,
'có dữ liệu': (r) => r.json('items').length > 0,
});
sleep(1);
}Câu hỏi thường gặp
Load test và stress test khác nhau thế nào?
Load test chạy ở mức tải dự kiến trong điều kiện bình thường để xác nhận hệ thống đáp ứng được lượng người dùng thực tế. Stress test tăng tải vượt ngưỡng cho đến khi hệ thống hỏng, nhằm tìm điểm gãy và quan sát cách hệ thống xuống cấp khi quá tải.
Vì sao không nên dùng response time trung bình?
Vì trung bình che giấu nhóm người dùng có trải nghiệm tệ nhất. Nếu 95% yêu cầu nhanh và 5% cực chậm, con số trung bình vẫn trông ổn trong khi một phần người dùng thực sự đang gặp vấn đề. Hãy dùng percentile p95 và p99 để phản ánh đúng.
Tester thủ công có cần biết kiểm thử hiệu năng không?
Ở mức hiểu khái niệm và đọc được kết quả thì có, vì bạn cần trao đổi được với đội về ngưỡng chấp nhận. Việc dựng kịch bản tải chuyên sâu thường do vai trò performance tester đảm nhiệm, nhưng quan sát tab Network trong DevTools là kỹ năng mọi tester nên có.
Nên học JMeter hay k6 trước?
JMeter nếu bạn chưa quen lập trình, vì kịch bản dựng bằng giao diện đồ hoạ. k6 nếu bạn đã viết được JavaScript cơ bản và muốn đưa kiểm thử hiệu năng vào pipeline CI, vì kịch bản là mã nguồn nên dễ quản lý phiên bản và tái sử dụng.