Проблема тестовых данных

Каждый тест нуждается в данных — учётные записи, товары, транзакции, конфигурации. Откуда берутся эти данные, как ими управляют и как их очищают — определяет, будет ли ваше тестирование надёжным или полным непредсказуемых результатов.

Типичные проблемы:

  • Конфликты общих данных — два тестировщика используют один аккаунт одновременно
  • Устаревшие данные — тестовые данные не соответствуют текущей схеме после миграций
  • Нарушения конфиденциальности — реальные данные клиентов в непродуктивных окружениях
  • Загрязнение окружения — остатки данных от предыдущих запусков
  • Захардкоженные значения — тест-кейсы ломаются при удалении конкретных записей

Источники тестовых данных

1. Синтетические данные (сгенерированные)

Создание искусственных данных, имитирующих паттерны production без реальной информации.

Инструменты: Faker (Python/JS/Ruby), Bogus (.NET), JavaFaker, Mockaroo (веб)

from faker import Faker
fake = Faker('ru_RU')

user = {
    "name": fake.name(),
    "email": fake.email(),
    "phone": fake.phone_number(),
    "address": fake.address(),
    "dob": fake.date_of_birth(minimum_age=18, maximum_age=80)
}

Плюсы: Нет проблем с конфиденциальностью, неограниченный объём, воспроизводимо с seed Минусы: Может не отражать реальные паттерны данных

2. Маскированные данные production

Копирование данных production и замена чувствительных полей фиктивными значениями с сохранением связей и распределений.

Что маскировать:

  • Имена, email, телефоны
  • Адреса, IP-адреса
  • Номера карт, банковские счета
  • Номера паспортов, ИНН, СНИЛС
  • Медицинские записи, финансовые данные

Техники маскирования:

  • Подстановка — замена реальных имён фиктивными
  • Перемешивание — перестановка значений внутри столбца
  • Шифрование — шифрование чувствительных полей
  • Обнуление — замена на NULL или значения по умолчанию
  • Сдвиг дат — сдвиг всех дат на случайное смещение

3. Data Factories

Программные паттерны, создающие тестовые данные по запросу с настраиваемыми атрибутами.

function createUser(overrides = {}) {
  return {
    id: generateUUID(),
    name: faker.name(),
    email: faker.email(),
    role: "user",
    status: "active",
    createdAt: new Date(),
    ...overrides
  };
}

const adminUser = createUser({ role: "admin" });
const inactiveUser = createUser({ status: "inactive" });

Плюсы: Консистентные, самодокументирующиеся, создают только нужное Минусы: Требуют разработки, должны обновляться при изменении схемы

4. Fixtures и Seed Data

Предопределённые наборы данных, загружаемые перед выполнением тестов.

Плюсы: Предсказуемые, версионируемые Минусы: Устаревают, сложно поддерживать в масштабе

Стратегия тестовых данных

Изоляция данных

Каждый тест должен создавать свои данные и не зависеть от данных других тестов.

Антипаттерн: «Сначала запусти Тест A, потому что Тест B нуждается в аккаунте, созданном Тестом A.»

Лучшая практика: Каждый тест создаёт данные в setup, использует их и очищает в teardown.

Жизненный цикл данных

Создание → Использование → Проверка → Очистка

Выбор по окружению

ОкружениеИсточник данныхОбъёмКонфиденциальность
Unit-тестыFactories/mocksМинимальныйН/Д
ИнтеграцияFactories + fixturesУмеренныйТолько синтетические
QA/StagingМаскированный productionПолныйОбезличенный
ПроизводительностьМасштабированные маскированныеКак productionОбезличенный

Упражнение: Спроектируйте стратегию тестовых данных

Вы — QA Lead медицинского приложения, управляющего записями пациентов, приёмами, рецептами и страховыми случаями. Спроектируйте полную стратегию:

  1. Какие данные генерировать и какие маскировать из production
  2. Как обеспечить требования HIPAA compliance
  3. Паттерны data factory для самых частых сценариев
  4. Подход к очистке тестовых окружений
Решение

1. Источники данных:

  • Синтетические: Демографика пациентов, слоты приёмов, каталог лекарств
  • Маскированный production: Распределения болезней, паттерны рецептов, workflow обработки claims
  • Сгенерированные API: Ответы верификации страховки (mock внешних API)

2. HIPAA Compliance:

  • Никогда не использовать реальные имена, SSN, DOB или номера медкарт в тестовых окружениях
  • Консистентное маскирование: Имена → Faker, SSN → шифрование с сохранением формата, DOB → сдвиг ±365 дней
  • Аудит: Логирование кто обращался к тестовым данным и когда
  • Контроль доступа: Тестовые окружения требуют такой же аутентификации как production
  • Хранение: Автоудаление тестовых данных старше 90 дней

3. Data Factories:

createPatient({ age, conditions, insuranceType })
createAppointment({ patient, doctor, type, date })
createPrescription({ patient, medication, dosage })
createClaim({ appointment, amount, status })
  • Factories генерируют референциально целостные данные
  • Настраиваемые состояния: ожидающие, одобренные, отклонённые claims

4. Очистка:

  • Transaction rollback для тестов БД
  • API-эндпоинты очистки (DELETE /test-data/{testRunId})
  • Ночной сброс окружения: восстановление из базового snapshot
  • Каждый тест помечен testRunId для избирательной очистки

Конфиденциальность и Compliance

Требования GDPR

  • Право на забвение применяется даже к тестовым данным, если использовались реальные
  • Минимизация данных: создавайте только необходимое
  • Документируйте, какие персональные данные есть в тестовых окружениях

PCI DSS для платежей

  • Никогда не использовать реальные номера карт в тестовых окружениях
  • Использовать тестовые номера от платёжных процессоров (например, тестовые карты Stripe)

Ключевые выводы

  • Никогда не используйте сырые данные production — обезличивайте или генерируйте синтетические
  • Используйте data factories для консистентного, самодокументирующегося создания данных
  • Каждый тест создаёт свои данные и очищает после себя
  • Учитывайте регуляции конфиденциальности (GDPR, HIPAA, PCI DSS) в стратегии
  • Маскируйте данные production подстановкой, перемешиванием или шифрованием
  • Автоматизируйте очистку для предотвращения загрязнения и нестабильных тестов