
Gatling 的 Session 是虚拟用户私有的,无法在不同 Scenario 间共享;实现数据流转必须统一在单个 Scenario 内通过 ChainBuilder 链式执行完成。
gatling 的 session 是虚拟用户(virtual user)级别的上下文容器,其生命周期严格绑定于单个用户的完整请求链路。这意味着通过 `check(jsonpath(...).saveas("key"))` 保存的变量仅对该用户当前及后续的 chainbuilder 步骤可见,绝不会跨 scenario、跨用户或跨类自动传递——你尝试在 `booksstore` 和 `client` 两个独立 scenario 中接力使用 `firstbookid`,本质上违背了 gatling 的会话模型设计原则。
要真正实现“先获取 ID,再用该 ID 请求详情”的端到端业务流,必须将两个操作合并至同一个 Scenario 中,并通过 .exec(...) 顺序编排 ChainBuilder。以下是符合 Gatling 最佳实践的重构方案:
✅ 正确做法:单 Scenario + 链式执行
class BookWorkflowSimulation extends Simulation {
val httpProtocol = http
.baseUrl("https://bookylova.com")
.acceptHeader("application/json")
.header("Authorization", getGetAccessToken())
// 定义可复用的 ChainBuilder(推荐封装在 object 中,便于复用)
object BookFlows {
val getFirstBookId: ChainBuilder = exec(
http("Get Books IDs")
.get("/api/books/ids")
.check(jsonPath("$.idList[0]").saveAs("firstBookId"))
)
val readBookById: ChainBuilder = exec(
http("Get Book by ID")
.get("/api/book/${firstBookId}") // ✅ Session 变量在此处实时解析
.check(status.is(200))
)
}
// 单一 Scenario:用户完整旅程 = 获取ID → 查询详情
val scn = scenario("Book Lookup Flow")
.exec(BookFlows.getFirstBookId)
.pause(1) // 可选:模拟用户思考间隔
.exec(BookFlows.readBookById)
setUp(
scn.inject(rampUsers(10).during(10.seconds))
).protocols(httpProtocol)
}
⚠️ 关键注意事项
- 禁止跨 Scenario 共享 Session:setUp(...).andThen(...) 仅表示测试阶段的顺序执行,每个 .andThen() 启动的是全新虚拟用户组,Session 完全隔离。
- 避免静态变量/全局状态:如 public static String firstBookId 在 Gatling 中不可靠——多线程并发下存在竞态,且违反无状态压测设计原则。
- 推荐结构化组织:将逻辑拆分为 object BookFlows 或 trait BookDsl,既保持可读性,又支持在多个 Scenario 中复用(如 scn.exec(BookFlows.getAndRead))。
- 调试技巧:添加 .exec(session => { println(s"Current session: ${session.attributes}"); session }) 快速验证变量是否存入。
? 进阶提示:动态数据与容错
若需从响应中提取多个 ID 并轮询访问,可结合 Feeder 或 foreach():
// 示例:提取全部 ID 并逐个访问
.exec(http("Get All IDs").get("/api/books/ids")
.check(jsonPath("$.idList[*]").ofType[String].findAll.saveAs("bookIds")))
.foreach("${bookIds}", "bookId") {
exec(http("Fetch Book").get("/api/book/${bookId}"))
}
总之,Gatling 的核心哲学是“一个用户,一条链路”。放弃跨类/跨场景传值的思路,转而用函数式组合构建清晰、可维护、符合真实用户行为的单一 Scenario,才是高效编写高性能测试脚本的根本路径。










