Thực hành kiểm thử hiệu năng với Apache JMeter: Xây dựng kịch bản kiểm tra dự báo thời tiết

1. Xây dựng kịch bản JMeter cho nghiệp vụ thực tế

Giả sử cần kiểm thử hiệu năng cho chức năng tra cứu dự báo thời tiết theo thành phố. Quy trình bắt đầu từ việc phân tích luồng yêu cầu HTTP qua công cụ bắt gói (ví dụ: Fiddler hoặc trình phát triển trình duyệt), sau đó xác định các endpoint cốt lõi:

  • Lấy mã thành phố: GET http://toy1.weather.com.cn/search?cityname=Hà Nội
  • Lấy dữ liệu thời tiết chi tiết: GET http://www.weather.com.cn/weather1d/101010100.shtml

Các bước triển khai trong JMeter:

  1. Tham số hóa dữ liệu: Sử dụng User Defined Variables hoặc CSV Data Set Config để tải danh sách thành phố từ file CSV (ví dụ: cities.csv chứa các giá trị Hà Nội, Đà Nẵng, Hồ Chí Minh).
  2. Tạo yêu cầu HTTP đầu tiên: Thiết lập HTTP Request Sampler trỏ đến endpoint tìm kiếm mã thành phố, đảm bảo thiết lập Content encodingUTF-8 để tránh lỗi mã hóa.
  3. Bổ sung thành phần hỗ trợ:
    • HTTP Header Manager để thêm User-AgentAccept: application/json.
    • Response Assertion kiểm tra mã trạng thái 200 và chuỗi "[{" trong nội dung phản hồi.
    • View Results Tree để gỡ lỗi trực quan.
  4. Trích xuất mã thành phố: Dùng JSON Extractor (nếu API trả về JSON) hoặc Regular Expression Extractor để lấy giá trị ref hoặc cityid từ phản hồi — ví dụ biểu thức chính quy: "ref":"([^"]+)", lưu vào biến cityId.
  5. Xây dựng yêu cầu thứ hai: Tạo một HTTP Request Sampler mới, thay thế phần đường dẫn bằng giá trị biến ${cityId}, ví dụ: http://www.weather.com.cn/weather1d/${cityId}.shtml.

2. Thiết lập môi trường thực thi

Chế độ không giao diện (CLI)

Để giảm tiêu thụ tài nguyên và hỗ trợ chạy tự động, nên ưu tiên chế độ dòng lệnh:

jmeter -n -t ./testplans/weather-test.jmx -l ./results/weather-result.jtl -e -o ./reports/weather-html

Các tham số phổ biến:

  • -n: Chạy ở chế độ non-GUI
  • -t: Chỉ định tệp kịch bản .jmx
  • -l: Ghi kết quả vào tệp nhật ký .jtl
  • -e -o: Tự động sinh báo cáo HTML sau khi chạy xong

Chạy phân tán (Distributed Testing)

Khi cần mô phỏng hàng nghìn người dùng đồng thời:

  1. Cấu hình máy chủ (slave): Chạy jmeter-server.bat (Windows) hoặc jmeter-server (Linux/macOS).
  2. Cập nhật jmeter.properties trên máy điều khiển (master):
    remote_hosts=192.168.1.100:1099,192.168.1.101:1099
  3. Khởi chạy từ master với tùy chọn -r:
    jmeter -n -t weather-test.jmx -r -l dist-result.jtl

3. Hiểu sâu về luồng xử lý và phạm vi thành phần

JMeter thực thi các thành phần theo thứ tự cố định:

  1. Config Elements (ví dụ: CSV Data Set Config, HTTP Header Manager)
  2. Pre-Processors (ví dụ: JSR223 PreProcessor)
  3. Timers (giới thiệu độ trễ giữa các yêu cầu)
  4. Samplers (yêu cầu HTTP, JDBC…)
  5. Post-Processors (trích xuất dữ liệu từ phản hồi)
  6. Assertions (kiểm tra tính đúng đắn của phản hồi)
  7. Listeners (hiển thị/ghi kết quả)

Mỗi thành phần có phạm vi áp dụng (scope) xác định bởi vị trí trong cây kế hoạch kiểm thử — ví dụ: HTTP Header Manager đặt dưới một Thread Group sẽ ảnh hưởng tới tất cả HTTP Samplers trong nhóm đó, nhưng không ảnh hưởng tới các nhóm khác.

4. Các thành phần then chốt

Thread Group

  • Ramp-Up Period: Thời gian (giây) để tăng dần số luồng từ 0 lên giá trị cấu hình.
  • Loop Count: Số lần lặp mỗi luồng thực hiện toàn bộ kịch bản.
  • Thread Properties: Cài đặt xử lý lỗi khi sampler thất bại — lựa chọn Stop Thread giúp cô lập lỗi mà không làm gián đoạn toàn bộ test.

HTTP Request Defaults & HTTP Header Manager

Dùng để định nghĩa các giá trị mặc định chung (host, port, protocol) và tiêu đề HTTP tái sử dụng, giảm lặp lại trong từng sampler.

JSON Extractor

Ưu tiên hơn Regular Expression Extractor khi làm việc với API trả về JSON — cấu hình đơn giản, ổn định và dễ bảo trì. Ví dụ trích xuất cityid từ phản hồi:
JSON Path Expressions: $..ref
Variable Names: targetCityId

JSR223 PostProcessor (Groovy)

Thay thế BeanShell bằng Groovy để cải thiện hiệu năng và khả năng tương thích. Ví dụ log giá trị biến đã trích xuất:

log.info("Extracted city ID: " + vars.get("targetCityId"));

5. Báo cáo hiệu năng

Sau khi chạy xong, sử dụng các listener để phân tích:

  • Summary Report: Hiển thị nhanh các chỉ số cơ bản như Average Response Time, Error %, Throughput.
  • Aggregate Report: Cung cấp thống kê mở rộng như độ lệch chuẩn (Std. Dev.), thời gian tối thiểu/tối đa, và phân bố phần trăm (90% Line).
  • Response Times Over Time: Biểu đồ xu hướng thời gian phản hồi theo thời gian chạy.

Thẻ: jmeter performance-testing load-testing api-testing groovy

Đăng vào ngày 16 tháng 6 lúc 08:44