Mở đầu
Đây là bài viết số 4 trong series K6 Performance Testing:
- K6 Performance Testing - Nhập môn
- K6 Performance Testing - Phân loại kiểm thử hiệu năng
- K6 Performance Testing - Giải mã & Định dạng kết quả
Sau những lý thuyết đã trình bày ở phần K6 Performance Testing - Giải mã & Định dạng kết quả, giờ là lúc chúng ta bắt tay vào thực hành.
Trong bài viết này, chúng ta sẽ trực quan hóa quá trình và kết quả của các bài kiểm thử hiệu năng bằng K6 thông qua các bảng biểu, biểu đồ, mang lại cái nhìn rõ ràng và dễ hiểu hơn về hiệu suất hệ thống.
Chuẩn bị Script kiểm thử
Để minh họa, chúng ta sẽ sử dụng một kịch bản K6 sát thực tế hơn và phức tạp hơn so với script đã giới thiệu ở bài viết K6 Performance Testing - Nhập môn. Kịch bản này được thiết kế nhằm mục đích thể hiện nhiều khía cạnh trong một bài kiểm thử. Cụ thể, sẽ có nhiều yêu cầu HTTP khác nhau, mô phỏng đa dạng hành vi của người dùng và bao gồm các yêu cầu về kiểm tra và xác thực dữ liệu.
Nếu bạn muốn tìm hiểu chi tiết hơn về cấu trúc cơ bản của một script K6, hãy tham khảo bài viết K6 Performance Testing - Nhập môn.
Chúng ta sẽ xây dựng kịch bản để mô phỏng hành vi người dùng đặt đơn hàng pizza gồm 3 bước:
- Đăng nhập vào hệ thống
- Chọn và đặt pizza
- Khách hàng đánh giá pizza vừa ăn
Dưới đây là nội dung tệp tin "my_script.js”, mình cũng có ghi lại các comment để giải thích những câu lệnh, cấu hình cần lưu ý:
import http from 'k6/http';
import { check } from 'k6';
import { Counter } from 'k6/metrics';
// Định nghĩa Custom Metrics để đếm số lỗi
const errors = new Counter('errors');
// Cấu hình bài kiểm thử
export const options = {
stages: [
{ duration: '1m', target: 100 }, // Tăng tải lên 100 VUs trong 1 phút
{ duration: '2m', target: 200 }, // Giữ ổn định 200 VUs trong 2 phút
{ duration: '1m', target: 0 }, // Giảm tải về 0 VUs trong 1 phút
],
thresholds: {
http_req_duration: ['p(95)<400'], // 95% HTTP requests phải hoàn thành dưới 400ms
http_req_failed: ['rate<0.01'], // Tỷ lệ HTTP requests thất bại phải dưới 1%
},
};
export default function () {
// 1. Đăng nhập
const requestBodyLogin = JSON.stringify({
"username": "default",
"password": "12345678"
});
const requestHeaderLogin = {
headers: {
'Content-Type': 'application/json'
}
};
const responseLogin = http.post('https://quickpizza.grafana.com/api/users/token/login', requestBodyLogin, requestHeaderLogin);
// Kiểm tra kết quả đăng nhập
if (responseLogin.status !== 200) {
errors.add(1);
return;
}
let responseData;
try {
responseData = JSON.parse(responseLogin.body);
} catch (e) {
errors.add(1);
return;
}
if (!responseData || !responseData.token) {
errors.add(1);
return;
}
// 2. Đặt pizza
const tokenID = responseData.token;
const requestBodyOrderPizza = JSON.stringify({
"maxCaloriesPerSlice": 1000,
"mustBeVegetarian": false,
"excludedIngredients": [],
"excludedTools": [],
"maxNumberOfToppings": 5,
"minNumberOfToppings": 2,
"customName": ""
});
const requestHeaderOrderPizza = {
headers: {
'Content-Type': 'application/json',
'authorization': 'Token ' + tokenID
}
};
const responseOrderPizza = http.post('https://quickpizza.grafana.com/api/pizza', requestBodyOrderPizza, requestHeaderOrderPizza);
let responsePizzaData;
try {
responsePizzaData = JSON.parse(responseOrderPizza.body);
} catch (e) {
errors.add(1);
return;
}
// Kiểm tra dữ liệu trả về của request đặt pizza
if (!responsePizzaData) {
errors.add(1);
return;
}
if (!responsePizzaData.pizza) {
errors.add(1);
return;
}
// Kiểm tra trạng thái đặt pizza và dữ liệu trả về
check(responseOrderPizza, {
'Order Pizza Status Code is 200': (r) => r.status === 200,
'Pizza Name is not null': (r) => responsePizzaData && responsePizzaData.pizza && responsePizzaData.pizza.name !== null
}, { check: 'Order Pizza' }) || errors.add(1);
if (!responsePizzaData.pizza.id) {
errors.add(1);
return;
}
// 3. Đánh giá pizza
const pizzaID = responsePizzaData.pizza.id;
const requestBodyRatePizza = JSON.stringify({
"pizza_id": pizzaID,
"stars": Math.floor(Math.random() * 6) + 1
});
const requestHeaderRatePizza = {
headers: {
'Content-Type': 'application/json',
'authorization': 'Token ' + tokenID
}
};
const responseRatePizza = http.post('https://quickpizza.grafana.com/api/ratings', requestBodyRatePizza, requestHeaderRatePizza);
// Kiểm tra trạng thái đánh giá pizza
check(responseRatePizza, {
'Rate Pizza Status Code is 201 or 200': (r) => r.status === 201 || r.status === 200
}, { check: 'Rate Pizza' }) || errors.add(1);
}
Khi thấy kết quả trên terminal, bạn cũng đừng lo lắng, bởi mình đã thêm một chút lỗi trong checks, bổ sung thêm màu sắc trong kết quả :D.
Chuẩn bị môi trường
Để đơn giản hóa quá trình tích hợp các công cụ trực quan hóa, chúng ta sẽ tận dụng giải pháp Docker Compose. Hãy đảm bảo môi trường của bạn đã cài đặt sẵn:
- Git
- Docker
- Docker Compose
Mình đã chuẩn bị sẵn các tệp tin Docker Compose. Bạn có thể tải về mã nguồn bằng lệnh sau:
git clone https://github.com/orez-fu/k6-pt-demo
Trước khi đi sâu vào chi tiết, hãy cùng gặp “Mr. Possible” - vị sếp kỹ tính của chúng ta.
Mr. Possible không hài lòng với việc chúng ta chỉ trình bày kết quả kiểm thử bằng văn bản khô khan trên terminal. Để làm Mr. Possible hài lòng, chúng ta sẽ biến những con số đó thành những biểu đồ và số liệu trực quan, dễ hiểu!
K6 Web Dashboard
K6 Web Dashboard là một tính năng tích hợp sẵn của K6, cho phép bạn trực quan hóa và giám sát quá trình kiểm thử theo thời gian thực một cách dễ dàng.
Bạn có thể kích hoạt tính năng này bằng cách đặt biến môi trường K6_WEB_DASHBOARD
thành true
. Cụ thể, lệnh chạy của chúng ta sẽ là:
K6_WEB_DASHBOARD=true k6 run scripts/my_script.js
Sau khi chạy lệnh, bạn sẽ thấy thông báo về địa chỉ truy cập Web Dashboard trong terminal:
K6_WEB_DASHBOARD=true ./k6 run script.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: ../extensions/xk6-dashboard/script.js
web dashboard: http://127.0.0.1:5665
output: -
Mặc định, Web Dashboard được truy cập thông qua địa chỉ http://127.0.0.01:5665/. Mở trình duyệt và truy cập địa chỉ này để Mr. Possible chiêm ngưỡng tiến trình kiểm thử trực tiếp!
Mr.Possible đã gật gù: “Có đường nét, có màu sắc. Tiếp theo, hãy gửi báo cáo cuối cùng cho đội phát triển sau khi chạy xong bài kiểm thử”.
Yêu cầu này cũng không làm khó được chúng ta. Nút “Report” trên Web Dashboard có thể giúp bạn làm điều đó. Tuy nhiên, bạn sẽ nhận ra rằng, khi bài kiểm thử kết thúc, bạn sẽ không còn truy cập được Web Dashboard nữa. Đừng lo lắng, chúng ta sẽ sử dụng thêm tính năng kết xuất báo cáo để đảm bảo có một báo cáo tổng thể sau khi kiểm thử hoàn tất. Hãy thêm biến môi trường K6_WEB_DASHBOARD_EXPORT
và tệp định dạng HTML để lưu trữ kết quả:
K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=my_script_report.html k6 run scripts/my_script.js
Mở tệp tin my_script_report.html
, chúng ta sẽ thấy một trang web tĩnh chứa kết quả tổng quan của bài test, hãy gửi tệp tin này cho Mr. Possible!
Ngoài hai biến môi trường trên, K6 Web Dashboard còn cung cấp nhiều tùy chỉnh linh hoạt khác. Vui lòng tham khảo tài liệu chính thức tại K6 Web Dashboard - Dashboard options.
Tích hợp với Prometheus & Grafana
K6 web dashboard đã đủ để làm bạn hài lòng với khả năng trực quan hóa quá trình và kết quả kiểm thử. Tuy nhiên, nếu sếp của bạn yêu cầu kết quả kiểm thử cần được tập trung lưu trữ và trực quan hóa trên nền tảng các công cụ giám sát chuyên nghiệp, hãy làm hài lòng sếp của bạn bằng một trong 2 tích hợp sau:
- Kết quả tập trung lưu trữ trong Prometheus & trực quan hóa bằng Grafana
- Kết quả lưu trữ tập trung tong InfluxDB & trực quan hóa bằng Grafana
Đôi nét về Prometheus và Grafana:
- Grafana: Đây là một nền tảng trực quan hóa và giám sát mã nguồn mở. Grafana cho phép bạn tạo ra các bảng điều khiển (dashboard) đẹp mắt và tương tác từ nhiều nguồn dữ liệu khác nhau, có thể kể tới như Prometheus, InfluxDB, VictoriaMetrics,… Với Grafana, bạn có thể biến các số liệu thô từ K6, được lưu trữ trong Prometheus, thành các biểu đồ, đồ thị và bảng biểu trực quan, giúp dễ dàng theo dõi hiệu suất hệ thống, phát hiện xu hướng, và thiết lập cảnh báo khi có vấn đề.
- Prometheus: Là một hệ thống giám sát và cảnh báo mã nguồn mở hàng đầu, được thiết kế đặc biệt để thu thập và lưu trữ dữ liệu chuỗi thời gian (time-series data). Trong ngữ cảnh của K6, Prometheus sẽ là nơi K6 gửi các metric hiệu năng của mình đến để lưu trữ, tạo nền tảng cho việc trực quan hóa sau này.
Cài đặt Prometheus & Grafana
Phần này sẽ hướng dẫn mọi người cài đặt và sử dụng công cụ Prometheus và Grafana trên máy cá nhân.
Cài đặt bằng Docker Compose
Truy cập repo và thư mục chứa source cài đặt:
cd k6-pt-demo/4_Outputs_Practice/prometheus_grafana
docker-compose up -d
Hãy kiểm tra các công cụ đã được triển khai:
docker-compose ps
Kết quả xuất hiện gồm hai công cụ Grafana và Prometheus đã được triển khai, trong đó:
- Promtheus lắng nghe các yêu cầu ở địa chỉ
localhost
và cổng9090
, sẵn sàng tiếp nhận và lưu trữ metrics của K6 gửi tới. - Giao diện web của Grafana có thể truy cập qua địa chỉ
localhost
và cổng3000
.
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------
prometheus_grafana_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
prometheus_grafana_prometheus_1 /bin/prometheus --web.enab ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp
Thêm Grafana dashboard K6 Prometheus
Dashboard K6 Prometheus có sẵn trên kho dashboard của Grafana với ID 19665, bạn có thể truy cập đường link sau để xem chi tiết https://grafana.com/grafana/dashboards/19665-k6-prometheus/ .
Chúng ta sẽ truy cập Grafana đã cài đặt ở bước trước thông qua địa chỉ http://localhost:3000
, tiếp theo sử dụng tài khoản đã được thiết lập sẵn user=admin và password=admin123 để đăng nhập vào ứng dụng Grafana.
Để thêm dashboard mới, chọn menu Dashboards, nhấp chuột vào nút New và chọn lựa hành động Import.
Trong biểu mẫu Import dashboard, điền ID 19665 tại ô Grafana.com dashboard URL or ID. Sau đó, nhấp chuột vào nút Load.
Ở màn hình tiếp theo, chọn datasource có sẵn ở mục prometheus. Bước cuối cùng thực hiện nhấp chuột vào nút Import để hoàn tất thêm vào dashboard K6 Prometheus.
Bạn sẽ thấy dashboard không có dữ liệu hiển thị. Hãy tới bước tiếp theo chạy kiểm thử và kết xuất output tới Prometheus & Grafana.
Thực hiện kiểm thử
Trong repo k6-pt-demo có lưu trữ sẵn tệp tin my_script.js
tại đường dẫn k6-pt-demo/4_Outputs_Practice/prometheus_grafana/scripts/my_script.js
. Chúng ta sẽ di chuyển tới thư mục prometheus_grafana
và thực hiện lệnh chạy K6 dưới đây:
# quay trở lại thư mục 4_Outputs_Practice
cd ..
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write \
k6 run -o experimental-prometheus-rw --tag testid=run_001 scripts/my_script.js
Giải nghĩa các cấu hình có trong câu lệnh:
K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write
: Biến môi trường mà K6 sử dụng để xác định URL của máy chủ Prometheus. K6 sẽ gửi các metric thu thập được trong quá trình kiểm thử tới URL này. Máy chủ Prometheus nhận dữ liệu thông qua endpoint http://localhost:9090/api/v1/write-o experimental-prometheus-rw
: Chỉ định định dạng output của bài kiểm thử, cho phép gửi các metric tới máy chủ Prometheus, tuy nhiên, đây vẫn là một tính năng đang trong giai đoạn thử nghiệm của Grafana K6 và có thể thay đổi trong tương lai.--tag testid=run_001
: Gắn thêm tag vào tất cả các metric được tạo ra trong quá trình kiểm thử, để phân biệt output giữa những lần chạy kiểm thử khi hiển thị trên Prometheus và Grafana.
Trong quá trình kiểm thử, chúng ta hãy ghé qua Grafana để xem tiến trình kiểm thử đang diễn ra. Lưu ý, cần thay đổi thời gian Refresh dashboard để kết quả tự động cập nhật.
Kết quả kiểm thử
Ở phần này, chúng ta cùng nhau khám phá Grafana dashboard, nhìn vào các biểu đồ để đọc hiểu và phân tích kết quả thu được.
📊 1. Tổng quan hiệu năng
Thông số | Giá trị | Đánh giá sơ bộ |
---|---|---|
HTTP Requests | 462,575 | Khối lượng truy cập lớn, hệ thống chịu tải cao |
HTTP Request Failures | 26,632 (≈5.76%) | Tỷ lệ lỗi cao, cần điều tra nguyên nhân. |
Peak RPS | 1.38k req/s | Hệ thống đạt đỉnh cao về tốc độ xử lý. |
Request Duration (P95) | 1.24 giây | Độ trễ khá cao, có thể gây trải nghiệm không tốt cho người dùng. |
📈 2. Biểu đồ Performance Overview
- Số lượng người dùng ảo (VUs) tăng đều đặn đến ~600 VUs và giữ ở mức ổn định.
- Khi VUs đạt đỉnh, số lượng request thành công có dấu hiệu chững lại, trong khi lỗi bắt đầu gia tăng rõ rệt.
- Biểu đồ
reqs_failed
cho thấy giai đoạn tải cao chính là thời điểm hệ thống dễ xảy ra lỗi.
📌 Nhận định: Hệ thống chịu tải ổn đến một ngưỡng nhất định, sau đó mất ổn định khi tiếp tục tăng tải.
❌ 3. Lỗi xuất hiện ở Endpoint nào?
Endpoint: POST /api/ratings
- Trạng thái trả về:
400
– lỗi phía client (Bad Request). - Đây là endpoint duy nhất có lỗi HTTP status, trong khi các endpoint khác (login, order) đều thành công (
200
).
📌 Nhận định:
- Dữ liệu gửi lên endpoint này có thể không hợp lệ hoặc bị thiếu khi số lượng người dùng tăng cao.
- Cần kiểm tra lại logic xác thực dữ liệu ở phía máy chủ hoặc cách sinh dữ liệu của script kiểm thử.
⏱️ 4. Độ trễ (Latency)
- Các chỉ số
http_req_waiting
(thời gian chờ phản hồi) vàhttp_req_connecting
(thời gian kết nối) tăng dần theo thời gian, đặc biệt ở giai đoạn tải cao. - Độ trễ trung bình chạm ngưỡng 1.5 giây ở các thời điểm đỉnh tải cao.
http_req_blocked
(thời gian bị chặn) có xu hướng tăng – đây là dấu hiệu hệ thống bắt đầu nghẽn ở tầng mạng hoặc xử lý luồng trong ứng dụng.
📌 Nhận định: Đây là biểu hiện của bottleneck, có thể xảy ra ở phía cơ sở dữ liệu, API gateway hoặc tài nguyên máy chủ.
📦 5. Throughput và Data Transfer
data_received
(dữ liệu nhận được) và số lượngiterations
(số lần lặp) tăng đều trong suốt thời gian kiểm thử.- Tuy nhiên, khi lỗi xuất hiện, throughput (lưu lượng xử lý thành công) có xu hướng giảm.
📌 Nhận định: Khi hệ thống quá tải, dù lượng người dùng không đổi, số lượng request xử lý thành công vẫn giảm, ảnh hưởng đến hiệu suất chung.
✅ 6. Kết quả kiểm tra logic (Checks)
Kiểm tra | Tỷ lệ thành công |
---|---|
Login Status Code is 200 | 100% |
Order Pizza Status Code is 200 | 100% |
Pizza View is not Null | 100% |
Rate Pizza Status Code is 200/201 | 60.61% |
📌 Nhận định: Hầu hết các luồng logic chính đều ổn định, ngoại trừ bước đánh giá pizza, điều này trùng khớp với lỗi từ HTTP status đã phân tích ở trên.
📌 7. Kết luận
Hệ thống có thể xử lý lượng lớn người dùng đồng thời và tốc độ yêu cầu cao, tuy nhiên:
- Tỷ lệ lỗi cao bắt đầu xuất hiện khi số lượng người dùng ảo đạt khoảng 600.
- Độ trễ cao (P95 tới 1.24 giây) có thể ảnh hưởng đáng kể đến trải nghiệm người dùng thực tế.
- Lỗi HTTP 400 tập trung tại một endpoint cụ thể (
/api/ratings
) → đây là điểm cần điều tra kỹ lưỡng. - Có dấu hiệu của bottleneck hệ thống ở tầng ứng dụng xử lý hoặc mạng khi tải cao.
🔧 8. Đề xuất cải thiện
- Phân tích sâu endpoint
/api/ratings
:- Kiểm tra logic xử lý phía backend của endpoint này.
- Xem xét log ứng dụng để xác định nguyên nhân chính gây ra lỗi 400.
- Thực hiện kiểm thử riêng endpoint này với bộ dữ liệu chuẩn và biên để xác định vấn đề.
- Tối ưu hạ tầng backend:
- Kiểm tra kích thước của các pool, ví dụ như database connection, thread pool.
- Giới hạn tốc độ gửi đánh giá hoặc thêm hàng đợi xử lý để giảm tải cho máy chủ ứng dụng.
- Giảm độ trễ khi tải cao:
- Tối ưu hóa việc sử dụng cache.
- Áp dụng giải pháp cân bằng tải (load balancing) nếu chưa có.
- Thực hiện lại các loại kiểm thử như stress test và spike test để xác định rõ giới hạn chịu tải và hành vi của hệ thống dưới áp lực cực đoan.
Tích hợp với InfluxDB & Grafana
Ngòa Prometheus, InfluxDB cũng là một lựa chọn tuyệt vời để lưu trữ dữ liệu chuỗi theo thời gian (time-series data) mà K6 tạo ra. Sau đó, bạn có thể sử dụng Grafana để trực quan hóa dữ liệu từ InfluxDB, tương tự như cách chúng ta đã làm với Prometheus.
Cài đặt InfluxDB & Grafana
Trước khi cài đặt InfluxDB & Grafana, chúng ta hãy gỡ cài đặt của Prometheus & Grafana đã cài đặt ở phần trước. Trên terminal, truy cập tới thư mục 4_Outputs_Practice/prometheus_grafana
, thực hiện lệnh:
docker-compose down
Sau khi câu lệnh gỡ bỏ các công cụ Prometheus & Grafana thành công. Trong terminal, chúng ta truy cập tới thư mục 4_Outputs_Practice/influxdb_grafana
trong mã nguồn k6-pt-demo
, thực hiện lệnh dưới đây để cài đặt InfluxDB và Grafana:
docker-compose up -d
Trong bản cài đặt trên bao gồm:
- InfluxDB: máy chủ lưu trữ dữ liệu chuỗi theo thời gian, sẵn sàng cho dữ liệu đẩy từ các bài kiểm thử K6.
- Grafana: công cụ cung cấp tính năng xây dựng biểu đồ, cảnh báo, đã cấu hình sẵn datasource tới InfluxDB và có sẵn Dashboard K6 Test Results để trực quan hóa kết quả kiểm thử. Bạn có thể truy cập Grafana thông qua địa chỉ
http://localhost:3000
với thông tin tài khoản user=admin và password=admin123. - K6: công cụ K6 được đóng gói bao gồm mở rộng kết xuất output với định dạng lưu trữ trong InfluxDB. Tệp tin kiểm thử my_script.js cũng được lưu trữ sẵn sàng chạy trong container.
Thực hiện kiểm thử
Công cụ K6 được triển khai trong container, do đó script cũng cần được lưu trữ trong container. Tuy nhiên, bạn sẽ không cần lo lắng, vì bước cài đặt của chúng ta đã chuẩn bị đầy đủ. Tại bước này, chúng ta đơn giản là chạy kiểm thử và cảm nhận kết quả:
docker-compose run --rm -T k6 run -<scripts/my_script.js --tag testid=influx_test
Trên trang web Grafana, truy cập dashboard “K6 Test Results” để theo dõi quá trình kiểm thử.
Gỡ cài đặt InfluxDB và Grafana
Dọn dẹp các công cụ mà chúng ta đã cài đặt sau bài thực hành:
docker-compose down
Tổng kết
Trong bài viết này, chúng ta đã cùng nhau khám phá các phương pháp trực quan hóa kết quả kiểm thử hiệu năng bằng K6, từ những tùy chọn tích hợp sẵn cho đến việc kết nối với các công cụ giám sát mạnh mẽ.
- K6 Web Dashboard: Đây là công cụ tích hợp sẵn, cực kỳ tiện lợi cho việc giám sát và xem nhanh kết quả kiểm thử theo thời gian thực. Nó cũng cho phép xuất báo cáo HTML tĩnh sau khi kiểm thử hoàn tất, rất hữu ích cho việc chia sẻ kết quả.
- Tích hợp với Prometheus & Grafana: Đây là sự kết hợp mạnh mẽ và được khuyến nghị rộng rãi trong cộng đồng bởi khả năng hiển thị kết quả theo thời gian thực và lưu trữ kết quả lâu dài, lý tưởng cho việc phân tích chuyên sâu và báo cáo chi tiết.
- Tích hợp với InfluxDB & Grafana: Đây cũng là một lựa chọn tốt tương tự như bộ đôi Prometheus và Grafana, bộ đôi này cũng đem tới khả năng hiển thị kết quả theo thời gian thực và lưu trữ kết quả lâu dài. Tuy nhiên, sử dụng InfluxDB sẽ yêu cầu bạn tạo mới bản cài đặt K6 từ mã nguồn.
- Tích hợp với ElasticSearch & Kibana: Tích hợp này không được đề cập trong nội dung của bài viết do việc sử dụng ElasticSearch cho mục đích của K6 đòi hỏi cấu hình phức tạp hơn, tốn kém tài nguyên, công sức xây dựng các dashboard hiệu quả cho việc phân tích dữ liệu kiểm thử. Do đó, trong bối cảnh kiểm thử hiệu năng, công cụ tìm kiếm và phân tích log ElasticSearch không phải là một lựa chọn được khuyến nghị.
Tóm lại, K6 cung cấp đa dạng phương thức truyền tải kết quả, phù hợp với các nhu cầu khác nhau. Đặc biệt, K6 có khả năng tích hợp với hệ thống giám sát và phân tích dữ liệu, đem tới trải nghiệm công việc tốt hơn cho những kiểm thử viên, thuận tiện theo dõi quá trình kiểm thử, dữ liệu được trực quan trên các biểu đồ cho phép phân tích hiệu năng và kết xuất báo cáo một cách thuận tiện.
Bình luận