Currently Empty: 0.00₫
Bài đọc – Extract dữ liệu trong JMeter
Trong kiểm thử hiệu năng, việc cần trích xuất dữ liệu từ API này sang làm dữ liệu đầu vào cho API khác là phổ biến và thường xuyên cần thực hiện. Vậy chúng ta sẽ có những cách nào để lấy được dữ liệu này?
- Sử dụng JSON Extractor
- Sử dụng Regular Expression Extractor
- Phát triển script hoặc sử dụng Plug-in trong JMeter
JSON Extractor
JSON Extractor là một Post-Processor trong JMeter, cho phép bạn trích xuất dữ liệu từ phản hồi HTTP dạng JSON và lưu trữ nó vào biến để sử dụng trong các yêu cầu hoặc phần khác của kiểm thử.
Để sử dụng JSON Extractor trong JMeter, bạn làm như sau:
- Bước 1: Trước tiên, bạn cần thêm một yêu cầu HTTP để nhận phản hồi JSON từ máy chủ.
- Bước 2: Trong yêu cầu HTTP đó, thêm JSON Extractor bằng cách chuột phải vào yêu cầu, chọn “Add” -> “Post Processors” -> “JSON Extractor”.
- Bước 3: Trong phần giao diện của JSON Extractor, bạn có thể cấu hình trích xuất dữ liệu bằng cách xác định các thuộc tính sau:
- “Names of created variables”: Tên biến mà bạn muốn lưu trữ dữ liệu được trích xuất. Điều này có thể là một biến duy nhất hoặc một danh sách các biến phân tách bằng dấu phẩy.
- “JSON Path expressions”: Các biểu thức JSON Path để chỉ định vị trí của dữ liệu trong phản hồi JSON. JSON Path là một cú pháp để truy cập vào các trường dữ liệu JSON. Bạn có thể trích xuất giá trị của các trường cụ thể hoặc các mảng JSON.
- “Match No.”: Số chỉ mục của kết quả trùng khớp. Nếu giá trị là 0, JSON Extractor sẽ lấy tất cả các kết quả trùng khớp. Nếu giá trị là 1 hoặc lớn hơn, nó sẽ chỉ lấy kết quả tại vị trí chỉ mục đó.
- Bước 4: Lưu lại các cấu hình và chạy kiểm thử.
Khi kiểm thử chạy và phản hồi JSON được nhận từ máy chủ, JSON Extractor sẽ trích xuất dữ liệu từ phản hồi và lưu trữ nó vào các biến bạn đã chỉ định. Sau đó, bạn có thể sử dụng các giá trị này trong các yêu cầu hoặc các phần khác của kiểm thử.
Các trường hợp có thể sử dụng với JSON Extractor:
JSON Data – Response:
{
"code": 200,
"data": {
"count": 12,
"rows": [
{
"id": "4c68d5cd-1863-4c85-abd0-f8bcce6443b6",
"categoryName": "Quan ao, trang phuc",
"cateDesc": "Quan ao, trang phuc - Mo ta",
"status": "ACTIVE"
},
{
"id": "74c1d116-aac1-408d-819d-9fb160f70086",
"categoryName": "Dien thoai",
"cateDesc": "Dien thoai 2023",
"status": "ACTIVE"
},
{
"id": "686fb51b-89ab-44b1-ab38-63dc931fb797",
"categoryName": "Van phong pham",
"cateDesc": "Vincent_Van phong pham",
"status": "ACTIVE"
}
],
"page": 1,
"limit": 3,
"totalPage": 4
}
}- Lấy 01 value cụ thể
Thực hiện lấy giá trị categoryName tại bị trí đầu tiên trong danh sách category
-> Lấy ra thông tin của đối tượng này:{ "id": "4c68d5cd-1863-4c85-abd0-f8bcce6443b6", "categoryName": "Quan ao, trang phuc", "cateDesc": "Quan ao, trang phuc - Mo ta", "status": "ACTIVE" } - Lấy nhiều values
- Lấy ra toàn bộ các giá trị categoryName của response:

- Lấy ra toàn bộ các giá trị categoryName của response:
- Lấy theo điều kiện trùng khớp
- Lấy ra giá trị của ID và CategoryName theo điều kiện đối tượng có categoryName là ‘Dien thoai’

- Lấy ra giá trị của ID và CategoryName theo điều kiện đối tượng có categoryName là ‘Dien thoai’
- Lấy 01 value cụ thể
Regular Expressions
Regular Expressions (Biểu thức chính quy) là một công cụ mạnh mẽ trong JMeter và các công cụ kiểm thử phần mềm khác để trích xuất thông tin từ văn bản dạng chuỗi. Trong JMeter, bạn có thể sử dụng biểu thức chính quy để trích xuất dữ liệu từ các phản hồi HTTP hoặc các phần khác của kiểm thử và lưu trữ nó vào các biến để sử dụng sau này.
Để sử dụng Regular Expressions trong JMeter, bạn làm như sau:
- Bước 1: Trước tiên, bạn cần thêm một yêu cầu HTTP hoặc các phần khác của kiểm thử để nhận phản hồi hoặc văn bản chứa thông tin mà bạn muốn trích xuất.
- Bước 2: Trong yêu cầu hoặc phần đó, thêm một Post-Processor bằng cách chuột phải vào yêu cầu hoặc phần và chọn “Add” -> “Post Processors” -> “Regular Expression Extractor”.
- Bước 3: Trong phần giao diện của Regular Expression Extractor, bạn có thể cấu hình trích xuất dữ liệu bằng cách xác định các thuộc tính sau:
- Reference Name: Tên biến mà bạn muốn lưu trữ dữ liệu được trích xuất. Điều này sẽ là tên biến bạn sử dụng sau này để sử dụng giá trị đã trích xuất.
- Regular Expression: Biểu thức chính quy để xác định cấu trúc của thông tin bạn muốn trích xuất. Biểu thức chính quy nên được viết đúng cú pháp và chính xác để trích xuất dữ liệu đúng.
- Sử dụng câu lệnh (.+?) để lấy bất kỳ giá trị nào muốn lấy, trong đó:
- . − lấy bất kỳ giá trị nào
- + − Lấy một hoặc nhiều giá trị
- ? − Dừng khi có ký tự trùng khớp sau nó

