2016-02-17 98 views
0

我想执行两个应该一个接一个执行的方案,第一个方案“生成”的数据应该用作第二个方案的基础。如何使用前一场景中的数据执行场景?

因此,一个案例可能是例如清算信用卡。第一个场景是有授权卡上一定量的/储量:

val auths = scenario("auths").during(durationInMinutes minutes) { 
    feed(credentials) 
     .feed(firstNames) 
     .feed(lastNames) 
     .feed(cards) 
     .feed(amounts) 
     .exec(http("send auth requests") 
      .post(...) 
      .check(...))} 

第二个是有捕捉/从信用卡取量:

val caps = scenario("caps").during(durationInMinutes minutes) { 
    feed(credentials) 
     .feed(RESPONSE_IDS_FROM_PREVIOUS_SCENARIO) 
     .exec(http("send auth requests") 
      .post(...) 
      .check(...))}  

我最初以为关于在检查时使用saveAs(...)选项,但我发现保存的字段只对给定的会话有效。

所以基本上我想保留我从auths场景中获得的ID,并在帽场景中使用它们。

我不能在一个场景中执行这两个步骤,但(saveAs会为此工作),因为我对这两种场景有不同的要求。

回答

0

引用文档:“目前我们的模拟是一个巨大的单片场景,因此首先让我们将它分解为可组合的业务流程,类似于Selenium的PageObject模式,这样,您可以轻松地重用某些部件并在不牺牲维护的情况下构建复杂的行为。“在gatling.io/Advanced Tutorial

因此,您没有用于场景之间通信的内置机制(AFAIK)。建议您以这种方式构建您的代码,以便随后将您的调用与URI结合起来。在你的情况(除了实施细则),你应该有这样的事情:

val auths = feed(credentials) 
    .feed(firstNames) 
    .feed(lastNames) 
    .feed(cards) 
    .feed(amounts) 
    .exec(http("send auth requests") 
     .post(...) 
     .check(...) // extract and store RESPONSE_ID to session 
    ) 

val caps = exec(http("send auth requests") 
     .post(...) // use of RESPONSE_ID from session 
     .check(...)) 

那么你的情况可能是这个样子:

val scn = scenario("auth with caps").exec(auths, caps) // rest omitted 

甚至更​​好的方式来组织你的代码是使用对象。看到提到的教程链接。

更多说明性的例子(其中编译,但同时域名foo.com我没有运行它):

import io.gatling.core.Predef._ 
import io.gatling.http.Predef._ 

class ExampleSimulation extends Simulation { 

    import scala.util.Random 
    import scala.concurrent.duration._ 

    val httpConf = http.baseURL(s"http://foo.com") 

    val emails = Iterator.continually(Map("email" -> (Random.alphanumeric.take(20).mkString + "@foo.com"))) 
    val names = Iterator.continually(Map("name" -> Random.alphanumeric.take(20).mkString)) 

    val getIdByEmail = feed(emails) 
    .exec(
     http("Get By Email") 
     .get("/email/$email") 
     .check(
      jsonPath("userId").saveAs("anId") 
     ) 
    ) 

    val getIdByName = feed(names) 
    .exec(
     http("Get By Name") 
     .get("/name/$name") 
     .check(
      jsonPath("userId").is(session => 
      session("anId").as[String] 
     ) 
     ) 
    ) 

    val scn = scenario("Get and check user id").exec(getIdByEmail, getIdByName).inject(constantUsersPerSec(5) during (5.minutes)) 

    setUp(scn).protocols(httpConf) 
} 

希望这是你在找什么。

+0

不完全。要求是将这两种情况完全分开,以查看“授权”的性能与“上限”的性能。使用建议的解决方案,它将基于它进行一次认证和一次上限,所以两者都结合在一起。 我当然可以将第一个场景中的ID存储到某个文件中,并根据该文件为第二个场景定义一个送料器,但这并不好,我想知道是否可以通过现有的加热机制实现它。 – u6f6o

相关问题