无法使代码在 Jmeter 的 Beanshell 预处理器中工作

Unable to make code work in Jmeter´s Beanshell PreProcessor

我正在使用 Apache Jmeter 的内置 WebDriver Sampler(使用 Java脚本)进行一些网络抓取。

在测试开始之前,我需要执行一定数量的函数来构建一个匹配某些前端验证的特定用户 ID。

为此,我在 WebDriver 采样器提供的每个脚本块中声明并使用了这些函数。

因为,我需要 运行 做的那些功能只需要在整个测试计划中执行一次(刚开始时),我想知道是否有办法在一个BeanShell 预处理器。由于我的代码有效但最初是在 Javascript 上制作的,因此我尝试将其翻译为 Java 以便能够在 Beanshell 中使用它们。

我在 运行 测试时不断收到以下错误:

ERROR o.a.j.u.BeanShellInterpreter: 
Error invoking bsh method: eval Sourced file: inline evaluation of: ``//String DICTIONARY = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
String[] DICTIONARY = {"A"," . . . '' : Typed variable declaration : Typed variable declaration : Typed variable declaration

我原来的 java 脚本代码如下(这个在 WebDriver Sampler 的代码块中使用时有效):

    var DICTIONARY = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     
    function generateRandomString(length, dictionary) {
        var result = '';
        for ( var i = 0; i < length; i++ ) {
            result += dictionary.charAt(Math.floor(Math.random() * dictionary.length));
        }
        return result;
    }
    
    function countChars(character, sentence){
        var count = 0
        for(var i=0; i<sentence.length; i++) {
               if (sentence[i] === character) count++
        }
        return count
    }
     
    function hasConsecutivesChars(sentence, length) {
            var charCounter = {}
        for (var i = 0; i < sentence.length; i++) {
                var currentChar = sentence[i]
                if (countChars(currentChar, sentence) >= length) { 
            return true
                }
        }
        return false
    }
     
    function generateRandomStringWithoutConsecutivesChars(length, maxConsecutiveChars, dictionary, maxTries) {
        var isValidString = false
        var randomString = ''
        var tries = 0;
        while(!isValidString && tries <= maxTries) {
            randomString = generateRandomString(length, dictionary)
                var isValidString = !hasConsecutivesChars(randomString, maxConsecutiveChars)
                tries++;
         }
        return randomString 
    }
    
    function randomIntFromInterval(min, max) { // mínimo y máximo incluidos
        return Math.floor(Math.random() * (max - min + 1) + min)
    }
    
    var nombreUsuario = "SELENIUM_" + generateRandomStringWithoutConsecutivesChars(5, 3, DICTIONARY, 100) + randomIntFromInterval(1, 9);

这里是翻译成 java 并在 BeanShell 预处理器(失败的那个)中实现的相同代码:

String[] DICTIONARY = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};

String generateRandomString(int length, String[] dictionary) {
    String result = "";
    for ( int i = 0; i < length; i++ ) {
        //result += dictionary.charAt(Math.floor(Math.random() * dictionary.length));
        result += dictionary[Math.floor(Math.random() * 26)];
    }
    return result;
}

int countChars(String character, String sentence){
    int count = 0;
    for(int i=0; i<5; i++) {
           //if (sentence[i] == character){ 
           if (sentence.charAt(i) == character){ 
            count++;
           }
    }
    return count;
}
 
boolean hasConsecutivesChars(String sentence, int length) {

    for (int i = 0; i < 5; i++) {
            String currentChar = sentence.charAt(i);
            if (countChars(currentChar, sentence) >= length) { 
        return true;
            }
    }
    return false;
}
 
String generateRandomStringWithoutConsecutivesChars(int length, int maxConsecutiveChars, String[] dictionary, int maxTries) {
    boolean isValidString = false;
    String randomString = "";
    int tries = 0;
    while(!isValidString && tries <= maxTries) {
        String randomString = generateRandomString(length, dictionary);
            boolean isValidString = !hasConsecutivesChars(randomString, maxConsecutiveChars);
            tries++;
     }
    return randomString; 
}

int randomIntFromInterval(int min, int max) { // mínimo y máximo incluidos
    return Math.floor(Math.random() * (max - min + 1) + min);
}

String id = generateRandomStringWithoutConsecutivesChars(5, 3, DICTIONARY, 100) + randomIntFromInterval(1, 9);

vars.put("id", id);

log.info(id);

旁注:您会注意到翻译后的代码与其原始的java脚本副本并不完全相同。这些是我所做的一些更改,因为我无法访问 Java 中的字符串长度,就像我在 javascript.

中所做的那样

另外,请原谅我生疏的英语,这不是我的母语。

提前谢谢大家!

首先你知道JMeter自带的还是RandomStringUtilsclass?

如果您仍想 re-invent 轮子,请告知 since JMeter 3.1 you're supposed to be using JSR223 Test Elements and Groovy language for scripting so consider switching to the JSR223 PreProcessor 代码如下:

String[] DICTIONARY = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];

String generateRandomString(int length, String[] dictionary) {
    String result = "";
    for (int i = 0; i < length; i++) {
        //result += dictionary.charAt(Math.floor(Math.random() * dictionary.length));
        result += dictionary[Math.floor(Math.random() * 26) as int];
    }
    return result;
}

int countChars(String character, String sentence) {
    int count = 0;
    for (int i = 0; i < 5; i++) {
        //if (sentence[i] == character){
        if (sentence.charAt(i) == character as char) {
            count++;
        }
    }
    return count;
}

boolean hasConsecutivesChars(String sentence, int length) {

    for (int i = 0; i < 5; i++) {
        String currentChar = sentence.charAt(i);
        if (countChars(currentChar, sentence) >= length) {
            return true;
        }
    }
    return false;
}

String generateRandomStringWithoutConsecutivesChars(int length, int maxConsecutiveChars, String[] dictionary, int maxTries) {
    boolean isValidString = false;
    String randomString = "";
    int tries = 0;
    while (!isValidString && tries <= maxTries) {
        randomString = generateRandomString(length, dictionary);
        isValidString = !hasConsecutivesChars(randomString, maxConsecutiveChars);
        tries++;
    }
    return randomString;
}

int randomIntFromInterval(int min, int max) { // mínimo y máximo incluidos
    return Math.floor(Math.random() * (max - min + 1) + min);
}

String id = generateRandomStringWithoutConsecutivesChars(5, 3, DICTIONARY, 100) + randomIntFromInterval(1, 9);

vars.put("id", id);

log.info(id);