跨 VU 分配工作负载
k6 可以为不同的 VU 函数调度不同的负载模式。包含多个工作负载的测试可以更好地模拟现实世界的流量,其中用户行为很少是统一的。例如,电子商务网站的大部分流量可能来自只搜索商品和阅读评论的用户。一小部分用户可能会积极购物,执行涉及写入数据库和调用不同 API 的操作。
以下部分提供了如何构建 k6 脚本以在 VU 之间拆分逻辑的示例。要检查特定行为的结果,您可以创建自定义指标或使用标签按场景、代码块或单个请求进行过滤。
注意
这些技术可能会创建非常复杂的配置。然而,更复杂的配置会增加结果解释的歧义性
跨场景拆分逻辑
注意
在此上下文中,工作负载指的是由场景模拟的流量模式。
一种分配流量的方法是使用场景为不同函数调度不同的工作负载。
- 在您的选项中定义多个场景。
- 使用场景的
exec
属性来执行不同 VU 函数的工作负载。
例如,想象一个社交媒体网站通常有 100 个并发用户。其中,80 个用户可能访问他们的联系人页面,20 个用户可能查看新闻。要配置这种分布,请创建两个具有不同吞吐量或 VU 的场景
import http from 'k6/http';
export const options = {
//scenario to view contacts
scenarios: {
contacts: {
executor: 'shared-iterations',
exec: 'contacts',
vus: 80,
iterations: 100,
},
//scenario to view news
news: {
executor: 'shared-iterations',
exec: 'news',
vus: 20,
iterations: 100,
},
},
};
//use the exec property to run different scenarios for different functions
export function contacts() {
http.get('https://test.k6.io/contacts.php');
}
export function news() {
http.get('https://test.k6.io/news.php');
}
要查看特定场景的详细结果,您可以按内置场景标签进行过滤。
按 VU ID 分配逻辑
在某些情况下,为每种行为编写一个场景可能不方便或不切实际。作为替代方案,您可以使用来自k6/execution
模块的执行上下文变量在一定范围的 VU 中分配逻辑。使用 exec
对象,您可以将逻辑限定到特定实例、场景或所有 VU。
例如,此语句将行为分配给测试中的前 25 个 VU。
if (exec.vu.idInTest <= 25) {
//do something;
}
为了更灵活,您可以使用取模表达式根据百分比分配 VU。例如,以下脚本根据不同的用户画像分配逻辑
- 40% 的用户查看新闻。
- 60% 的用户玩抛硬币游戏。
- 一半赌正面,一半赌反面。
import http from 'k6/http';
import exec from 'k6/execution';
export const options = {
scenarios: {
quickRamp: {
executor: 'ramping-arrival-rate',
startRate: 0,
timeUnit: '1s',
preAllocatedVUs: 100,
stages: [
{ target: 10, duration: '10s' },
{ target: 10, duration: '15s' },
{ target: 0, duration: '5s' },
],
},
},
};
export default function () {
if (exec.vu.idInTest % 10 < 4) {
// 0-3 range, read the news
http.get('http://test.k6.io/news');
} else if (exec.vu.idInTest % 10 < 7) {
// 4-6 range, bet heads
http.get('http://test.k6.io/flip_coin.php?bet=heads');
} else {
// 7-9 range, bet tails
http.get('http://test.k6.io/flip_coin.php?bet=tails');
}
}
要查看特定请求或组的结果,您可以定义标签。
随机化行为
为了增加一定程度的随机行为,可以考虑使用来自k6 utils中的随机化函数之一。
例如,此脚本随机分配一种行为在三分之一的时间内发生,另一种行为在所有其他时间内发生。
import { sleep } from 'k6';
import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
export default function () {
if (randomIntBetween(1, 3) % 3 > 1) {
console.log('1 in 3 times');
} else {
console.log('2 in 3 times');
}
}
有关更复杂的随机化示例,请阅读此论坛帖子。