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
ребята имеют в виду.