Как читать из файла кусками для загрузки в Jmeter? - PullRequest
0 голосов
/ 30 января 2019

Я пишу план тестирования Jmeter для загрузки файлов на сервер кусками.Я немного знаю Java.

Я использовал , в то время как контроллер на Sampler запросов HTTP с препроцессором Bean Shell .Я написал короткий скрипт для получения байтов из файла, теперь проблема, с которой я сталкиваюсь: HTTP Sampler Request берет путь к файлу в разделе загрузки файлов.Есть ли способ создать файл в памяти в Bean Shell Pre Processor, а затем использовать эту переменную файла памяти в поле File Path.

То, что я считаю теоретически, возможно.Потому что всякий раз, когда мы загружаем файл, мы сначала записываем его в память, а затем отправляем на сервер.Итак, можем ли мы просто создать файл в памяти из байтов (кусков по 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 Request Sampler -> Загрузка файлов Раздел.

1 Ответ

0 голосов
/ 31 января 2019

Я не думаю, что вы можете достичь этого, используя HTTP-запрос сэмплер, я бы рассмотрел следующие варианты:

  1. Реализация загрузки фрагментированных файловиспользуя код Java без использования сэмплера HTTP Request 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)
    
  2. Перейти к сэмплеру HTTP Raw Request , который просто отправляет фрагментированные данные черезwire (размер фрагмента можно контролировать с помощью свойства kg.apc.jmeter.samplers.FileReadChunkSize), поэтому вы можете просто записать связанные данные тела запроса, используя инструмент анализа, такой как Wireshark , и затем воспроизвести его с желаемым размером фрагмента.Проверьте JMeter HTTP Raw Sampler Request - Когда и как его использовать Статья для получения дополнительной информации, если это необходимо.

  3. Также имейте в виду, что начиная с JMeter 3.1для сценариев рекомендуется использовать тестовые элементы JSR223 и язык Groovy, поэтому рассмотрите возможность перехода на Groovy при следующей доступной возможности.

...