NỘI DUNG BÀI HỌC
✅ JSR223 là gì?
✅ Nguồn gốc và bản chất của JSR223
✅ Các loại JSR223 trong JMeter
✅ Tại sao dùng Groovy thay vì Java?
✅ Cách sử dụng JSR223 PreProcessor
✅ Ví dụ minh họa thực tế
✅ Lưu ý & Best Practices
1. Kiến thức nền về JMeter
-
Apache JMeter là một công cụ mã nguồn mở viết bằng ngôn ngữ Java.
-
Tất cả các thành phần của JMeter (Sampler, Controller, Processor, Listener…) đều được phát triển dựa trên Java class.
-
Khi bạn chạy một test plan trong JMeter, thực chất nó đang khởi tạo các Java thread để mô phỏng user, và các sampler sẽ gửi request thông qua API Java (ví dụ HttpClient, JDBC…).
1.1 Jmeter functional
Theo chúng ta đã biết đến buổi ngày hôm nay, JMeter đã hỗ trợ sẵn rất nhiều công cụ để xử lý công việc kiểm thử hiệu năng:
-
Sampler: gửi request (HTTP, JDBC, Kafka, TCP, SMTP...).
-
Function Helper: cung cấp các hàm dựng sẵn để sinh dữ liệu động (timestamp, random string, encode/decode…).
👉 Nhìn chung, với các công cụ này thì hầu hết những tình huống phổ biến khi làm performance test đều có thể giải quyết được.
Tuy nhiên, vẫn có những trường hợp đặc thù mà JMeter không cung cấp sẵn công cụ để xử lý.
Ví dụ dễ hiểu:
-
Ứng dụng backend yêu cầu một token ký bằng HMAC-SHA256 trước khi gửi request.
-
Trong JMeter, chúng ta không có sampler hay function nào sẵn để tạo loại token này.
Lúc này, chúng ta không còn cách nào khác ngoài việc phải tự viết code để xử lý logic đó.
→ Và đây chính là lúc các thành phần JSR223 (PreProcessor/PostProcessor) phát huy sức mạnh.
2. Cách mà code Java được thực thi
Lúc trước người ta vẫn dùng java để code các script chạy trong jmeter. Nhưng sau đó người ta phát hiện rằng khi dùng java để thực thi script dẫn tới gặp vấn đề về hiệu năng.
Quy trình chạy một đoạn code Java cơ bản:
-
Viết code: tạo file
.java
chứa class, method. -
Compile: dùng
javac
để biên dịch file.java
thành file.class
(bytecode). -
Execute: JVM sẽ nạp file
.class
này, thực thi bằng cách dịch bytecode sang mã máy.
👉 Vấn đề đặt ra trong JMeter:
-
Nếu bạn viết code Java để nhúng trực tiếp trong test (ví dụ trong BeanShell hoặc JSR223 với Java engine), thì mỗi lần chạy script, JMeter sẽ phải biên dịch lại → tốn vài chục đến vài trăm mili giây.
-
Trong performance test, ta có thể cần chạy hàng nghìn đến hàng triệu request. Nếu mỗi lần lại phải compile → tổng overhead sẽ cực lớn, làm kết quả không chính xác và giảm hiệu năng
3. Giới thiệu về ngôn ngữ Groovy
3.1 Groovy là gì?
-
Groovy là một ngôn ngữ lập trình dựa trên Java Platform.
-
Nó được tạo ra với mục tiêu:
-
Giữ nguyên sức mạnh của Java,
-
Nhưng cú pháp ngắn gọn hơn, linh hoạt hơn,
-
Và đặc biệt: có thể dùng như scripting language (không cần compile thủ công trước).
-
3.2 Groovy hoạt động như thế nào?
-
Khi bạn viết code Groovy trong JSR223, JMeter sẽ dùng Groovy engine để:
-
Parse script sang bytecode,
-
Compile một lần (nếu bật cache compiled script),
-
Thực thi trực tiếp trên JVM.
-
→ Điều này giúp loại bỏ chi phí compile lặp lại mỗi lần chạy như với Java thuần.
3.3 So sánh Groovy với Java
Tiêu chí | Java | Groovy |
---|---|---|
Nền tảng | Ngôn ngữ lập trình biên dịch | Ngôn ngữ scripting dựa trên JVM |
Cú pháp | Rườm rà, cần nhiều boilerplate | Ngắn gọn, gần giống Python/Ruby |
Compile | Phải compile trước khi chạy | Có thể compile tự động, cache |
Tích hợp JVM | 100% (native) | 100% (gọi thẳng class Java) |
Hiệu năng | Rất nhanh sau compile | Gần như Java nếu bật cache |
Mục đích sử dụng | Phát triển hệ thống lớn | Scripting, automation, dynamic |
3.4 Tại sao dùng Groovy thay cho Java trong JMeter?
-
Không cần compile lại mỗi lần run → tốc độ cao, tránh overhead.
-
Ngắn gọn, dễ viết, dễ bảo trì → phù hợp cho test script thường thay đổi.
-
Có thư viện mạnh mẽ (
JsonSlurper
,XmlSlurper
) giúp xử lý dữ liệu nhanh chóng. -
Tích hợp Java 99% → bạn vẫn gọi được tất cả class và API Java.
-
Được JMeter khuyến nghị chính thức: kể từ JMeter 3.1, Groovy là ngôn ngữ scripting mặc định trong JSR223 vì hiệu năng vượt trội so với BeanShell hoặc JavaScript engine.
👉 Kết luận:
-
JMeter được viết bằng Java, nhưng việc compile Java mỗi lần chạy tạo overhead khi test tải lớn.
-
Groovy được sinh ra để giải quyết vấn đề này: scripting trên JVM mà vẫn nhanh gần như Java.
-
Vì vậy, trong JSR223 PreProcessor/PostProcessor, luôn nên chọn Groovy để vừa có hiệu năng, vừa có sự tiện lợi khi viết code.
1. JSR223 là gì?
-
JSR (Java Specification Request): Là tập hợp các đặc tả chuẩn hóa trong Java, do cộng đồng và Oracle đề xuất nhằm mở rộng khả năng của Java.
-
JSR223: Là đặc tả quy định cách tích hợp và thực thi các ngôn ngữ script (như Groovy, JavaScript, Python, Ruby…) bên trong môi trường Java, thông qua thư viện
javax.script
. -
Trong JMeter, JSR223 cho phép ta nhúng và chạy trực tiếp các đoạn mã script ngay trong kịch bản test, thay vì phải biên dịch và import code Java thủ công.
2. Nguồn gốc và bản chất của JSR223 trong JMeter
-
Trước đây: JMeter hỗ trợ viết script bằng BeanShell.
-
Ưu điểm: dễ tích hợp.
-
Nhược điểm: chạy chậm, không ổn định, ngốn tài nguyên khi test ở quy mô lớn.
-
-
Sau này: JMeter chuyển sang hỗ trợ JSR223 vì:
-
✅ Tương thích với nhiều ngôn ngữ scripting.
-
✅ Hiệu năng vượt trội hơn BeanShell.
-
✅ Đặc biệt, Groovy được tối ưu hóa gần như native code trên JVM → vừa nhanh vừa an toàn.
-
3. Các thành phần JSR223 trong JMeter
JMeter cung cấp nhiều biến thể JSR223, tương ứng với từng “hook” (điểm móc) trong vòng đời test:
-
JSR223 Sampler
-
Cho phép viết script để thực hiện logic tùy chỉnh hoặc gửi request riêng.
-
Dùng khi Sampler mặc định không đáp ứng nhu cầu.
Kịch bản: In ra timestamp và lưu vào biến JMeter.
Cách làm:
-
Thêm Thread Group.
-
Thêm JSR223 Sampler.
-
Chọn Language = groovy.
-
Ví dụ về tính tổng 2 số:
Kết quả:
-
Trong View Results Tree, bạn sẽ thấy Sampler response hiển thị sum_result
: 30
. -
Biến
${sum_result}
có thể dùng cho các request sau.
-
-
-
JSR223 PreProcessor
-
Chạy trước khi Sampler được thực thi.
-
Thường dùng để:
-
Sinh dữ liệu test động (ID, token, timestamp...).
-
Thiết lập biến hoặc request body.
Kịch bản: Gửi HTTP POST
/login
, nhưng password cần mã hóa MD5 trước khi gửi.Cách làm:
-
Thêm Thread Group.
-
Thêm HTTP Request:
-
Method: POST
-
Path:
/login
-
Body Data:
-
-
Thêm JSR223 PreProcessor dưới HTTP Request, chọn Language = groovy, dán code:
Kết quả:
-
Trước khi gửi request, biến
userId,created_date
sẽ được sinh tự động.
-
-
-
-
JSR223 PostProcessor
-
Chạy sau khi Sampler được thực thi.
-
Thường dùng để:
-
Phân tích response.
-
Trích xuất dữ liệu, lưu vào biến dùng cho các bước sau.
Kịch bản: API
/login
trả về JSON:Ta cần trích token và lưu vào biến JMeter.
Cách làm:
-
Sau HTTP Request
/login
, thêm JSR223 PostProcessor. -
Chọn Language = groovy.
-
Dán code:
Kết quả:
-
Biến
${auth_token}
sẽ chứa giá trị"abc123xyz"
.
-
-
-
-
JSR223 Assertion
-
Cho phép viết rule kiểm tra response dựa trên logic tùy chỉnh.
-
Ví dụ: Kiểm tra status code, validate giá trị trong JSON.
-
-
JSR223 Listener
-
Xử lý dữ liệu sau khi test chạy xong.
-
Có thể viết log, thống kê, hoặc xuất kết quả ra file theo định dạng riêng.
-
👉 Tóm lại:
JSR223 là cơ chế mạnh mẽ trong JMeter, cho phép ta bổ sung các logic phức tạp, tùy chỉnh dữ liệu, kiểm soát chi tiết luồng test mà các thành phần mặc định không hỗ trợ. Đặc biệt, khi kết hợp với Groovy, ta vừa có tốc độ gần bằng Java, vừa có sự linh hoạt của script.
Tài liệu tham khảo: https://jmeter.apache.org/usermanual/component_reference.html