Ví dụ: Response được trả ra từ API:
{
"code": 200,
"id": "4c68d5cd-1863-4c85-abd0-f8bcce6443b6",
"categoryName": "Quan ao, trang phuc",
"cateDesc": "Quan ao, trang phuc - Mo ta",
"status": "ACTIVE"
}- Thực hiện lấy giá trị ID: “id”: “4c68d5cd-1863-4c85-abd0-f8bcce6443b6”,
- Cấu trúc như sau: “id”: “(.+?)”, (Công việc rất đơn giản, ta thay thế giá trị cần lấy bằng (.+?) là sẽ lấy được giá trị mong muốn)
- “Template”: Mẫu dữ liệu trích xuất từ biểu thức chính quy. Bạn có thể sử dụng các nhóm (group) trong biểu thức chính quy để chỉ định vị trí của dữ liệu cần trích xuất.
Cú pháp ma thuật cho mọi data: “id”: “(.+?)”
- Thực hiện lấy giá trị ID: “id”: “4c68d5cd-1863-4c85-abd0-f8bcce6443b6”,
- Bước 4: Lưu lại các cấu hình và chạy kiểm thử.
Khi kiểm thử chạy và phản hồi hoặc văn bản được nhận từ máy chủ, Regular Expression Extractor sẽ trích xuất dữ liệu từ văn bản và lưu trữ nó vào biến bạn đã chỉ định. Sau đó, bạn có thể sử dụng các giá trị này trong các yêu cầu hoặc các phần khác của kiểm thử.
Ví dụ: Thực hiện lấy categoryName đầu tiên trong ví dụ:
Một số cấu trúc trong extract dữ liệu:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}| Operator | Description |
| $ | The root element to query. This starts all path expressions. |
| @ | The current node being processed by a filter predicate. |
| * | Wildcard. Available anywhere a name or numeric are required. |
| .. | Deep scan. Available anywhere a name is required. |
| .<name> | Dot-notated child |
| [‘<name>’ (, ‘<name>’)] | Bracket-notated child or children |
| [<number> (, <number>)] | Array index or indexes |
| [start:end] | Array slice operator |
| [?(<expression>)] | Filter expression. Expression must evaluate to a boolean value. |
| Operator | Description |
| == | left is equal to right (note that 1 is not equal to ‘1’) |
| != | left is not equal to right |
| < | left is less than right |
| <= | left is less or equal to right |
| > | left is greater than right |
| >= | left is greater than or equal to right |
| =~ | left matches regular expression [?(@.name =~ /foo.*?/i)] |
| in | left exists in right [?(@.size in [‘S’, ‘M’])] |
| nin | left does not exists in right |
| subsetof | left is a subset of right [?(@.sizes subsetof [‘S’, ‘M’, ‘L’])] |
| anyof | left has an intersection with right [?(@.sizes anyof [‘M’, ‘L’])] |
| noneof | left has no intersection with right [?(@.sizes noneof [‘M’, ‘L’])] |
| size | size of left (array or string) should match right |
| empty | left (array or string) should be empty |
| Operator | Description |
| == | left is equal to right (note that 1 is not equal to ‘1’) |
| != | left is not equal to right |
| < | left is less than right |
| <= | left is less or equalto right |
| > | left is greater than right |
| >= | left is greater than or equal to right |
| =~ | left matches regular expression [?(@.name =~ /foo.*?/i)] |
| in | left exists in right [?(@.size in [‘S’, ‘M’])] |
| nin | left does not exists in right |
| subsetof | left is a subset of right [?(@.sizes subsetof [‘S’, ‘M’, ‘L’])] |
| anyof | left has an intersection with right [?(@.sizes anyof [‘M’, ‘L’])] |
| noneof | left has no intersection with right [?(@.sizes noneof [‘M’, ‘L’])] |
| size | size of left (array or string) should match right |
| empty | left (array or string) should be empty |
| JsonPath | Result |
| $.store.book[*].author | The authors of all books |
| $..author | All authors |
| $.store.* | All things, both books and bicycles |
| $.store..price | The price of everything |
| $..book[2] | The third book |
| $..book[-2] | The second to last book |
| $..book[0,1] | The first two books |
| $..book[:2] | All books from index 0 (inclusive) until index 2 (exclusive) |
| $..book[1:2] | All books from index 1 (inclusive) until index 2 (exclusive) |
| $..book[-2:] | Last two books |
| $..book[2:] | All books from index 2 (inclusive) to last |
| $..book[?(@.isbn)] | All books with an ISBN number |
| $.store.book[?(@.price < 10)] | All books in store cheaper than 10 |
| $..book[?(@.price <= $[‘expensive’])] | All books in store that are not “expensive” |
| $..book[?(@.author =~ /.*REES/i)] | All books matching regex (ignore case) |
| $..* | Give me every thing |
| $..book.length() | The number of books |
Tham khảo:
- https://jmeter.apache.org/usermanual/component_reference.html#Regular_Expression_Extractor_parms1
- https://octoperf.com/blog/2017/03/09/how-to-extract-data-from-json-response-using-jmeter/#use-cases
- https://www.blazemeter.com/blog/json-extractor
- https://github.com/json-path/JsonPath

