HTTP-запрос Jmeter дает 400 при использовании данных, извлеченных из CSV, но отлично работает при ручной передаче данных в теле запроса.

У меня есть два запроса HTTP GET в Jmeter. Первый обращается к серверу и получает CSV-файл, содержащий некоторые пользовательские данные. Используя постпроцессор JSR223, я сопоставляю эти данные с JSON и присваиваю значения трем переменным для передачи во второй запрос. Скрипт для этого ниже.

      import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
import groovy.json.JsonOutput

def response = prev.getResponseDataAsString()
def lines = response.split('\n')

def userData = []
for (int i = 1; i < lines.length; i++) {
    def line = lines[i]
    def tokens = line.split(',')
    userData << [login_type: tokens[0], username: tokens[1], password: tokens[2]]
}

def jsonString = JsonOutput.toJson(userData)
def jsonSlurper = new JsonSlurper()
def jsonMap = jsonSlurper.parseText(jsonString)

for (int i = 1; i <= Math.min(jsonMap.size(), Integer.parseInt("${__P(threads)}")); i++) {
    if(i < jsonMap.size()){
        vars.put("login_type" , jsonMap[Integer.parseInt("${__threadNum}")-1].login_type)
        vars.put("username" , jsonMap[Integer.parseInt("${__threadNum}")-1].username)
        vars.put("password" , jsonMap[Integer.parseInt("${__threadNum}")-1].password)
    }
}

Я передаю эти три переменные в следующем теле запроса как{"login_type":"${login_type}","username":"${username}","password":"${password}"}

При запуске сценария я получаю ответ как 400 для второго запроса, хотя я вижу, что данные передаются.

      POST data:
{"login_type":"data","username":"data","password":"data"}

Я попробовал второй запрос, вручную указав данные для входа вместо переменных, и это работает.{"login_type":"EMAIL","username":"username","password":"pass"}

Единственная разница, которую я вижу в обеих попытках, заключается в заголовке запроса, гдеContent-Length: 83отображается при ручной отправке данных иContent-Length: 84отображается при передаче данных из скрипта groovy. Хотя я не думаю, что это то, что вызывает проблему. Может ли кто-нибудь объяснить, почему это происходит и как это исправить.

Я просмотрел запросы, и в теле запроса POST, поступающем из сценария groovy, есть разрыв строки в конце.

      {"login_type":"login_type","username":"username","password":"password
"}

Следовательно, запрос выдает 400. Как я могу отправить данные тела в одну строку?

1 ответ

Возможно, есть какой-то невидимый символ, такой как пробел или разрыв строки, которые ожидаются вашей тестируемой системой и которые вы не отправляете при заполнении переменных в Groovy.

Используйте инструмент анализа данных, такой как Wireshark или Fiddler , чтобы сравнить оба запроса побайтно и изменить конфигурацию JMeter или код Groovy, чтобы они на 100 % соответствовали "ручному" запросу.

Также в отношении использования вами функций JMeter в сценарии, согласно документации JSR223 Sampler :

У тестовых элементов JSR223 есть функция (компиляция), которая может значительно повысить производительность. Чтобы воспользоваться этой функцией:

  • Используйте файлы сценариев вместо их встраивания. Это заставит JMeter скомпилировать их, если эта функция доступна в ScriptEngine, и кэшировать их.
  • Или используйте текст сценария и установите флажок Кэшировать скомпилированный сценарий, если доступно свойство.

При использовании этой функции убедитесь, что ваш код скрипта не использует переменные JMeter или вызовы функций JMeter непосредственно в коде скрипта, так как кэширование будет кэшировать только первую замену . Вместо этого используйте параметры скрипта.

Итак, замените:

  • ${__P(threads)}сprops.get('threads')
  • ${__threadNum}сctx.getThreadNum()

Для получения дополнительной информации о том, что делают этиpropsиctxребята имеют в виду.

Другие вопросы по тегам