并行执行多个场景的最佳实践是什么?例如,30%用户执行scenario1和70%用户scenario2.
代码是以正确的方式进行还是更好的方法是让一个方案具有REST调用的contional执行?
class MySimulation extends Simulation {
val userIdsData = csv(userIdsCSV).queue
...
val scenario1 = scenario("Scenario 1")
.feed(userIdsData)
.get(...)
val scenario2 = scenario("Scenario 2")
.feed(userIdsData)
.get(...)
.post(...)
setUp(scenario1.inject(rampUsers(30) over (ramp seconds))
.protocols(HttpConfig.value(baseURL)),
scenario2.inject(rampUsers(70) over (ramp seconds))
.protocols(HttpConfig.value(baseURL))
)
}
Run Code Online (Sandbox Code Playgroud) 我需要每次创建一个随机正整数并将其发送到Gatling中的Json体.
我使用下面的代码创建一个随机的正向ineger:
val r = new scala.util.Random;
val OrderRef = r.nextInt(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)
但是,如何将随机生成的值提供给json体?
我试过了:
.exec(http("OrderCreation")
.post("/abc/orders")
.body(StringBody("""{ "orderReference": "${OrderRef}"}""").asJson)
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用.请给我任何线索.
谢谢!
我正在尝试将Gatling中的一系列性能测试模块化.
有几个测试通过页面执行相同的初始路径,所以我认为我可以将它们分解为一系列场景,每个场景都是在其自己的文件中定义的一系列共享操作,然后是最终的模拟定义一个接一个地执行指定的方案.
然后我需要的是我的模拟按顺序运行这些场景; 但我只能找到如何同时运行它们,或者每个运行它们之间的指定延迟.是否有任何模拟设置选项可以一个接一个地运行已定义的方案而不指定任意延迟?
编辑
目前,我有以下文件集:
homepageHeaders.scala
package advanced
object homepageHeaders {
val homepage_headers_1 = Map(
"Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8""",
"If-Modified-Since" -> """Wed, 20 Mar 2013 15:36:31 +0000""",
"If-None-Match" -> """"1363793791""""
)
}
Run Code Online (Sandbox Code Playgroud)
homepageChain.scala
package advanced
import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import com.excilys.ebi.gatling.jdbc.Predef._
import akka.util.duration._
import homepageHeaders._
object homepageChain {
val homepageChain =
//Homepage
exec(http("homepage")
.get("/")
.headers(homepageHeaders.homepage_headers_1)
)
}
Run Code Online (Sandbox Code Playgroud)
pageHeaders.scala
package advanced
object pageHeaders {
val page_headers_1 = Map(
"Accept" -> """text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"""
)
}
Run Code Online (Sandbox Code Playgroud)
pageChain.scala
package advanced
import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import …
Run Code Online (Sandbox Code Playgroud) 我怎么能调试或运行BasicSimulation.scala?现在我使用sbt命令运行:
testOnly simulations:BasicSimulation
还有其他简单的调试方法吗?谢谢.
我是Gatling(2.1.2)的新手,想要做一个小型原型项目给同事们展示.
根据快速入门页面,有几种方法可以用Gatling运行模拟:
gatling-maven-plugin
maven插件执行模拟.gatling-highcharts-maven-archetype
,创建一个项目,并运行Engine类.我发现了那些问题
对于1,很难为模拟类添加依赖项.我必须弄清楚需要什么罐子并将它们放到lib文件夹中.
对于2,它需要安装maven.
对于3,它只从IDE运行
我只想要一个简单的可执行JAR文件,其中所有依赖项捆绑在一起(我的模拟,加特林和第三方),并从任何机器(如EC2实例)运行它.
有没有办法实现这个目标?
更新1:
我尝试了方法3,但将所有项目文件从test
文件夹移动到main
,并用于maven-assembly-plugin
构建具有依赖项的jar.当我尝试运行该文件时,出现以下错误:
Exception in thread "main" java.lang.ExceptionInInitializerError
at Engine$.delayedEndpoint$Engine$1(Engine.scala:7)
at Engine$delayedInit$body.apply(Engine.scala:4)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at Engine$.main(Engine.scala:4)
at Engine.main(Engine.scala)
Caused by: java.nio.file.FileSystemNotFoundException
at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
at java.nio.file.Paths.get(Paths.java:143)
at io.gatling.core.util.PathHelper$.uri2path(PathHelper.scala:32)
at IDEPathHelper$.<init>(IDEPathHelper.scala:7)
at IDEPathHelper$.<clinit>(IDEPathHelper.scala)
... 11 more
Run Code Online (Sandbox Code Playgroud)
我想这与Gatling配置有关,但不知道出了什么问题.
我想看看我在剧本中发送的帖子正文中有什么内容.事实上,我希望看到请求,请求正文和响应.从查看文档和论坛,我看到我可以取消注释logback-test.xml中的一行,我做了如下所示
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} - %msg%n%rEx</pattern>
<immediateFlush>false</immediateFlush>
</encoder>
</appender>
<!-- Uncomment for logging ALL HTTP request and responses -->
<logger name="io.gatling.http" level="TRACE" />
<!-- Uncomment for logging ONLY FAILED HTTP request and responses -->
<!--<logger name="io.gatling.http" level="DEBUG" /> -->
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
Run Code Online (Sandbox Code Playgroud)
simulation.log文件和控制台向我显示请求,响应等.经过一些谷歌搜索和阅读文档后,我看到我可以这样做 -
.extraInfoExtractor(extraInfo => List(extraInfo.request, extraInfo.response,extraInfo.session))
Run Code Online (Sandbox Code Playgroud)
这为我提供了除请求主体以外的所有内容.我如何获得请求正文?我正在尝试调试一个问题,我确信发送的正文不是我真正想要的.
我试图解析服务器返回给gatling的json响应.
我对服务器的回复是:
SessionAttribute(
Session(
GetServices,
3491823964710285818-0,
Map(
gatling.http.cache.etagStore -> Map(https://api.xyz.com/services -> ),
gatling.http.cache.lastModifiedStore -> Map(https://api.xyz.com/services -> ),
myresponse -> {
"created":"2014-12-16T22:06:59.149+0000",
"id":"x8utwb2unq8uey23vpj64t65",
"name":"myservice",
"updated":"2014-12-16T22:06:59.149+0000",
"version":null
}),
1418767654142,622,
OK,List(),<function1>),id)
Run Code Online (Sandbox Code Playgroud)
我在我的脚本中这样做:
val scn = scenario("GetServices")
.exec(http("Get all Services")
.post("/services")
.body(StringBody("""{ "name": "myservice" }""")).asJSON
.headers(sentHeaders)
.check(jsonPath("$")
.saveAs("myresponse"))
).exec(session => {
println(session.get("id"))
session
})
Run Code Online (Sandbox Code Playgroud)
它仍在打印整个响应.我怎样才能检索到的id是"x8utwb2unq8uey23vpj64t65"
什么?
我有一段代码需要循环通过一个从REST服务的响应中获得的JSON数组.(这里有完整的要点.)
.exec(http("Request_1")
.post("/endPoint")
.headers(headers_1)
.body(StringBody("""REQUEST_BODY""")).asJSON
.check(jsonPath("$.result").is("SUCCESS"))
.check(jsonPath("$.data[*]").findAll.saveAs("pList")))
.exec(session => {
println(session)
session
})
.foreach("${pList}", "player"){
exec(session => {
val playerId = JsonPath.query("$.playerId", "${player}")
session.set("playerId", playerId)
})
.exec(http("Request_1")
.post("/endPoint")
.headers(headers_1)
.body(StringBody("""{"playerId":"${playerId}"}""")).asJSON
.check(jsonPath("$.result").is("SUCCESS")))
}
Run Code Online (Sandbox Code Playgroud)
第一个请求的响应格式是
{
"result": "SUCCESS",
"data": [
{
"playerId": 2
},
{
"playerId": 3
},
{
"playerId": 4
}
]
}
Run Code Online (Sandbox Code Playgroud)
并playerId
在会话中显示为
pList -> Vector({playerId=2, score=200}, {playerId=3, score=200}
Run Code Online (Sandbox Code Playgroud)
我在第二次请求中看到了身体
{"playerId":"Right(empty iterator)}
Run Code Online (Sandbox Code Playgroud)
预计:3个身体要求
{"playerId":1}
{"playerId":2}
{"playerId":3}
Run Code Online (Sandbox Code Playgroud)
如果我只保存playerIds,我可以成功遍历结果数组:
.check(jsonPath("$.data[*].playerId").findAll.saveAs("pList")))
Run Code Online (Sandbox Code Playgroud) 我想做一些时髦的闭包式的东西.我想要一个方法来返回一个匿名对象,该对象的guts引用了该方法的参数.这是我写的代码,说明了我的意图:
object SessionManagement {
implicit class SessionManagementExtensions( val c : ChainBuilder ) {
def set( dest: String ) = object {
def from( src: String ) =
c.exec( session => {
val list = session( src ).as[Vector[String]]
val i = if ( list.size == 0 ) -1 else Random.nextInt( list.size )
val value = if ( i > 0 ) list(i) else "INVALID_" + dest
session.set( dest, value )
})
def to[T]( v: Expression[T] ) =
c.exec( session => session.set( …
Run Code Online (Sandbox Code Playgroud) 我想在配置文件中配置我的gatling模拟的基本URL.这样我就可以在测试和实时系统之间轻松切换.
当我在simulation-scala文件中配置它时,我工作得很好:
val httpConf = http
.baseURL("http://computer-database.herokuapp.com")
Run Code Online (Sandbox Code Playgroud)
如果我删除上面的行并在config(gatling.conf)文件中配置它:
gatling {
http {
baseUrls = "http://localhost8080/baserate"
...
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,我的方案不起作用,因为基本网址为空.
09:57:26.352 [ERROR] i.g.c.c.GatlingConfiguration$ - Your gatling.conf file is outdated, some properties have been renamed or removed.
Please update (check gatling.conf in Gatling bundle, or gatling-defaults.conf in gatling-core jar).
Enabled obsolete properties:'gatling.http.baseUrls' was removed, use HttpProtocol.
Run Code Online (Sandbox Code Playgroud)
是否仍然可以在当前版本的gatling中配置基本URL
我的版本是gatling-maven-plugin:2.1.2.