我使用Firefox创建了完全相同的演示场景(在网站主页上登陆)并使用Gatling和Jmeter来测试工具。
当我用500 VU执行它们(逐个)30秒时,响应时间(带加特林的800毫秒和Jmeter超过3000毫秒)之间的差异很大,而JMeter显示超过29的失败%虽然加特林仅显示1%
哪一个值得信任?
由于申请仍处于开发阶段,Gatling似乎不可靠,因为我们知道响应时间通常约为2.5秒。
答案 0 :(得分:6)
不要相信他们中的任何一个。我的期望是,使用JMeter,您不仅记录了主要请求(登陆网站主页),还记录了一系列对所谓“嵌入式资源”的请求 - 图像,脚本,样式等,Gatling不记录这种形式的请求。
这非常重要,因为通常这些嵌入式资源比主响应“更重”,因此您需要注意这一点。
配置负载测试工具以自动获取嵌入资源。
inferHtmlResources
method. 不要忘记缓存。真正的浏览器下载这些图像,脚本和样式,但只执行一次,实际上没有进行后续请求,从浏览器的缓存中返回资源。
有关详细信息,请参阅Web Testing with JMeter: How To Properly Handle Embedded Resources in HTML Responses,本文是面向JMeter的,但在Web应用程序性能测试方面,相同的建议适用于任何负载测试工具。
答案 1 :(得分:0)
您似乎已经回答了自己的问题,因为jMeter(3000ms)的响应时间接近您自己静止(2500ms)的观察响应时间。
对于每个负载提供程序(jmeter vs gatling),您应该将负载测试日志与来自Web服务器的日志合并,并绘制来自负载提供程序与Web服务器的响应时间。
哪个图表的值最接近,这是我接受的值。
答案 2 :(得分:0)
答案 3 :(得分:0)
回应@DmitriT第1点和第2点。
通过gatling,还有另一种以更加可控的方式下载资源的方法:使用 .resources()方法,并列出尽可能多的http("")请求你想要的,它们都将并行执行。为了使其更加逼真,将它与HttpProtocolBuilder设置相结合,例如: .maxConnectionsPerHostLikeChrome 更接近现实。我使用这种方法,因为我的资源也可能有来自先前请求的动态链接,例如:
With gatling there is another way of downloading resources in a more controlled way: User the **.resources()** method, and list as many http("") requests as you want, they will all be executed in parallel. And to make it more realistic, combine it with HttpProtocolBuilder settings like : **.maxConnectionsPerHostLikeChrome** to be closer to reality. I use this approach since my resources might also have dynamic links got from previous requests, ex : `tryMax(1) {
group("<-- EMP : Login Page -->") {
exec(
http("EMP : Login Page - login.html ")
.get("/admin-ng/login.html")
.check(regex("/admin-ng/scripts/login.[^\"]*.js").find.saveAs("login_js"))
.check(regex("/admin-ng/login.[^\"]*.css").find.saveAs("login_css"))
.check(regex("/admin-ng/scripts/loginVendors.[^\"]*.js").find.saveAs("loginVendors_js"))
.resources(
http("EMP : Login Page => Asset 1 - login.xxx.css")
.get(session => session("login_css").as[String])
.check(regex("([^\\.]*?\\.woff2)").findAll.saveAs("listOfFontsWoff2"))
.check(regex("([^\\.]*?\\.woff(?=[^2]))").findAll.saveAs("listOfFontsWoff")),
http("EMP : Login Page => Asset 2 - login.xxx.js")
.get(session => session("login_js").as[String]),
http("EMP : Login Page => Asset 3 - loginVendors.xxx.js")
.get(session => session("loginVendors_js").as[String])
)
)
.exec(
http("")
.get("")
.silent
.resources(
http("EMP : Login Page => Asset 4 - .min.js")
.get("/nr-spa-974.min.js"),
http("EMP : Login Page => Asset 5 - woff2 (index: 3)")
.get(session => session("listOfFontsWoff2").as[Seq[String]].apply(3)),
http("EMP : Login Page => Asset 6 - woff2 (index: 2)")
.get(session => session("listOfFontsWoff2").as[Seq[String]].apply(2)),
http("EMP : Login Page => Asset 7 - woff2 (index: 5)")
.get(session => session("listOfFontsWoff2").as[Seq[String]].apply(5))
)
)
}
}`
此代码分两个阶段执行,与浏览器相同:
.resources()
方法中并行下载它们。login_css
通过这种方式,我可以获得真实浏览器非常接近的时间(因为它不会100%准确,无论使用哪种工具,它们中的每一个都将缺少您最终将要面对的特定区域)
请记住在Gatling中使用group()
方法,因为它会将报告下的所有请求和资源并行请求计为一个实体(如从a到z加载的网页),并带有报告中的选项如果需要,单独查看该组的子请求