Сохранение и загрузка state

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

Зачем нужно сохранять состояние?

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

Подходы к сохранению состояния

Существует несколько типов состояния, которые могут быть сохранены и восстановлены:

  1. Состояние браузера: история, куки, локальное хранилище.
  2. Состояние приложения: данные, введенные в формы, данные, полученные с сервера.
  3. Состояние сессии: данные сессии пользователя, например, токены авторизации.

Сохранение состояния с использованием WebdriverIO

WebdriverIO предоставляет несколько механизмов для сохранения состояния, наиболее часто используются следующие методы:

  • Куки: позволяют сохранять информацию о текущем пользователе, авторизации и других настройках, которые могут быть использованы между тестами.
  • Локальное хранилище и сессионное хранилище: браузеры поддерживают API для сохранения данных, которые могут быть восстановлены при следующем запуске теста.
  • Сохранение состояния сессии: в случае тестирования с авторизацией можно сохранить токены доступа или другие ключевые данные сессии.
Сохранение и загрузка cookies

Одним из самых распространенных способов сохранения состояния является работа с cookies. В WebdriverIO можно сохранить все cookies браузера с помощью метода getCookies(), а затем восстановить их при помощи setCookies().

Пример сохранения и загрузки cookies:

describe('Сохранение и загрузка cookies', () => {
  it('Сохранение cookies', async () => {
    await browser.url('https://example.com');
    const cookies = await browser.getCookies();
    // Сохранение cookies в файл
    fs.writeFileSync('cookies.json', JSON.stringify(cookies));
  });

  it('Загрузка cookies', async () => {
    await browser.url('https://example.com');
    const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
    for (const cookie of cookies) {
      await browser.setCookies(cookie);
    }
    // Дальнейшие шаги теста
  });
});

В данном примере используется модуль fs для записи cookies в файл и их последующего чтения. Такой подход позволяет сохранить состояние авторизации между тестами или при перезапуске тестов.

Работа с локальным хранилищем

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

Пример сохранения и восстановления данных в локальном хранилище:

describe('Работа с localStorage', () => {
  it('Сохранение данных в localStorage', async () => {
    await browser.url('https://example.com');
    await browser.execute(() => {
      localStorage.setItem('key', 'value');
    });
  });

  it('Загрузка данных из localStorage', async () => {
    await browser.url('https://example.com');
    const value = await browser.execute(() => {
      return localStorage.getItem('key');
    });
    console.log(value); // 'value'
  });
});

В данном примере используется метод execute(), который позволяет выполнить код непосредственно в контексте браузера. Это позволяет взаимодействовать с JavaScript API браузера, такими как localStorage и sessionStorage.

Сохранение состояния сессии

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

Пример сохранения токена сессии:

describe('Сохранение и загрузка сессионного токена', () => {
  it('Сохранение токена', async () => {
    await browser.url('https://example.com');
    const token = await browser.execute(() => {
      return window.localStorage.getItem('auth_token');
    });
    fs.writeFileSync('auth_token.json', JSON.stringify({ token }));
  });

  it('Загрузка токена', async () => {
    const { token } = JSON.parse(fs.readFileSync('auth_token.json', 'utf8'));
    await browser.url('https://example.com');
    await browser.execute((authToken) => {
      window.localStorage.setItem('auth_token', authToken);
    }, token);
    // Теперь можно использовать токен для выполнения теста
  });
});

В этом примере сохраняется и загружается токен из локального хранилища, что позволяет повторно использовать его в тестах.

Использование WebdriverIO с тестовыми фреймворками

Когда используется тестовый фреймворк, например, Mocha, можно интегрировать сохранение состояния в жизненный цикл тестов, используя хуки before и after.

Пример интеграции с Mocha:

describe('Тестирование с сохранением состояния', () => {
  before(async () => {
    const cookies = await browser.getCookies();
    fs.writeFileSync('cookies.json', JSON.stringify(cookies));
  });

  beforeEach(async () => {
    const cookies = JSON.parse(fs.readFileSync('cookies.json', 'utf8'));
    for (const cookie of cookies) {
      await browser.setCookies(cookie);
    }
  });

  it('Тест с сохранением состояния', async () => {
    await browser.url('https://example.com');
    // Тестирование продолжается с загруженным состоянием
  });
});

Рекомендации по использованию сохранения состояния

  1. Не сохраняйте конфиденциальные данные: такие как пароли или личные данные пользователей. Если необходимо сохранить данные авторизации, используйте токены, а не сами пароли.
  2. Регулярно очищайте состояние: особенно если тесты включают взаимодействие с динамическими данными, например, сессиями или куками. Очистка данных между тестами помогает избежать несанкционированного вмешательства или нарушения целостности тестов.
  3. Следите за тем, чтобы состояние было актуальным: хранение старых данных может привести к сбоям в тестах, если изменится логика работы приложения.

Заключение

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