在加特林场景之外进行 Http 调用
Make Http call outside of a scenario in gatling
我的用例是进行 http 调用,从响应中的位置 header 获取重定向 url,然后使用此 url 执行我的负载测试。此 url 是动态生成的,因此是初始的第一个 http 调用。请注意,测试第一个 http 调用不是我测试的一部分。实现这一目标的最佳方法是什么?在 gatling 中是否有类似 @BeforeMethod 的等价物?加特林本身可以用来进行独立的 http 调用,还是我需要使用基本的 scala 来实现这一点?到目前为止我有这个:
val httpConfig = http
.inferHtmlResources()
.acceptHeader("*/*")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("en-US,en;q=0.5")
.header("Authorization", "Negotiate " + token)
.doNotTrackHeader("1")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")
val scn = scenario("My Tests").exec(http("Health check")
.get("https://example-server.com")
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
我对gatling和scala的理解有限。因此这个基本问题。
您可以在 Simulation
.
的构造函数中进行任何需要的处理
这将是 运行 加特林 运行 时间,就在场景开始之前。
即
class MyTestWithDynamicTarget extends Simulation {
val targetUrl = loadTarget()
val scn = scenario("My Tests")
.exec(http("Health check")
.get(targetUrl)
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
/**
* Fetch the current location of the service under test, which is returned
* in the "Location" header of an HTTP request
*/
def loadTarget() = {
??? // see e.g.
}
}
(场景 API 确实提供了 "before" 和 "after" 挂钩(参见 docs here)但是没有简单的方法将信息从这些挂钩传递到场景中配置,因为你需要在这里做。)
您可以将 URL 保存到 header 中的某个变量或在 运行 某些情况下从响应中保存。试试下面的代码也许有帮助:
val httpConfig = http
.inferHtmlResources()
.acceptHeader("*/*")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("en-US,en;q=0.5")
.header("Authorization", "Negotiate " + token)
.doNotTrackHeader("1")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")
val scn = scenario("My Tests").exec(http("Health check")
.get("https://example-server.com")
.check(status.is(200)))
val scnForGetLocation = scenario("GetLocationHeader").exec(http("Location")
.get("https://example-server.com")
.check(status.is(200))
.check(header("Location").saveAs("url")))
val testOne = scenario("testOne").exec(http("testOne") //Your actual test
.get("${url}")
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
这取决于您希望如何处理第一次 HTTP 调用。我看到两种可能性:
- 每次模拟获取重定向 URL 一次,然后在模拟中多次调用同一个重定向 URL。在那种情况下,从加特林的角度来看,第一次调用将不会成为模拟的一部分。
- 在模拟中为每个用户独立获取重定向 URL,然后调用不同的重定向 URL 一次(或 N-times)。在这种情况下,第一个呼叫将是模拟的一部分,但您可以使用
group(name){...}
对呼叫进行分组,这样您将获得每个组的单独统计信息。
如果我正确理解了你的问题,你就会对第一个解决方案感兴趣。在这种情况下,您将需要使用一些外部 HTTP 客户端并生成该重定向 URL。当你可以放置任何逻辑时,Gatling 有 before{}
块(尽管你不能在那里使用 Gatling DSL)但老实说我只会在模拟的构造函数中这样做 class 例如如果重定向 url 作为 Location
header 返回,您可以使用 Apache HTTP 客户端获取它:
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
class RedirectSimulation extends Simulation {
val redirectUrl = HttpClients.createDefault
.execute(new HttpGet("http://redirectgenerator/getRedirect"))
.getLastHeader("Location")
.getValue
val scn = scenario("Test redirect url")
.exec(
http("Get response").get(redirectUrl)
)
setUp(scn.inject(atOnceUsers(10)))
}
我的用例是进行 http 调用,从响应中的位置 header 获取重定向 url,然后使用此 url 执行我的负载测试。此 url 是动态生成的,因此是初始的第一个 http 调用。请注意,测试第一个 http 调用不是我测试的一部分。实现这一目标的最佳方法是什么?在 gatling 中是否有类似 @BeforeMethod 的等价物?加特林本身可以用来进行独立的 http 调用,还是我需要使用基本的 scala 来实现这一点?到目前为止我有这个:
val httpConfig = http
.inferHtmlResources()
.acceptHeader("*/*")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("en-US,en;q=0.5")
.header("Authorization", "Negotiate " + token)
.doNotTrackHeader("1")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")
val scn = scenario("My Tests").exec(http("Health check")
.get("https://example-server.com")
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
我对gatling和scala的理解有限。因此这个基本问题。
您可以在 Simulation
.
这将是 运行 加特林 运行 时间,就在场景开始之前。
即
class MyTestWithDynamicTarget extends Simulation {
val targetUrl = loadTarget()
val scn = scenario("My Tests")
.exec(http("Health check")
.get(targetUrl)
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
/**
* Fetch the current location of the service under test, which is returned
* in the "Location" header of an HTTP request
*/
def loadTarget() = {
??? // see e.g.
}
}
(场景 API 确实提供了 "before" 和 "after" 挂钩(参见 docs here)但是没有简单的方法将信息从这些挂钩传递到场景中配置,因为你需要在这里做。)
您可以将 URL 保存到 header 中的某个变量或在 运行 某些情况下从响应中保存。试试下面的代码也许有帮助:
val httpConfig = http
.inferHtmlResources()
.acceptHeader("*/*")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("en-US,en;q=0.5")
.header("Authorization", "Negotiate " + token)
.doNotTrackHeader("1")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0")
val scn = scenario("My Tests").exec(http("Health check")
.get("https://example-server.com")
.check(status.is(200)))
val scnForGetLocation = scenario("GetLocationHeader").exec(http("Location")
.get("https://example-server.com")
.check(status.is(200))
.check(header("Location").saveAs("url")))
val testOne = scenario("testOne").exec(http("testOne") //Your actual test
.get("${url}")
.check(status.is(200)))
setUp(
scn.inject(atOnceUsers(10))
).protocols(httpConfig)
这取决于您希望如何处理第一次 HTTP 调用。我看到两种可能性:
- 每次模拟获取重定向 URL 一次,然后在模拟中多次调用同一个重定向 URL。在那种情况下,从加特林的角度来看,第一次调用将不会成为模拟的一部分。
- 在模拟中为每个用户独立获取重定向 URL,然后调用不同的重定向 URL 一次(或 N-times)。在这种情况下,第一个呼叫将是模拟的一部分,但您可以使用
group(name){...}
对呼叫进行分组,这样您将获得每个组的单独统计信息。
如果我正确理解了你的问题,你就会对第一个解决方案感兴趣。在这种情况下,您将需要使用一些外部 HTTP 客户端并生成该重定向 URL。当你可以放置任何逻辑时,Gatling 有 before{}
块(尽管你不能在那里使用 Gatling DSL)但老实说我只会在模拟的构造函数中这样做 class 例如如果重定向 url 作为 Location
header 返回,您可以使用 Apache HTTP 客户端获取它:
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClients
class RedirectSimulation extends Simulation {
val redirectUrl = HttpClients.createDefault
.execute(new HttpGet("http://redirectgenerator/getRedirect"))
.getLastHeader("Location")
.getValue
val scn = scenario("Test redirect url")
.exec(
http("Get response").get(redirectUrl)
)
setUp(scn.inject(atOnceUsers(10)))
}