Gửi yêu cầu HTTP và lưu thông tin đơn hàng vào tệp

Công việc cần thực hiện là gửi các yêu cầu đặt hàng liên tục và kiểm tra sự trùng lặp của các mã đơn hàng. Phương pháp được đề xuất là sử dụng JMeter để gửi yêu cầu HTTP, sử dụng biểu thức chính quy để trích xuất mã đơn hàng và chuyển mã đơn hàng cùng với số luồng làm tham số cho yêu cầu Java. Trong yêu cầu Java, mã đơn hàng sẽ được ghi vào một tệp có tên dựa trên số luồng.

Các bước thực hiện như sau:

  1. Gửi yêu cầu HTTP từ JMeter

  2. Tạo một HTTP Header Manager mới

  3. Tạo một HTTP Request mới

  4. Sau khi đặt hàng thành công, phản hồi chứa thông tin như sau: "msg":"Đặt hàng thành công","result":"1","sendCode":"96828628","weektm":"Thứ Hai, 12:00"

Tạo một Regular Expression Extractor để lấy giá trị sau "sendCode":" (\d{8}), kết quả sẽ được lưu trong biến sendCode.

  1. Mã đơn hàng đã được lưu trong biến sendCode, giờ cần ghi nó vào một tệp. Sử dụng "Save Responses to a File" sẽ lưu mỗi phản hồi vào một tệp riêng biệt, không phù hợp vì khó tổng hợp dữ liệu sau này.

Sử dụng yêu cầu Java để xử lý, tạo tên tệp dựa trên số luồng và lưu tất cả các phản hồi của cùng một luồng vào cùng một tệp, tương ứng với số lượng luồng. Yêu cầu Java cần thực hiện các bước sau:

  1. Tạo một lớp Java AppendToFile với chức năng ghi thêm nội dung vào tệp
package writeFile;

import java.io.IOException;
import java.io.RandomAccessFile;

public class AppendToFile {
    public static void main(String[] args) {
        AppendToFile.appendToFile("D:\\data.txt", "1234");
        AppendToFile.appendToFile("D:\\data.txt", "5678");
    }

    public static void appendToFile(String filePath, String content) {
        try {
            RandomAccessFile file = new RandomAccessFile(filePath, "rw");
            long length = file.length();
            file.seek(length);
            file.writeBytes(content + "\r\n");
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. Tạo một lớp Java Request WriteOrderResult để lấy mã đơn hàng và số luồng từ JMeter, sau đó ghi chúng vào tệp. Phương thức runTest sẽ thực hiện các yêu cầu theo định dạng.
package writeFile;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class WriteOrderResult implements JavaSamplerClient {
    private SampleResult result;
    private String orderCode;
    private String threadId;

    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("orderCode", "0");
        params.addArgument("threadId", "0");
        return params;
    }

    public void setupTest(JavaSamplerContext context) {}

    public SampleResult runTest(JavaSamplerContext context) {
        orderCode = context.getParameter("orderCode");
        threadId = context.getParameter("threadId");
        result = new SampleResult();
        result.sampleStart();

        AppendToFile.appendToFile("D:\\orders\\" + threadId + ".txt", orderCode);

        if (orderCode.length() == 8) {
            result.setSuccessful(true);
            result.setResponseData("Thread ID: " + threadId + "| Order Code: " + orderCode, null);
        } else {
            result.setSuccessful(false);
            result.setResponseData("Thread ID: " + threadId + "| Không lấy được mã đơn hàng", null);
        }

        result.sampleEnd();
        return result;
    }

    public void teardownTest(JavaSamplerContext context) {}
}

Xuất thư viện Java dưới dạng JAR và đặt vào thư mục lib/ext của JMeter.

Trong JMeter, thêm một yêu cầu Java và chọn lớp thử nghiệm, hai tham số orderCode và threadId sẽ tự động hiển thị (được định nghĩa trong phương thức getDefaultParameters())

orderCode = ${ordercode}

threadId = ${__threadNum}

Chạy với 3 luồng, kết quả sẽ được lưu trong các tệp riêng biệt.

Có thể sử dụng BeanShell Script để ghi tệp, nhưng cần viết mã như sau:

import writeFile.*;
import org.apache.jmeter.threads.JMeterContextService;
int threadId = JMeterContextService.getNumberOfThreads();
String orderCode = vars.get("ordercode");
AppendToFile.appendToFile("D:\\orders\\result" + threadId + ".txt", orderCode);
System.out.println("Hoàn thành");

Tuy nhiên, mã luồng luôn trả về 1, dẫn đến tất cả các mã đơn hàng đều được lưu vào cùng một tệp. Cần kiểm tra kỹ hơn.

Thẻ: jmeter Java RegularExpression FileHandling

Đăng vào ngày 1 tháng 7 lúc 02:55