一、先搞懂两个执行器到底是啥
很多刚接触性能测试的朋友,选k6的执行器时都会卡在ramping-vus和constant-vus这俩上面,甚至觉得它们功能差不多,随便选一个就行。但实际在生产环境测出来的结果,差得能让你怀疑自己是不是测错了。先别着急,咱们用大白话把这俩执行器的核心区别说透,不用记术语,就当聊两个不同的测试工具。
简单说,constant-vus是个“固定人数的测试员”,你让它派10个测试员测,它就一直保持10个人干活,直到测试结束。而ramping-vus是个“慢慢加人再慢慢减人的测试管理员”,你让它从2个人开始,每1分钟加3个人,加到10个人后保持5分钟,再每1分钟减2个人直到结束,它就会严格按这个节奏来。
举个生活化的例子,你要测一家奶茶店的出餐能力:constant-vus就是固定派10个顾客排队,一直买奶茶;ramping-vus就是先派2个顾客,每过1分钟多来3个,直到凑够10个顾客排队,让这10个顾客一起买5分钟,再慢慢减少排队的顾客,直到没人。你说这俩测出来的结果能一样吗?肯定不一样,因为奶茶店面对的顾客节奏完全不同。
二、先搞懂constant-vus怎么用,啥时候用
2.1 constant-vus的核心用法
constant-vus的核心就是“固定并发数”,你只需要告诉它两个关键参数:要派多少个测试员(vus),测试要持续多久(duration)。它就会在测试开始后,立刻派够指定数量的测试员,每个测试员重复执行你写的测试脚本,直到时间到了自动停止。
2.2 完整示例(技术栈:JavaScript,因为k6默认用JS写脚本)
咱们写一个测登录接口的constant-vus脚本,带详细注释,一看就懂:
// 导入k6的核心模块,用来控制执行器、判断测试结果等
import http from 'k6/http';
import { check, sleep } from 'k6';
// 定义执行器配置,这里用constant-vus
export const options = {
// 执行器类型:固定并发数
executor: 'constant-vus',
// 测试员数量:固定10个,也就是10个并发
vus: 10,
// 测试持续时间:10分钟
duration: '10m',
};
// 每个测试员要执行的操作,也就是测试步骤
export default function () {
// 定义登录接口的地址
const loginUrl = 'https://api.example.com/login';
// 定义登录的请求参数
const payload = JSON.stringify({
username: 'test_user',
password: 'test_pass123'
});
// 定义请求头,告诉服务器传的是JSON格式
const params = {
headers: {
'Content-Type': 'application/json',
},
};
// 发送POST请求登录
const res = http.post(loginUrl, payload, params);
// 检查登录是否成功:如果响应状态码是200,就算成功
check(res, {
'登录成功,状态码为200': (r) => r.status === 200,
});
// 每个测试员登录后,休息1秒再执行下一次登录,模拟真实用户的操作间隔
sleep(1);
}
这个脚本跑起来后,k6会立刻派10个测试员,每个测试员每1秒就登录一次,连续跑10分钟,不会中途加人也不会减人。
2.3 适用场景
constant-vus最适合测“稳定并发下的系统能力”,比如生产环境的核心接口,平时的并发数基本固定,比如后台管理系统的登录接口、内部的统计接口,平时只有固定的几十人同时用,这时候用constant-vus测出来的结果最准。
另外,它也适合测“系统的极限稳定值”,比如你想知道系统最多能扛住50个并发不崩溃,就可以用constant-vus设50个并发,跑30分钟,如果系统没崩,各项指标(比如响应时间、错误率)都符合要求,那就能确定这个稳定值。
2.4 优缺点
优点很明显:简单,参数少,容易上手,测试结果稳定,因为并发数固定,不会有突然加人减人带来的波动,适合做基准测试。
缺点也很突出:太“极端”,因为真实生产环境的并发数不会一直固定,比如电商的商品详情页,早上可能只有10个人看,中午就有50个人看,晚上甚至有100个人看,用constant-vus测出来的结果,和真实生产环境的情况差得很远,没法模拟真实的流量变化。
2.5 注意事项
首先,vus的数量不能随便设,得根据真实生产环境的峰值并发数来设,比如真实生产环境的峰值并发是20,你设100个vus,测出来的结果就没意义,甚至可能把测试环境搞崩。
其次,duration的时间要够,不能只跑1分钟,比如测一个接口的稳定能力,至少要跑10分钟,甚至30分钟,才能发现一些隐藏的问题,比如内存泄漏、数据库连接池不够用等。
最后,要设置合理的sleep时间,不能让测试员一直疯狂请求,比如上面的脚本里加了sleep(1),就是模拟真实用户操作后的等待时间,如果不加,那测试员1秒能发几十次请求,这和真实用户的操作完全不一样。
三、再搞懂ramping-vus怎么用,啥时候用
3.1 ramping-vus的核心用法
ramping-vus的核心是“按节奏调整并发数”,你需要告诉它三个关键参数:开始的测试员数量(startVus)、结束的测试员数量(endVus)、调整的时间(duration),还可以加一个阶段(stages),用来定义多个调整节奏。
简单说,你可以让它先从2个测试员开始,每1分钟加3个,加到10个测试员后保持5分钟,再每1分钟减2个测试员直到结束,这个过程就是ramping-vus的核心。
3.2 完整示例(技术栈:JavaScript)
咱们还是写一个测登录接口的ramping-vus脚本,带详细注释:
// 导入k6的核心模块
import http from 'k6/http';
import { check, sleep } from 'k6';
// 定义执行器配置,这里用ramping-vus
export const options = {
// 执行器类型:按节奏调整并发数
executor: 'ramping-vus',
// 定义多个阶段的节奏,数组里每个对象是一个阶段
stages: [
// 第一阶段:从0个测试员开始,1分钟内加到5个测试员(预热阶段)
{ duration: '1m', target: 5 },
// 第二阶段:保持5个测试员,跑5分钟(稳定阶段)
{ duration: '5m', target: 5 },
// 第三阶段:从5个测试员开始,1分钟内加到15个测试员(加压阶段)
{ duration: '1m', target: 15 },
// 第四阶段:保持15个测试员,跑10分钟(峰值阶段)
{ duration: '10m', target: 15 },
// 第五阶段:从15个测试员开始,1分钟内减到0个测试员(减压阶段)
{ duration: '1m', target: 0 },
],
// 可选参数:如果某个阶段的测试员不够,k6会自动创建新的测试员,不用手动控制
gracefulRampDown: '30s', // 允许每个测试员在结束前最多跑30秒,避免中途打断测试
};
// 每个测试员要执行的操作,和constant-vus的测试步骤一样
export default function () {
const loginUrl = 'https://api.example.com/login';
const payload = JSON.stringify({
username: 'test_user',
password: 'test_pass123'
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post(loginUrl, payload, params);
check(res, {
'登录成功,状态码为200': (r) => r.status === 200,
});
sleep(1);
}
这个脚本跑起来后,k6会严格按定义的阶段来调整测试员数量,从预热到加压再到减压,整个过程模拟真实生产环境的流量变化。
3.3 适用场景
ramping-vus最适合测“真实流量变化下的系统能力”,比如电商的首页、商品列表页,平时流量低,大促时流量突然暴涨,用ramping-vus模拟从低流量到高流量再到低流量的过程,测出来的结果最接近真实生产环境。
另外,它也适合测“系统的扩容能力”,比如你想知道系统在流量增加时,能不能自动扩容,能不能扛住流量的暴涨,就可以用ramping-vus慢慢加测试员,直到加到峰值,观察系统的各项指标。
还有,它也适合测“系统的降级能力”,比如系统在流量超过极限时,会不会自动降级,会不会崩溃,用ramping-vus慢慢加测试员,直到加到系统的极限,观察系统的表现。
3.4 优缺点
优点很明显:能模拟真实的流量变化,测试结果更贴近生产环境,能发现一些constant-vus发现不了的问题,比如系统在流量暴涨时的响应时间飙升、错误率上升等。
缺点也很突出:参数多,复杂,不好上手,测试结果容易波动,因为流量一直在变,很难确定某个指标对应的具体并发数,适合做场景测试,不适合做基准测试。
3.5 注意事项
首先,阶段的设置要合理,不能随便设,得根据真实生产环境的流量变化来设,比如真实生产环境的流量是早上8点开始慢慢涨,10点到12点达到峰值,下午2点开始慢慢降,那阶段的设置就要按这个节奏来。
其次,gracefulRampDown的参数要设,不然k6会突然把所有测试员都停掉,导致测试结果不准确,比如你设了1分钟的减压阶段,gracefulRampDown设30秒,就是让每个测试员在结束前最多跑30秒,避免中途打断测试。
最后,要注意测试环境的配置,比如测试环境的服务器数量、数据库配置、缓存配置等,要和生产环境一致,不然测出来的结果就没意义。
四、生产环境下到底该怎么选?
说了这么多,生产环境下到底该选哪个?其实没有绝对的答案,得根据你的测试目标来选,给大家总结了几个判断标准:
第一,如果你要做基准测试,测系统在固定并发下的稳定能力,比如测核心接口的基准响应时间、基准错误率,就选constant-vus。
第二,如果你要做场景测试,测系统在真实流量变化下的能力,比如测大促时的系统表现、测平时的流量变化下的系统表现,就选ramping-vus。
第三,如果你要测系统的极限能力,比如测系统最多能扛住多少并发不崩溃,就选ramping-vus,慢慢加测试员,直到系统崩掉,就能确定极限值。
第四,如果你要测系统的扩容能力、降级能力,就选ramping-vus,慢慢加测试员,观察系统的表现。
举个实际的例子,比如你是一家电商公司,要测大促前的系统能力,你就可以先用constant-vus测核心接口的基准能力,比如登录接口、支付接口,确定它们在固定并发下的表现,再用ramping-vus模拟大促时的流量变化,从低流量到高流量再到低流量,测系统的整体表现,这样就能全面了解系统的能力。
五、常见的坑要避开
不管选哪个执行器,都有几个常见的坑要避开,不然测出来的结果都是错的:
第一,测试环境和生产环境不一致,比如测试环境的服务器是2核4G,生产环境是8核16G,测出来的结果肯定不一样,所以测试环境的配置一定要和生产环境一致。
第二,测试脚本写得不对,比如测试员的操作步骤和真实用户的操作步骤不一样,比如真实用户登录后会逛10分钟再买东西,测试脚本里登录后立刻买东西,测出来的结果肯定不一样,所以测试脚本一定要模拟真实用户的操作。
第三,vus的数量设得不对,比如真实生产环境的峰值并发是20,你设100个vus,测出来的结果就没意义,甚至可能把测试环境搞崩,所以vus的数量一定要根据真实生产环境的并发数来设。
第四,duration的时间不够,比如测一个接口的稳定能力,只跑1分钟,发现不了一些隐藏的问题,比如内存泄漏、数据库连接池不够用等,所以duration的时间一定要够。
六、总结
constant-vus和ramping-vus都是k6里非常重要的执行器,没有好坏之分,只有适合不适合之分。constant-vus适合做基准测试,测系统在固定并发下的稳定能力,简单易上手,结果稳定;ramping-vus适合做场景测试,测系统在真实流量变化下的能力,能发现一些隐藏的问题,结果更贴近生产环境。
在生产环境下选执行器,一定要根据自己的测试目标来选,不要随便选,也不要只选一个,最好两个都用,先用constant-vus测基准,再用ramping-vus测场景,这样就能全面了解系统的能力,避免上线后出现问题。
Comments