Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Gatling + Scala. Создать loop в тесте


(Natalja Librante Lace) #1

Судя по обсуждению Gatling, я так поняла, что здесь есть люди понимающие и в этом инструменте и в Scala. Поэтому попробую задать свой вопрос здесь, прежде чем идти в официальную группу (как-то не удается сформулировать вопрос по-английски, надеюсь на родном языке это получится лучше :smile: )
В ходе нагрузочного теста вызываются библиотеки.
Тест-кейс:
Вызываю первый раз библиотеку, получаю параметр dictionary_sync2
В новый запрос подставляю полученный параметр ${dictionary_sync2}. Получаю респонс, в котором беру новый номер библиотеки dictionary_sync2 (новая переменная с таким-же именем запоминается “поверх” старой)
Делаю новый запрос, в который подставляю переменную dictionary_sync2 и так по лупу, пока в респонсе приходит нужная мне переменная.

Я написала следующий код:

 val request_dictionary = exec(http("request_dictionary") //получаю переменную первый раз
      .post("""/dict""")
      .headers(headers_Content_Length_0)
      .param("""request""", """<request type="sync" version="1.1"> <dictionary sync_ts="${dictionary_sync}"/></request>""")
      .check(
        xpath("/example/dictionary/@sync_ts")
          .find
          .dontValidate
          .saveAs("dictionary_sync2")
      )
   )

Далее мне надо как-то “закуклить” следующий запрос - Т.е. мне надо делать один и тот же запрос до тех пор, пока переменная dictionary_sync2 не придет пустой. Это может быть на 10 или на 5 “круге”: Чувствую, что делаю что-то не так, но не могу понять как правильно его зациклить на самом себе и при этом не сделать loop бесконечным. В таком варианте я получаю ошибку:
14:19:36.750 [ERROR] i.g.c.a.InnerWhile - Could not evaluate condition: Can’t cast value 2014.06.19 18:24:52.311 of type class java.lang.String into interface scala.collection.Seq, exiting loop

    val request_new_dictionary = foreach ("${dictionary_sync2}", "dictionary_sync2") {
        doIf(session => session("dictionary_sync2").as[String].length > 0){
        exec(http("request_new_dictionary")
        .post("""/dict""")
        .headers(headers_Content_Length_0)
        .param("""request""", """<request type="sync" version="1.1"> <dictionary sync_ts="${dictionary_sync2}"/></request>""")
        .check(
          xpath("/response/dictionary/@sync_ts")
            .find
            .dontValidate
            .saveAs("dictionary_sync2")
        )
      )
}
    }

убираю условие foreach ("${dictionary_sync2}", “dictionary_sync2”) - запрос отправляется только один раз

P.S В Scala - я полный ноль. У меня “родной” язык - Java


(Dmitry Cheremushkin) #2

Доброго времени суток.


Не полностью мне понятен ваш код… но попробуйте так:

    val request_new_dictionary = do {
        exec(http("request_new_dictionary")
          .post("""/dict""")
          .headers(headers_Content_Length_0)
          .param("""request""", """<request type="sync" version="1.1"> <dictionary sync_ts="${dictionary_sync2}"/></request>""")
          .check(
            xpath("/response/dictionary/@sync_ts")
              .find
              .dontValidate
              .saveAs("dictionary_sync2")
          )
        )
    } while ( session("dictionary_sync2").as[String].length > 0 )

(Natalja Librante Lace) #3

Все еще мучаюсь с циклом, теперь он у меня уходит в бесконечный луп и прописать в Гатлинге из него выход у меня не получается. В офф-группе тоже не нашла ответов:
теперь реквест выглядит так

        val request_new_dictionary = 
         asLongAs(session => session("dictionary_sync2").as[String].length() > 0){
                exec(http("request_new_dictionary")
                .post("""/test/test""")
                .headers(headers_Content_Length_0)
                .param("""request""", """<request type="sync" context="12345"   version="1.1"> <dictionary sync_ts="${dictionary_sync2}"/></request>""")
    
        //Здесь необходимо обнулить параметр "dictionary_sync2" 
       // я пробовала, но код не компилится 
        {exec(session => session.set(("dictionary_sync2").as[String] -> ""))}
                 .check(
                  xpath("/response/dictionary/@sync_ts").exists
                  xpath("/response/dictionary/@sync_ts").find.saveAs("dictionary_sync2")
)}

Если xpath не существует, то последняя полученная переменная “dictionary_sync2” не удаляется и соответственно условие выхода из цикла не наступает.