具有CMA和CNAS双重资质的软件测试机构【Gatling脚本开发资源请求处理:html、css、js自动下载配置】

在Gatling中实现自动下载HTML页面关联的CSS、JS等静态资源,主要通过资源推断功能来实现,目的是高保真地模拟真实浏览器行为,来进行准确的性能测试。

机制:资源推断和自动请求

Gatling在协议层面提供了.inferHtmlResources()方法。启用后,当脚本执行一个返回HTML内容的请求(例如访问一个页面)时,Gatling会自动解析该HTML文档,并从中提取出需要下载的关联资源链接,如<script src="...">、<link rel="stylesheet" href="...">和<img src="...">。之后会为每个提取出的资源链接自动发起并发的HTTP请求进行下载。

配置

以下是启用和优化此功能的具体配置方法。

启用资源推断

可以在协议(httpProtocol)级别全局启用,也可以在单个请求级别启用。

协议级全局启用:此配置会对该协议下的所有请求生效。

Scala 复制代码
val httpProtocol = http

  .baseUrl("https://your-website.zmtests.com")

  .inferHtmlResources() // 全局启用资源推断

**请求级启用:**更推荐此方式,可以更精确地控制。通常只为返回HTML页面的关键请求启用,避免不必要的资源解析。

Scala 复制代码
exec(http("访问首页")

  .get("/")

  .inferHtmlResources() // 仅对此请求启用

)

资源过滤和静默

自动下载的资源请求可能会在测试报告中产生大量没必要的资源。Gatling提供了两种方式优化报告:

**静默特定资源:**使用silentUri方法,通过正则表达式匹配URI,使匹配的请求不在报告中单独统计。这常用于过滤图片、样式表等静态资源。

Scala 复制代码
val httpProtocol = http
 .silentUri(".*\\.(css|js|png|jpg|gif|ico).*") // 使常见静态资源请求在报告中静默

静默所有推断资源:设置silentResources = true,可以使所有通过.inferHtmlResources()下载的资源(即非顶级请求)自动静默。

连接和并发优化

为了更真实地模拟浏览器行为(如对同一主机建立多个并发连接),可能需要调整连接池设置。

Scala 复制代码
val httpProtocol = http

  .inferHtmlResources()

  .maxConnectionsPerHost(6) // 模拟现代浏览器,每个用户对每个主机最多6个并发连接

完整配置示例

以下是一个整合了上述要点的实战配置示例,其中包含了重要的HTTP协议配置,如设置基础URL、启用HTTP/2支持和异步DNS解析。

Scala 复制代码
import io.gatling.core.Predef._

import io.gatling.http.Predef._

import scala.concurrent.duration._



class WebPageSimulation extends Simulation {

  val httpProtocol = http

    .baseUrl("https://your-website.zmtests.com")

    .enableHttp2 // 启用HTTP/2支持

    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")

    .userAgentHeader("Mozilla/5.0 (兼容; Gatling)")

    .silentUri(".*\\.(css|js|png|jpg|gif|ico|woff2?).*") // 过滤静态资源报告噪音

    .asyncNameResolution("8.8.8.8") // 使用异步DNS解析提升性能



  val scn = scenario("浏览网站")

    .exec(

      http("访问商品列表页")

        .get("/products")

        .inferHtmlResources() // 为此页面启用自动资源下载

        .check(status.is(200))

    )

    .pause(2 seconds)

    .exec(

      http("访问商品详情页")

        .get("/product/123")

        .inferHtmlResources() // 为此页面启用自动资源下载

        .check(status.is(200))

    )



  setUp(

    scn.inject(rampUsers(100).during(30 seconds))

  ).protocols(httpProtocol)

}

注意事项

非浏览器:Gatling在HTTP协议层面工作,不会执行JavaScript、渲染页面或触发由JS动态加载的资源。只解析初始HTML响应中的静态链接。

缓存模拟:默认情况下,Gatling会启用缓存模拟(遵循Cache-Control等头部)。在测试时,你可以通过.disableCaching来禁用,来模拟所有用户都首次访问的场景。

资源白名单和黑名单:如果需要更精细的控制(如排除特定第三方域名资源),可以在.inferHtmlResources()方法内使用WhiteList()或BlackList()参数进行配置。

文章来源:卓码软件测评

精彩推荐:点击蓝字即可
▲软件负载测试 ▲API自动化测试 ▲软件测试 ▲第三方软件测试 ▲软件性能测试 ▲软件测试机构

相关推荐
墨神谕1 小时前
RPC框架与HTTP REST的区别
网络协议·http·rpc
Tech探索者2 小时前
没有公网 IP、不会端口映射?用 Natfrp 轻松远程访问家中 NAS
网络协议·tcp/ip·智能路由器
HY小宝F2 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
j7~4 小时前
【软件测试】(用例篇)
软件测试·测试用例·测试用例的设计方法·场景设计·错误猜测法·测试用例的粒度和评价
2302_805771075 小时前
Day20:实战:接口自动化测试框架封装之一------接口关联封装
功能测试·自动化·测试用例
福大大架构师每日一题6 小时前
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
网络协议·udp·webrtc
曹小强wxx6 小时前
Flutter 局域网设备发现:UDP 广播 + mDNS 双路合并,以及靠谱的在线判定与断线重连
物联网·网络协议·flutter
花间相见6 小时前
【计算基础|网络09】TCP(上):三次握手与四次挥手
网络·网络协议·tcp/ip
wdfk_prog7 小时前
LWIP教程 08:从 `tcp_write()` 到 ACK 清队列——TCP 数据发送、窗口与回调
网络·网络协议·tcp/ip
anew___7 小时前
《从零手写操作系统 (37):网络协议栈基础——Socket接口与TCP状态机》
网络·网络协议·tcp/ip