Разделение тестов по модулям

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

Основные принципы модульности

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

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

  1. Логическая группа тестов. Все тесты, которые проверяют схожие функциональности, должны быть размещены в одном модуле.
  2. Повторное использование кода. Одна из целей модульного подхода — минимизация дублирования кода. Это достигается за счет выделения общих функций и шагов в отдельные модули.
  3. Гибкость в добавлении новых тестов. Каждый новый тест должен легко интегрироваться в уже существующую структуру без необходимости изменений в других частях тестовой системы.

Структура каталогов

Для разделения тестов по модулям важно правильно организовать структуру каталогов в проекте. Стандартная структура может выглядеть следующим образом:

/tests
  /modules
    /login
      login.spec.js
      loginPage.js
    /registration
      registration.spec.js
      registrationPage.js
    /checkout
      checkout.spec.js
      checkoutPage.js
  /helpers
    commonFunctions.js

В этой структуре:

  • Каждый модуль имеет свой собственный каталог в папке /modules, который содержит тесты, связанные с определенной функциональностью (например, авторизация, регистрация, оформление заказа).
  • Внутри каждого модуля могут быть разделены тесты и страницы (например, login.spec.js и loginPage.js).
  • Папка /helpers содержит общие утилиты и функции, которые могут быть использованы в нескольких модулях.

Создание страниц в тестах

В WebdriverIO принято использовать модель “страница-объект” (Page Object Model, POM). Эта модель позволяет разделить тесты и взаимодействие с веб-страницами, что делает тесты более поддерживаемыми. Каждый файл страницы представляет собой объект, который инкапсулирует все действия, связанные с конкретной страницей или компонентом, такие как заполнение форм, нажатие кнопок, проверка элементов и т. п.

Пример страницы в модуле login:

// loginPage.js
class LoginPage {
  get usernameInput() {
    return $('#username');
  }

  get passwordInput() {
    return $('#password');
  }

  get loginButton() {
    return $('#loginButton');
  }

  open() {
    browser.url('/login');
  }

  login(username, password) {
    this.usernameInput.setValue(username);
    this.passwordInput.setValue(password);
    this.loginButton.click();
  }
}

module.exports = new LoginPage();

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

// login.spec.js
const LoginPage = require('../pages/loginPage');

describe('Login functionality', () => {
  it('should log in successfully with valid credentials', () => {
    LoginPage.open();
    LoginPage.login('testUser', 'password123');
    expect(browser).toHaveUrl('/dashboard');
  });
});

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

Использование хелперов для общих действий

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

Пример хелпера:

// commonFunctions.js
function waitForElementToBeVisible(selector, timeout = 5000) {
  const element = $(selector);
  element.waitForDisplayed({ timeout });
}

module.exports = { waitForElementToBeVisible };

Затем этот хелпер можно использовать в любых тестах:

// login.spec.js
const { waitForElementToBeVisible } = require('../helpers/commonFunctions');

describe('Login functionality', () => {
  it('should display the login form', () => {
    browser.url('/login');
    waitForElementToBeVisible('#loginForm');
    expect($('#loginForm')).toBeDisplayed();
  });
});

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

Параллельное выполнение тестов

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

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

Пример конфигурации для параллельного выполнения:

// wdio.conf.js
exports.config = {
  maxInstances: 5,
  capabilities: [
    {
      browserName: 'chrome',
      maxInstances: 5,
    },
  ],
  // другие настройки
};

Организация отчетности и логирования

Каждый модуль должен быть снабжен соответствующей системой логирования и отчетности. В WebdriverIO для этого можно использовать плагины, такие как wdio-allure-reporter или wdio-mochawesome-reporter, которые позволяют получать подробные отчеты о выполнении тестов.

// wdio.conf.js
exports.config = {
  reporters: ['spec', 'allure'],
  // другие настройки
};

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

Заключение

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