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

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


Определение и назначение фикстур

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

  • Предоставления входных данных для форм или API-запросов.
  • Инициализации состояния приложения (например, создание пользователя или подготовка базы данных).
  • Проверки корректности отображения информации на страницах интерфейса.

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


Организация фикстур

Фикстуры обычно хранятся в отдельных JSON- или JS-файлах. Структура проекта может выглядеть так:

project/
│
├─ test/
│  ├─ specs/
│  ├─ fixtures/
│  │  ├─ users.json
│  │  └─ products.json
│  └─ pageobjects/
└─ wdio.conf.js

В users.json можно хранить данные пользователей:

[
  {
    "username": "admin",
    "password": "Admin123"
  },
  {
    "username": "guest",
    "password": "Guest123"
  }
]

Такой подход обеспечивает единую точку изменений данных без необходимости редактировать сами тесты.


Загрузка и использование фикстур

В WebdriverIO фикстуры можно загружать с помощью стандартного импорта:

import users from '../fixtures/users.json';

describe('Авторизация пользователей', () => {
    users.forEach(user => {
        it(`Авторизация для пользователя ${user.username}`, async () => {
            await browser.url('/login');
            const usernameInput = await $('#username');
            const passwordInput = await $('#password');
            const loginButton = await $('#login');

            await usernameInput.setValue(user.username);
            await passwordInput.setValue(user.password);
            await loginButton.click();

            await expect($('#welcome-message')).toHaveTextContaining(`Welcome, ${user.username}`);
        });
    });
});

Ключевые моменты:

  • Импорт JSON-файлов позволяет работать с данными как с обычным объектом.
  • Цикл по массиву данных обеспечивает генерацию нескольких тестов с разными фикстурами.
  • Изоляция данных гарантирует, что тесты остаются независимыми.

Динамические фикстуры

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

function generateUser() {
    const timestamp = Date.now();
    return {
        username: `user${timestamp}`,
        password: `Pass${timestamp}`
    };
}

describe('Регистрация нового пользователя', () => {
    it('Создание уникального пользователя', async () => {
        const newUser = generateUser();
        await browser.url('/register');
        await $('#username').setValue(newUser.username);
        await $('#password').setValue(newUser.password);
        await $('#register-button').click();

        await expect($('#success-message')).toBeDisplayed();
    });
});

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


Интеграция фикстур с Page Object

Page Object Pattern в WebdriverIO позволяет отделять структуру страницы от тестовой логики. Фикстуры интегрируются естественно:

// pageobjects/LoginPage.js
class LoginPage {
    get username() { return $('#username'); }
    get password() { return $('#password'); }
    get loginButton() { return $('#login'); }

    async login(user) {
        await this.username.setValue(user.username);
        await this.password.setValue(user.password);
        await this.loginButton.click();
    }
}

export default new LoginPage();

Использование фикстур в тесте:

import LoginPage from '../pageobjects/LoginPage.js';
import users from '../fixtures/users.json';

describe('Тест авторизации через Page Object', () => {
    users.forEach(user => {
        it(`Авторизация для ${user.username}`, async () => {
            await browser.url('/login');
            await LoginPage.login(user);
            await expect($('#welcome-message')).toHaveTextContaining(`Welcome, ${user.username}`);
        });
    });
});

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


Практические советы при работе с фикстурами

  1. Использовать уникальные идентификаторы для динамических данных, чтобы избежать конфликтов при параллельном запуске тестов.
  2. Делить фикстуры по контекстам (пользователи, товары, заказы), чтобы проще было ориентироваться.
  3. Версионировать фикстуры при изменении структуры приложения, чтобы старые тесты не ломались.
  4. Комбинировать статические и динамические данные, сохраняя повторяемость и гибкость.
  5. Очистка данных после теста при необходимости, особенно для записи в базы данных или внешние системы.

Фикстуры являются мощным инструментом для управления тестовыми данными в WebdriverIO. Они повышают надежность тестов, делают код более чистым и упрощают масштабирование автоматизации при росте проекта.