Привет, коллега по цеху! Если ты уже освоил азы нагрузочного тестирования с k6 и хочешь добавить в свои скрипты реалистичные данные — ты попал по адресу. Сегодня мы научимся:
- Загружать данные из CSV и JSON файлов.
- Генерировать фейковых пользователей с помощью Faker.js.
📂 Загрузка данных из CSV и JSON
📄 CSV: Используем Papa Parse
k6 не поддерживает парсинг CSV файлов из коробки, но мы можем использовать библиотеку Papa Parse.(Grafana Labs)
username,password
admin,123
test_user,1234
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';
const csvData = new SharedArray('user_data', function () {
return papaparse.parse(open('./data.csv'), { header: true }).data;
});
export default function () {
const user = csvData[Math.floor(Math.random() * csvData.length)];
console.log(`Logging in as ${user.username}`);
// Логика авторизации...
}
Использование SharedArray позволяет избежать дублирования данных между виртуальными пользователями (VU). (Grafana Labs)
📄 JSON: Прямой доступ
Для JSON файлов k6 предоставляет встроенную функцию open().
- Создаём файл data.json:{
"users": [
{ "username": "admin", "password": "123" },
{ "username": "test_user", "password": "1234" }
]
} - Загружаем и используем данные:import { SharedArray } from 'k6/data';
const users = new SharedArray('user_data', function () {
return JSON.parse(open('./data.json')).users;
});
export default function () {
const user = users[Math.floor(Math.random() * users.length)];
console.log(`Logging in as ${user.username}`);
// Логика авторизации...
}
Такой подход позволяет эффективно использовать данные между VU. (Grafana Labs)
🎭 Генерация фейковых пользователей с Faker.js
Если тебе не хочется создавать вручную файлы с данными, можно генерировать их на лету с помощью Faker.js.
- Импортируем Faker.js:import { faker } from 'https://esm.sh/@faker-js/faker';
export default function () {
const user = {
username: faker.internet.userName(),
email: faker.internet.email(),
address: faker.address.streetAddress(),
};
console.log(`Generated user: ${JSON.stringify(user)}`);
// Логика использования данных...
}
Faker.js позволяет создавать разнообразные данные, имитируя поведение реальных пользователей. (Lewys Jones)
🧪 Примеры задач
1. Авторизация с использованием данных из CSV
Загружаем данные пользователей из CSV файла и выполняем авторизацию:
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';
const csvData = new SharedArray('user_data', function () {
return papaparse.parse(open('./data.csv'), { header: true }).data;
});
export default function () {
const user = csvData[Math.floor(Math.random() * csvData.length)];
console.log(`Logging in as ${user.username}`);
// Логика авторизации...
}
2. Регистрация с фейковыми данными
Генерируем фейковые данные для регистрации нового пользователя:
import { faker } from 'https://esm.sh/@faker-js/faker';
export default function () {
const user = {
username: faker.internet.userName(),
email: faker.internet.email(),
password: faker.internet.password(),
};
console.log(`Registering user: ${JSON.stringify(user)}`);
// Логика регистрации...
}
3. Загрузка файла с данными (например, изображение)
Выполняем POST запрос с загрузкой файла:
import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
const binFile = open('./image.png', 'b');
const data = {
field: 'this is a standard form field',
file: http.file(binFile, 'image.png'),
};
const res = http.post('https://example.com/upload', data);
sleep(3);
}
Такой подход позволяет эмулировать реальные сценарии загрузки файлов.
4. Параллельная авторизация с использованием JSON данных
Выполняем параллельные авторизации с использованием данных из JSON файла:
import { SharedArray } from 'k6/data';
const users = new SharedArray('user_data', function () {
return JSON.parse(open('./data.json')).users;
::contentReference[oaicite:115]{index=115}
5. 🔁 Перебор всех пользователей из CSV
Иногда тебе нужно прогнать всех пользователей из списка, а не случайного. Тогда можно использовать индекс текущего VU (виртуального пользователя).
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';
const users = new SharedArray('users', () =>
papaparse.parse(open('./data.csv'), { header: true }).data
);
export default function () {
const user = users[__VU % users.length]; // один VU — один юзер
console.log(`User for VU ${__VU}: ${user.username}`);
// Авторизация или другой сценарий
}
📌 Так ты можешь распределить нагрузку на пользователей равномерно.
6. 🧪 Генерация случайных корзин покупок
Тестирование интернет-магазина? Сгенерируем "фейковую" корзину покупок:
import { faker } from 'https://esm.sh/@faker-js/faker';
export function getFakeCart() {
const cartSize = Math.floor(Math.random() * 5) + 1;
const cart = [];
for (let i = 0; i < cartSize; i++) {
cart.push({
productId: faker.datatype.number({ min: 1, max: 100 }),
quantity: faker.datatype.number({ min: 1, max: 3 }),
});
}
return cart;
}
export default function () {
const cart = getFakeCart();
console.log(`Cart: ${JSON.stringify(cart)}`);
// Отправляем на сервер
}
📎 Это отличный способ проверить нагрузку на систему оформления заказов.
7. 📅 Данные с датами и временными промежутками
Генерация фейковых событий с разными датами:
import { faker } from 'https://esm.sh/@faker-js/faker';
export default function () {
const event = {
name: faker.company.bsBuzz(),
date: faker.date.future().toISOString(),
};
console.log(`Scheduled event: ${JSON.stringify(event)}`);
// Эмулируем создание событий или бронирование
}
📌 Полезно для систем бронирования, календарей, CRM и пр.
8. 🔐 Тестирование скомбинированных сценариев
Фейковый пользователь логинится, выбирает товары и оформляет заказ:
import { faker } from 'https://esm.sh/@faker-js/faker';
import http from 'k6/http';
import { check } from 'k6';
export default function () {
const user = {
username: faker.internet.userName(),
password: faker.internet.password(),
};
// Регистрация
http.post('https://example.com/api/register', user);
// Логин
const res = http.post('https://example.com/api/login', user);
check(res, { 'login success': (r) => r.status === 200 });
const token = res.json('token');
// Оформление заказа
const cart = [{ productId: 10, quantity: 1 }];
http.post('https://example.com/api/order', JSON.stringify(cart), {
headers: { Authorization: `Bearer ${token}` },
});
}
📌 Отличный пример для end-to-end тестирования с разными шагами.
9. 🧷 Использование данных разных типов в одном тесте
Допустим, у тебя есть:
- CSV для авторизации
- JSON для сценариев
- Faker для случайных заказов
Комбинируем всё:
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';
import { faker } from 'https://esm.sh/@faker-js/faker';
import http from 'k6/http';
const users = new SharedArray('users', () =>
papaparse.parse(open('./users.csv'), { header: true }).data
);
const actions = new SharedArray('actions', () =>
JSON.parse(open('./actions.json')).actions
);
export default function () {
const user = users[Math.floor(Math.random() * users.length)];
const action = actions[Math.floor(Math.random() * actions.length)];
const product = {
id: faker.datatype.number(100),
quantity: faker.datatype.number({ min: 1, max: 5 }),
};
console.log(`${user.username} делает ${action.name} с товаром ${product.id}`);
// Тестируем поведение...
}
📌 Очень гибкий подход, если тебе нужен сценарий с несколькими источниками данных.
10. 🧾 Генерация длинных/нестандартных строк для теста валидации
Проверим, как система справляется с необычными данными:
import { faker } from 'https://esm.sh/@faker-js/faker';
export default function () {
const longString = faker.lorem.paragraphs(10);
const weirdEmail = 'invalid@@example...com';
console.log(`Testing input: ${weirdEmail.length} chars, body: ${longString.length}`);
// Отправляем в поле ввода
}
📌 Полезно для тестов безопасности и устойчивости UI/API.
🧠 Заключение
Теперь ты умеешь:
- 📂 Загружать данные из CSV и JSON
- 🧙♂️ Генерировать фейковые, но правдоподобные сценарии
- 🧪 Моделировать реалистичное поведение пользователей
- ⚙️ Комбинировать данные из разных источников
Это не просто тестирование. Это уже искусство эмуляции пользователей. Чем реалистичнее твои тесты, тем увереннее ты в проде.