2016-03-17 3 views
0

Я пытаюсь конкатенировать вектор в строку, чтобы вставить его в вызов get.Объединить вектор в Gatling

Ранее в моем коде я использую следующее:

.exec(http("request_11") 
     .get("/api/data/users/${userId}") 
     .headers(headers_3) 
     .check(jsonPath("$..users[0].links.orgRoles[*]").findAll.saveAs("orgRoles"))) 

Который дает мне переменную orgRoles сеанса:

Vector(b2b5fb81-4025-48a5-9890-a6ec7d64f317, 744db047-1477-4bb6-9c55-70071ce41cb8, 423b0b07-7bfa-416a-9b95-cc1d75d7d781)

я тогда хотел использовать этот каскадный переменный сеанс следующим образом:

.exec(http("request_50") 
     .get("/api/data/orgRoles/${orgRoles}") 

Что бы на самом деле вызвало следующее:

.exec(http("request_50") 
     .get("/api/data/orgRoles/b2b5fb81-4025-48a5-9890-a6ec7d64f317,744db047-1477-4bb6-9c55-70071ce41cb8,423b0b07-7bfa-416a-9b95-cc1d75d7d781") 
     .headers(headers_3)) 

Я новичок в Gatling и Scala и провел массу исследований. Я нашел следующий answer, который предлагает, что

session => session("itemIds").validate[Seq[String]].map(_.mkString(",")) 

это правильный подход. В свою очередь, я пытался манипулировать переменной сеанса с нижеследующим:

... 
.exec { session => 
     session("orgRoles").map(_.mkString(",")) 
    } 
.exec(http("request_50") 
    .get("/api/data/orgRoles/${orgRoles}") 
    .headers(headers_3)) 
... 

Но в конечном итоге с ошибкой:

value mkString is not a member of io.gatling.core.session.SessionAttribute

Любые предложения о перемещении вперед?

ответ

1

ошибка вы получаете, потому что:

session("orgRoles") 

вы вызов метода Session.apply на экземпляре сеанса (for more see source code). Метод apply возвращает SessionAttribute экземпляр, который следующие методы:

// Use when you are certain that key exists in session, otherwise you'll get exception which you has to handle 
def as[T: NotNothing]: T 
// Use when you want to handle also not existing key and you can react to `None` case 
def asOption[T: TypeCaster: ClassTag: NotNothing]: Option[T] 
// Use when you want to code against success path and use combinators provided by `Validation` 
def validate[T: TypeCaster: ClassTag: NotNothing]: Validation[T] 

каждого сервера другой цели (см комментарии). Все вышеупомянутые методы SessionAttribute - это всего лишь getters from session. Их единственная цель - предоставить вам значение ключа, хранящегося в сеансе, в любой форме.

Только после получения значения вы можете с ним что-либо сделать. Самая безопасная ставка заключается в использовании метода validate, который предоставляет общие комбинаторы (используемые во всех коллекциях Scala) map и flatMap для управления значением, когда оно существует. Вы можете найти более подробную информацию о Validation концепция here. Следовательно, ваш код должен выглядеть так:

// Just getting from session and concatenating 
session => session("orgRoles").validate[Seq[String]].map(_.mkString(",")) 
// also storing back to session 
session => session.set("orgRoles", session("orgRoles").validate[Seq[String]].map(_.mkString(","))) 

Это то, о чем вы уже писали выше.Но вы уже используете метод check DSL и, таким образом, вы можете использовать transform() непосредственно в первый вызов, как:

.exec(
    http("request_11") 
    .get("/api/data/users/${userId}") 
    .headers(headers_3) 
    .check(
     jsonPath("$..users[0].links.orgRoles[*]") 
     .findAll 
     .transform(_.mkString(",")) 
     .saveAs("orgRoles") 
    ) 
) 

Это просто, легче следовать, и нет временного сохранения в Session. Даже функция, которую вы ставите на transform, проще, хотя она определена как A => B, таким образом, простая трансформация. Узнайте больше о преобразовании here.

0

Я в конечном итоге решить ее с этим:

.exec(session => 
      session.set("orgRolesConcat", session("orgRoles").as[Seq[String]].mkString(","))) 
Смежные вопросы