Я пишу план тестирования Jmeter для загрузки файлов на сервер по частям. Я плохо знаю Java.
Я использовал в то время как контроллер на Сэмплер HTTP-запросов с Препроцессор оболочки бина. Я написал короткий скрипт для получения байтов из файла, теперь проблема, с которой я столкнулся, заключается в следующем: пробоотборник HTTP-запросов принимает путь к файлу в разделе загрузки файлов. Есть ли способ создать файл в памяти в Bean Shell Pre Processor, а затем использовать эту переменную файла памяти в поле «Путь к файлу».
То, что я думаю, теоретически, это возможно. Потому что всякий раз, когда мы загружаем файл, мы сначала берем его в память, а затем отправляем на сервер. Итак, можем ли мы просто создать файл в памяти из байтов (фрагментов по 1 МБ), а затем отправить его как загрузку файла. Вот код, который я написал в препроцессоре Bean Shell
Integer maxChunkSize = new Integer(vars.get("FILE_MAX_SIZE"));
String uploadFilePath = vars.get("UPLOAD_FILE");
uploadFileSize = new File(uploadFilePath).length();
InputStream uploadFile = new BufferedInputStream(new FileInputStream(uploadFilePath));
int offset = whileCounter * maxChunkSize;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] bytes;
int size;
/* creating bytes array to hold file data*/
if (offset < uploadFileSize) {
if (((int) offset + (int) maxChunkSize) < uploadFileSize) {
bytes = new byte[ (int) maxChunkSize];
size = maxChunkSize;
} else {
size = (int) (uploadFileSize - offset);
bytes = new byte[ (int) size];
vars.put("WHILE_LOOP", "0");
}
}
/* printing results for debugging */
/*
log.info(" ============================================================== ");
log.info("While counter " + whileCounter.toString() );
log.info("While loop " + vars.get("WHILE_LOOP").toString() );
log.info("The file to upload is : " + uploadFilePath);
log.info("Maximum Chunk size is : " + maxChunkSize.toString());
log.info("Current Offset is : " + offset.toString());
log.info("The file size is " + uploadFileSize.toString());
log.info(" ============================================================== ");
*/
/* here it is giving method invocation on loop counter 2, so skip method is used */
uploadFile.skip(offset);
int bytesRead = uploadFile.read(bytes, 0, size);
/* write to byte output stream to read as a file */
bos.write(bytes, 0, bytesRead);
/* params for next iteration */
uploadFile.close();
whileCounter++;
vars.put("WHILE_COUNTER", whileCounter.toString() );
Ожидал: альтернатива загрузке файла по частям через JMeter ИЛИ Создайте переменную памяти, которая будет действовать как файл для пути загрузки файла в разделе JMeter Сэмплер HTTP-запросов -> Загрузка файлов.




Я не думаю, что вы можете добиться этого, используя сэмплер HTTP-запрос, варианты, которые я бы рассмотрел, находятся в:
Реализовать загрузку фрагментированного файла с использованием кода Java, не полагаясь на пробоотборник HTTP-запросов JMeter, что-то вроде
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.InputStreamEntity
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost("http://example.com");
File file = new File("/path/to/your/file");
InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), -1, "Your file mime type");
//Alternatively:
//FileEntity reqEntity = new FileEntity(file, "Your file mime type");
reqEntity.setChunked(true);
client.execute(post)
Используйте сэмплер Необработанный HTTP-запрос, который просто отправляет фрагментированные данные по сети (размер фрагмента можно контролировать с помощью свойства kg.apc.jmeter.samplers.FileReadChunkSize), поэтому вы можете просто записать связанные данные тела запроса с помощью инструмента для анализа, такого как Wireshark, а затем воспроизвести его. с желаемым размером куска. При необходимости ознакомьтесь со статьей Сэмплер JMeter HTTP Raw Request Sampler — когда и как его использовать для получения дополнительной информации.
Также имейте в виду, что начиная с JMeter 3.1 рекомендуется использовать тестовые элементы JSR223 и язык Groovy для сценариев., поэтому рассмотрите возможность перехода на Groovy при следующей возможности.