如何在scala中提取序列

时间:2017-06-29 17:16:59

标签: scala sequence gatling

我是Scala的新手,我正在努力提取我的加特林测试的常见部分。

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      http("x").get("/rest/x/").check(jsonPath("$.x").exists),
      http("y").get("/rest/y/").check(jsonPath("$.y").exists)
    )
)

我怎样才能做到这一点:

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      resources
    )
)

val resources = ...???

.resources签名看起来像这样

def resources(res: HttpRequestBuilder*): 

还有一个...... 由于我要统一传递的一些资源值,因此通常需要添加一些额外的东西,应该使用什么语法来使代码正确无误。

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      common: _*,
      http("z").get("/rest/z/").check(jsonPath("$.z").exists)
    )
)

val common: Seq[HttpRequestBuilder] = Seq(
    http("x").get("/rest/x/").check(jsonPath("$.x").exists),
    http("y").get("/rest/y/").check(jsonPath("$.y").exists)
)

我想出了这个

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      common:+
      http("z").get("/rest/z/").check(jsonPath("$.z").exists): _*
    )
)

但也许有一个"正确的"这样做的方法。

1 个答案:

答案 0 :(得分:1)

val resources: Seq[HttpRequestBuilder] = ??? // Or subtype
...
// Type ascription, but functionally equivalent to other languages' "splat" operators
.resources(resources: _*)

类型归属是expr: Type形式的表达式。这种表达式的类型是Type,编译器必须以某种方式使expr符合该类型。在这里使用varargs的理由是resources的参数是HttpRequestBuilder*(即使没有这样的类型),所以你可以使用类型ascription让编译器解释一个对象键入Seq[HttpRequestBuilder]作为HttpRequestBuilder*,即使这样的类型确实不存在。它使用通配符_,因此您不必输入整个类型名称。

编辑:是的,如果你想将资源列表与其他东西合并,然后将其作为varargs传递,你应该这样做

.resources(somethingelse +: resources: _*)

(使用前置+:,因为根据resources的实施情况,这可能会更有效。)