Добавить в корзинуПозвонить
Найти в Дзене
Анастасия Софт

Генерация и загрузка данных в k6: CSV, JSON, фейковые пользователи

Привет, коллега по цеху! Если ты уже освоил азы нагрузочного тестирования с k6 и хочешь добавить в свои скрипты реалистичные данные — ты попал по адресу. Сегодня мы научимся: 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 файлов k6 предоставляет встроенную функцию open(). Такой подход позволяет эффективно использовать данные между VU. (Graf
Оглавление

Привет, коллега по цеху! Если ты уже освоил азы нагрузочного тестирования с k6 и хочешь добавить в свои скрипты реалистичные данные — ты попал по адресу. Сегодня мы научимся:

  • Загружать данные из CSV и JSON файлов.
  • Генерировать фейковых пользователей с помощью Faker.js.
  • Эмулировать поведение реальных пользователей.(Lewys Jones)

📂 Загрузка данных из CSV и JSON

📄 CSV: Используем Papa Parse

k6 не поддерживает парсинг CSV файлов из коробки, но мы можем использовать библиотеку Papa Parse.(Grafana Labs)

  1. Создаём файл data.csv:(Grafana Labs)

username,password
admin,123
test_user,1234

  1. Импортируем Papa Parse и загружаем данные:(Grafana Labs)

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().

  1. Создаём файл data.json:{
    "users": [
    { "username": "admin", "password": "123" },
    { "username": "test_user", "password": "1234" }
    ]
    }
  2. Загружаем и используем данные: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.

  1. Импортируем 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
  • 🧙‍♂️ Генерировать фейковые, но правдоподобные сценарии
  • 🧪 Моделировать реалистичное поведение пользователей
  • ⚙️ Комбинировать данные из разных источников

Это не просто тестирование. Это уже искусство эмуляции пользователей. Чем реалистичнее твои тесты, тем увереннее ты в проде.