LoadRunner的VuGen编写脚本时会反复遇到下面这些概念。
1. 事务(Transaction)
事务是手工定义的一个业务操作段,用来测量这个操作的耗时。比如你可以把“点击登录按钮到看到登录成功页面”这段代码包裹在一个叫Login的事务中。测试结束后,就会得到Login这个事务的平均响应时间、90%响应时间等数据。没有事务,只能得到每个底层请求的耗时,无法从业务视角测量性能。定义事务的基本原则是:一个事务对应一个有意义的用户操作。
2. 集合点(Rendezvous)
集合点用于制造瞬间并发。真实业务中,可能所有用户在系统开放瞬间同时点击“抢购”。如果脚本不加集合点,虚拟用户们在启动后有微小的时间差,压力相对分散。集合点的作用是让所有运行到这里的虚拟用户先排队等待,直到人数达到你设定的数量(比如 100 人),再同时放手让他们执行下一个请求。它能暴露真正的并发短板,但要谨慎使用,因为不合理的集合点可能造成过于极端的压力,和真实场景不符。
3. 检查点(Checkpoint)
默认情况下,LoadRunner 只关心服务器是不是返回了 HTTP 200 OK,并不关心返回的内容正不正确。比如服务器崩溃返回了一个错误页面,但状态码仍是 200,LoadRunner 会认为请求成功。检查点就是让你在脚本中主动证实返回内容,比如检查页面中是不是存在“登录成功”重点字。一旦检查失败,事务就可以直接标记为失败,这样你的测试结果才真实反映业务成功率,而不只是 HTTP 成功率。
4. 参数化(Parameterization)
录制出来的脚本是死的,所有用户都使用录制的那个账号和密码去登录。但真实的压力测试需要大量不同用户的数据。参数化就是让你把脚本中写死的值(如用户名、商品ID)替换成一个变量,这个变量在运行时从你准备好的数据文件(如一个包含1000个用户名的文本文件)中按顺序或随机取值。这样才能模拟多用户访问。
5. 关联(Correlation)
关联是 LoadRunner 中最重要也最容易让新人困惑的概念,要解决的是动态数据的问题。很多应用为了安全和状态追踪,会在服务器返回的响应中夹带一些动态变化的 ID(比如 Session ID、订单号、CSRF Token),后续的请求必须带上这个 ID 才能被服务器接受。录制时这些值是死的,回放时服务器会生成新的,如果脚本不处理,后续请求就会因 ID 过期而被拒。关联的操作,就是先用一个函数从服务器返回的响应里“抓”出这个动态值,保存到一个变量中,然后在后续请求中引用这个变量,完成自动适配。这是脚本调试成功和否的重点。
6. 思考时间(Think Time)
真实用户操作之间是有停顿的,比如看商品详情需要几秒,输入密码需要时间。思考时间就是在脚本步骤之间插入随机的等待时间,模拟这种用户行为延迟。加入思考时间后,单位时间内每个虚拟用户发起的请求数会减少,因此它直接影响并发用户数和系统承受的压力大小。一般需要根据真实用户行为数据来设置,而不是盲目删除或设为固定值。