Sử dụng JMeter BeanShell để lấy tham số ngẫu nhiên từ file văn bản

Khi làm việc với JMeter, tính năng parameterization có một hạn chế: mỗi khi parameter xuất hiện trong script, nó sẽ sử dụng cùng một giá trị. Trong thực tế testing, có những trường hợp cần sử dụng nhiều giá trị khác nhau trong cùng một request. Ví dụ, khi test API cho phép thêm nhiều thông tin cùng lúc:

[
{
    "name": "siteA",
    "url": "http://www.sitea.com",
    "page": 100,
    "isActive": true
},
{
    "name": "siteB",
    "url": "http://www.siteb.com",
    "page": 200,
    "isActive": false
},
{
    "name": "siteC",
    "url": "http://www.sitec.com",
    "page": 300,
    "isActive": true
}
]

Nếu sử dụng cách parameterize thông thường của JMeter, tất cả các record sẽ nhận cùng một giá trị. Để giải quyết vấn đề này, ta có thể sử dụng BeanShell để đọc ngẫu nhiên n dòng từ file văn bản (trong ví dụ này n=3).

Dưới đây là đoạn script BeanShell xử lý việc đọc file và lấy tham số ngẫu nhiên:

// Hàm đọc nội dung một dòng cụ thể từ file
public static String docDong(int soDong) throws IOException {
    File tapTin = new File("D:/jscript/data.txt"); // Đường dẫn file
    FileReader docGhi = new FileReader(tapTin);
    InputStreamReader isr = new InputStreamReader(new FileInputStream(tapTin), "UTF-8");
    BufferedReader bufDoc = new BufferedReader(isr);
    String chuoi = "";
    int dem = 0;
    String ketQua = "";
    while (chuoi != null) {
        dem++;
        chuoi = bufDoc.readLine();
        if (dem == soDong) {
            ketQua = chuoi;
        }
    }
    bufDoc.close();
    docGhi.close();
    return ketQua;
}

// Hàm tạo số ngẫu nhiên trong khoảng cho trước
public static int taoSoNgauNhien(int max, int min) {
    Random ngauNhien = new Random();
    return ngauNhien.nextInt(max) % (max - min + 1) + min;
}

// Hàm lấy danh sách tham số ngẫu nhiên
public static ArrayList layThamSo() throws IOException {
    ArrayList mang = new ArrayList();
    while (mang.size() != 3) {
        int soDong = taoSoNgauNhien(2330, 2); // File có tối đa 2330 dòng
        String noiDung = docDong(soDong);
        if (!mang.contains(noiDung)) {
            mang.add(noiDung);
        }
    }
   return mang;
}

// Điểm bắt đầu thực thi
ArrayList danhSach = layThamSo();
for(int i=0;i<danhSach.size();i++){
    String dong = danhSach.get(i);
    String[]  mangItem = dong.split("\\t");
     System.out.println(mangItem[2]);
     vars.put("ten"+String.valueOf(i),mangItem[0]);
     vars.put("lienKet"+String.valueOf(i),mangItem[1]);
     vars.put("soTrang"+String.valueOf(i),mangItem[2]);
     vars.put("hoatDong"+String.valueOf(i),mangItem[3]);

}

Sau khi thực thi script trên, ta có thể sử dụng các biến trong request body như sau:

[
{
    "name": "${ten0}",
    "url": "${lienKet0}",
    "page": ${soTrang0},
    "isActive": ${hoatDong0}
},
{
    "name": "${ten1}",
    "url": "${lienKet1}",
    "page": ${soTrang1},
    "isActive": ${hoatDong1}
},
{
    "name": "${ten2}",
    "url": "${lienKet2}",
    "page": ${soTrang2},
    "isActive": ${hoatDong2}
}
]

Cách tiếp cận này đảm bảo mỗi record trong request sẽ có giá trị khác nhau, phù hợp với các scenario test yêu cầu data đa dạng.

Thẻ: jmeter beanshell performance-testing automation-testing api-testing

Đăng vào ngày 24 tháng 5 lúc 07:23