Thiết lập yêu cầu HTTP
Để giải quyết yêu cầu kiểm tra trùng lặp mã đơn hàng trong quy trình test hiệu năng, cần cấu hình JMeter gửi yêu cầu HTTP và xử lý phản hồi. Đầu tiên, thêm thành phần HTTP Header Manager vào Thread Group để thiết lập header chuẩn. Tiếp theo, tạo HTTP Request Sampler với endpoint xử lý đơn hàng.
Xuất mã đơn hàng bằng Regex
Sau khi nhận phản hồi có cấu trúc: "msg":"Thành công","result":"1","orderId":"ORD1234567","time":"14:30", sử dụng Regular Expression Extractor với mẫu sau:
"orderId":"(ORD\d{7})"
Biến orderId sẽ lưu trữ giá trị như ORD1234567. Mẫu regex này trích xuất chuỗi bắt đầu bằng "ORD" theo sau là 7 chữ số.
Xử lý lưu trữ bằng Java Sampler
Thay vì dùng "Save Responses to File", giải pháp tối ưu là triển khai custom Java Sampler để ghi dữ liệu theo luồng. Tạo class OrderFileManager với chức năng ghi nối tiếp vào file:
package orderhandler;
import java.io.RandomAccessFile;
import java.util.HashSet;
import java.util.Set;
public class OrderFileManager {
public static void saveOrder(String filePath, String content) {
try (RandomAccessFile file = new RandomAccessFile(filePath, "rw")) {
file.seek(file.length());
file.writeBytes(content + "\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean hasDuplicate(String filePath, String newOrder) {
Set<String> orderSet = new HashSet<>();
try (var reader = new java.io.BufferedReader(
new java.io.FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
if (!orderSet.add(line)) {
saveOrder("/jmeter/duplicates.log", line);
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
Tiếp theo, triển khai class OrderLogger làm việc với JMeter:
package orderhandler;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class OrderLogger implements JavaSamplerClient {
private String currentOrderId;
private String threadId;
public SampleResult runTest(JavaSamplerContext context) {
currentOrderId = context.getParameter("orderId");
threadId = context.getParameter("threadId");
SampleResult result = new SampleResult();
result.sampleStart();
try {
String filePath = "/jmeter/orders_" + threadId + ".log";
OrderFileManager.saveOrder(filePath, currentOrderId);
if (currentOrderId.matches("ORD\\d{7}")) {
result.setResponseData("Luồng " + threadId + " - Đơn: " + currentOrderId, null);
result.setSuccessful(true);
} else {
result.setResponseData("Lỗi định dạng mã đơn", null);
result.setSuccessful(false);
}
} finally {
result.sampleEnd();
}
return result;
}
public Arguments getDefaultParameters() {
Arguments args = new Arguments();
args.addArgument("orderId", "");
args.addArgument("threadId", "");
return args;
}
}
Quy trình triển khai:
- Xuất file JAR từ project Java và đặt vào thư mục
/lib/extcủa JMeter - Thêm Java Request Sampler vào Thread Group
- Cấu hình tham số:
orderId = ${orderId}threadId = ${__threadNum}
Mỗi luồng sẽ ghi dữ liệu vào file riêng (ví dụ: orders_3.log). Khi phát hiện mã đơn trùng lặp, hệ thống tự động lưu vào duplicates.log để phân tích sau.