Создание утилит и хелперов

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

Что такое утилиты и хелперы?

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

Часто утилиты используются для:

  • Обработки специфичных ошибок
  • Взаимодействия с элементами на странице (например, клики, ввод текста)
  • Генерации случайных данных
  • Параллельной обработки тестов
  • Форматирования логов

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

Структура проекта

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

project/
│
├── tests/
│   ├── exampleTest.js
│   └── anotherTest.js
│
├── helpers/
│   ├── formHelper.js
│   ├── apiHelper.js
│   └── uiHelper.js
│
├── utils/
│   ├── randomData.js
│   ├── logger.js
│   └── waitUtils.js
└── wdio.conf.js

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

Пример создания утилит

  1. Функции ожидания Ожидания в WebdriverIO часто необходимы, чтобы убедиться, что элементы страницы загружены перед выполнением тестов. Встроенные методы вроде waitForExist и waitForDisplayed могут быть полезны, но можно создать обёртку для упрощения этих операций.
// utils/waitUtils.js

/**
 * Ожидание появления элемента на странице
 * @param {string} selector - Селектор элемента
 * @param {number} timeout - Время ожидания в миллисекундах
 */
function waitForElement(selector, timeout = 5000) {
    const element = $(selector);
    element.waitForExist({ timeout });
    return element;
}

module.exports = { waitForElement };

Теперь в тестах можно просто вызывать waitForElement, сокращая повторение кода:

const { waitForElement } = require('../utils/waitUtils');

describe('Тестирование формы', () => {
    it('должен показывать сообщение об ошибке, если поле пустое', () => {
        waitForElement('.form-submit').click();
        // Дополнительные проверки
    });
});
  1. Генерация случайных данных В некоторых случаях в тестах требуется использовать случайные данные, такие как случайное имя или email. Можно создать утилиту для генерации таких данных.
// utils/randomData.js

/**
 * Генерация случайного имени
 * @returns {string} Случайное имя
 */
function randomName() {
    const names = ['Иван', 'Алексей', 'Мария', 'Светлана'];
    return names[Math.floor(Math.random() * names.length)];
}

/**
 * Генерация случайного email
 * @returns {string} Случайный email
 */
function randomEmail() {
    const domains = ['example.com', 'test.com', 'email.com'];
    return `${randomName().toLowerCase()}@${domains[Math.floor(Math.random() * domains.length)]}`;
}

module.exports = { randomName, randomEmail };

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

  1. Обработка ошибок Часто при автоматизации тестов возникает необходимость логировать ошибки или предпринимать действия в случае сбоев. Создание утилиты для обработки ошибок позволяет централизованно решать эту задачу.
// utils/logger.js

const fs = require('fs');
const path = require('path');

/**
 * Логирование ошибок в файл
 * @param {string} errorMessage - Сообщение об ошибке
 */
function logError(errorMessage) {
    const logFile = path.resolve(__dirname, 'error.log');
    const logMessage = `${new Date().toISOString()} - ${errorMessage}\n`;
    fs.appendFileSync(logFile, logMessage);
}

module.exports = { logError };

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

Создание хелперов

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

// helpers/formHelper.js

/**
 * Заполнение текстового поля формы
 * @param {string} selector - Селектор текстового поля
 * @param {string} text - Текст для ввода
 */
function fillTextField(selector, text) {
    const field = $(selector);
    field.setValue(text);
}

/**
 * Отправка формы
 * @param {string} selector - Селектор кнопки отправки
 */
function submitForm(selector) {
    const submitButton = $(selector);
    submitButton.click();
}

module.exports = { fillTextField, submitForm };

С помощью этого хелпера тесты можно сделать более читаемыми и легче поддерживаемыми:

const { fillTextField, submitForm } = require('../helpers/formHelper');

describe('Тестирование формы регистрации', () => {
    it('должен успешно отправить форму', () => {
        fillTextField('#username', 'testuser');
        fillTextField('#password', 'password123');
        submitForm('#submit');
    });
});

Параллельное выполнение тестов и вспомогательные функции

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

Для параллельного выполнения можно использовать различные библиотеки и возможности самого WebdriverIO, такие как “multiCapabilities” в конфигурации wdio.conf.js, а также интеграцию с сервисами, например, Sauce Labs или BrowserStack.

Итоги

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