Использование кормушек гатлинга

Я пытаюсь использовать два фидера Gatling для создания данных HTTP-запроса:

Первый файл содержит несколько полей. Один из них - фишка. Этим значением я хотел бы добавить в тело моего сообщения до строк от второго фидера.

Например :

fileA.csv
---------
fileAId,counter
value,3

fileB.csv
---------
fileBId
stack
overflow

Я хочу построить эту строку: «стек переполнения стека значений».

Я создал сценарий:

object Actions {
    val search = forever() {
        group("Test") {
            exec(feed(FeederUtils.fileAFeeder))
            .exec(  
                http("Test")                                            
                    .post(uri)                          
                    .body(StringBody("""${fileAId} """ +     FeederUtils.generateItems(${counter}.toInt)))
                )
                .pause(20 seconds)
            }
        }
}   

И объект FeederUtils:

object FeederUtils {
    val fileAFeeder= csv("fileA.csv").circular

    var fileBFeeder = csv("fileB.csv").circular

    def generateItems(itemsNumber: Int) : String = {
        var i = 0;
        var returnedString = "";
        for(i <- 0 to itemsNumber) {
            exec(feed(fileBFeeder))
            returnedString = returnedString + """${fileBId} """
        }

        return returnedString ;
    }
}

У меня две проблемы: вызов функции не компилируется (not found: value $) и переменные фидера не существуют в generateItems.

Я новичок в Gatling и Scala, поэтому думаю, что это очевидно, но я не понимаю, как работают функции exec и feed.

Спасибо !

РЕДАКТИРОВАТЬ: Функциональный код ниже:

object FeederUtils {
    val fileAFeeder= csv("fileA.csv").circular

    var fileBVector = csv("fileB.csv").records

    var fileBIterator = 0;

    def generateItems(itemsNumber: Int) : String = {
        var i = 0;
        var returnedString = "";
        for(i <- 0 to itemsNumber) {
            var currentItem = fileBVector(fileBIterator)

            //Circular read
            if (fileBIterator < fileBVector.size) { 
              fileBIterator+=1
            } else {
              fileBIterator=0
            }

            returnedString = returnedString + currentItem("fileBId")
        }

        return returnedString ;
   }
}

object Actions {
    val search = forever() {
        group("Test") {
            exec(feed(FeederUtils.fileAFeeder))
            .exec({session => session.set("generatedString",feederUtils.generateItems(session("counter").as[String].toInt))})
            .exec(  
                http("Test")                                            
                    .post(uri)                          
                    .body(StringBody("""${fileAId} ${generatedString}"""))
                )
                .pause(20 seconds)
            }
        }
} 

Концепция, приведенная ниже: функция feed хранит данные в атрибутах сеанса, которые можно считывать из выражений Gatling EL или вручную с помощью Session API. Пришлось совместить и то, и другое.

Ссылки:

Session API

EL-выражения

Управление сеансом с помощью exec


person N LAMY    schedule 09.12.2014    source источник


Ответы (1)


Вы не можете использовать загрузчик для второго файла. В лучшем случае вы можете извлечь несколько записей одновременно, но имена будут переведены (fileBId1, fileBId2 ...).

Загрузите содержимое второго файла с помощью синтаксического анализатора Gatling csv, чтобы вы могли получить доступ к записям (поле записей) и сохранить их в глобальном значении val.

Подача из первого файла.

Затем напишите exec (функцию), в которой вы:

  • получить счетчик из сеанса
  • сгенерируйте случайное смещение (ThreadLocalRandom), если вы хотите что-то вроде случайной стратегии, или AtomicInteger, которое вы бы увеличили, если хотите что-то вроде круговой стратегии.
  • получить записи из второго файла (используйте модуль размера вектора записей, чтобы получить правильные индексы)
  • вычислите свою последнюю строку

Не пытайтесь использовать Gatling EL в пользовательском коде. См. документ.

person Stephane Landelle    schedule 09.12.2014
comment
Большое спасибо за ваш ответ :) Я добавил функциональный код в исходный пост (я действительно не понимаю, почему нам не разрешено добавлять ответы: всегда редактирование исходного сообщения добавляет слишком много шума и, на мой взгляд, не помогает читать потоки Кроме того, я хотел добавить примеры кода, которые кажутся слишком длинными для комментариев). Если я прав, я могу использовать два фидера, но только если имена столбцов файлов разные? Есть ли только определенные возможности для их использования? - person N LAMY; 10.12.2014
comment
Заголовки столбцов определяют имена атрибутов, поэтому, если вы кормите из нескольких источников с одинаковыми именами, вы в конечном итоге переопределите предыдущие значения. - person Stephane Landelle; 10.12.2014