Подготовка и очистка данных

Тестирование веб-приложений с использованием Playwright требует предварительной подготовки и очистки данных, чтобы гарантировать стабильность и корректность тестов. Наличие подготовленных и чистых данных — важная составляющая надежности тестов. Работа с данными может включать создание тестовых пользователей, настройку состояния базы данных, очистку данных после выполнения тестов и многое другое.

Зачем необходима подготовка и очистка данных

Когда тесты выполняются в автоматизированной среде, необходимо обеспечить, чтобы каждый тест начинался с одинакового состояния. Это исключает возможность влияния предыдущих тестов на текущий и позволяет получать более точные и воспроизводимые результаты. Без должной подготовки и очистки данных тесты могут работать некорректно из-за накопившихся изменений в состоянии системы.

Основные подходы к подготовке данных

1. Создание тестовых пользователей

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

Playwright позволяет эмулировать действия пользователя с помощью браузера, но создание и управление тестовыми данными часто требует работы с API или взаимодействия с базой данных.

Пример использования API для создания тестового пользователя:

const createTestUser = async () => {
  const response = await fetch('https://yourapi.com/create-user', {
    method: 'POST',
    body: JSON.stringify({ username: 'testuser', password: 'password123' }),
    headers: { 'Content-Type': 'application/json' }
  });
  return response.json();
};

Важным аспектом является обеспечение корректных данных для тестирования. Например, для проверки валидации полей в форме регистрации могут потребоваться специфические данные, такие как слишком короткие или слишком длинные имена.

2. Использование фикстур для подготовки данных

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

Пример использования фикстур с Playwright:

test.beforeAll(async () => {
  // Подготовка данных
  await page.goto('https://yourapp.com/setup');
  await page.fill('input[name="username"]', 'testuser');
  await page.fill('input[name="password"]', 'password123');
  await page.click('button[type="submit"]');
});

test('Test with prepared data', async () => {
  // Выполнение теста с подготовленными данными
  await expect(page.locator('text=Welcome, testuser')).toBeVisible();
});

В этом примере данные (имя пользователя и пароль) подготавливаются до начала тестов с помощью метода beforeAll. Это позволяет гарантировать, что тесты начнутся в нужном контексте.

3. Подготовка базы данных

Для сложных тестов может потребоваться напрямую взаимодействовать с базой данных, чтобы подготовить нужные записи в таблицах или сбросить состояние после выполнения теста. В некоторых случаях может быть удобно использовать средства миграции базы данных или скрипты для восстановления данных в исходное состояние.

Пример подготовки данных через базу данных:

const { Client } = require('pg');

const prepareDatabase = async () => {
  const client = new Client({ connectionString: process.env.DATABASE_URL });
  await client.connect();
  await client.query('DELETE FROM users WHERE username = $1', ['testuser']);
  await client.query('INSERT INTO users (username, password) VALUES ($1, $2)', ['testuser', 'password123']);
  await client.end();
};

Этот пример использует PostgreSQL для подготовки данных перед запуском тестов, что помогает избежать зависимости от состояния данных, оставшихся от предыдущих тестов.

Очистка данных

После выполнения тестов важно очистить данные, чтобы не повлиять на другие тесты или продакшн-систему. Это также снижает вероятность ошибок, связанных с состоянием базы данных.

1. Очистка базы данных

После тестирования важно сбросить все изменения, сделанные тестами. Это можно сделать с помощью транзакций, откат которых возвращает базу данных в исходное состояние.

Пример отката транзакции в PostgreSQL:

const { Client } = require('pg');

const cleanDatabase = async () => {
  const client = new Client({ connectionString: process.env.DATABASE_URL });
  await client.connect();
  
  // Начинаем транзакцию
  await client.query('BEGIN');
  try {
    // Очистка данных
    await client.query('DELETE FROM users WHERE username = $1', ['testuser']);
    
    // Фиксация изменений
    await client.query('COMMIT');
  } catch (e) {
    // Откат транзакции в случае ошибки
    await client.query('ROLLBACK');
    throw e;
  } finally {
    await client.end();
  }
};

Транзакции гарантируют, что база данных будет восстановлена в исходное состояние, даже если тесты не завершатся корректно.

2. Использование моков для очистки данных

В некоторых случаях можно использовать моки или подмену API, чтобы избежать взаимодействия с реальной базой данных и сервером. Это снижает вероятность случайных изменений в продакшн-среде и ускоряет выполнение тестов.

Пример использования мока для API:

test('Test with mock API', async () => {
  const mockCreateUser = vi.fn().mockResolvedVal ue({ success: true });
  page.on('route', (route) => {
    if (route.url().includes('/create-user')) {
      route.fulfill({ body: JSON.stringify({ success: true }), status: 200 });
    }
  });

  await page.goto('https://yourapp.com');
  await page.click('button#createUser');
  expect(mockCreateUser).toHaveBeenCalled();
});

Моки полезны для изолированного тестирования, когда важно проверить логику работы с данными без их реальной обработки.

3. Очистка с использованием API

Если тесты взаимодействуют с REST API, то очистка данных может быть выполнена через удаление или обновление данных через соответствующие API-запросы. Использование API для очистки данных также ускоряет выполнение тестов.

Пример использования API для удаления тестового пользователя:

const deleteTestUser = async () => {
  const response = await fetch('https://yourapi.com/delete-user', {
    method: 'DELETE',
    body: JSON.stringify({ username: 'testuser' }),
    headers: { 'Content-Type': 'application/json' }
  });
  return response.json();
};

Этот способ помогает не только очистить тестовые данные, но и может быть использован для управления состоянием данных на сервере.

Важные рекомендации по работе с данными

  1. Изоляция тестов: Каждый тест должен быть независимым от других. Это можно достичь путем очистки данных перед и после выполнения тестов, а также с использованием мока для изоляции тестовой среды.
  2. Использование транзакций: Когда это возможно, работайте с транзакциями для сброса данных. Это позволяет легко вернуть данные в исходное состояние.
  3. Синхронизация с сервером: Если используется API для создания и очистки данных, важно убедиться, что запросы выполняются асинхронно, чтобы избежать несоответствий в данных между клиентом и сервером.
  4. Логирование и мониторинг: Ведите логи о том, как изменяются данные, чтобы можно было отслеживать причины возможных сбоев тестов.

Работа с подготовкой и очисткой данных требует внимательности и точности. От корректной настройки этих процессов зависит стабильность и качество автоматизированных тестов.