Использование fixtures

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


Основные принципы работы с fixtures

Fixtures чаще всего применяются для:

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

В Protractor fixtures реализуются через комбинацию стандартных механизмов JavaScript (модули, файлы JSON) и встроенных функций фреймворка Jasmine или Mocha.


Организация fixtures

1. Структура проекта:

Обычно fixtures хранятся в отдельной директории, например:

/e2e
  /fixtures
    users.json
    products.json
  /tests
    login.spec.js
    cart.spec.js

Файлы JSON содержат заранее подготовленные данные:

// users.json
{
  "admin": {
    "username": "admin",
    "password": "admin123"
  },
  "guest": {
    "username": "guest",
    "password": "guest123"
  }
}

2. Импорт и использование данных:

В тестах JSON-файл можно подключить через require:

const users = require('../fixtures/users.json');

describe('Авторизация пользователей', () => {
  it('должен входить как администратор', async () => {
    await browser.get('/login');
    await element(by.name('username')).sendKeys(users.admin.username);
    await element(by.name('password')).sendKeys(users.admin.password);
    await element(by.id('loginButton')).click();

    const welcomeText = await element(by.id('welcome')).getText();
    expect(welcomeText).toContain('Добро пожаловать, admin');
  });
});

Использование fixtures с beforeEach и beforeAll

Для эффективного применения fixtures важно корректно размещать их в жизненном цикле тестов.

  • beforeAll — выполняется один раз перед всеми тестами в describe. Идеально подходит для предзагрузки глобальных данных.
  • beforeEach — выполняется перед каждым тестом. Используется для создания свежих объектов или сброса состояния.

Пример:

describe('Тестирование корзины', () => {
  let products;

  beforeAll(() => {
    products = require('../fixtures/products.json');
  });

  beforeEach(async () => {
    await browser.get('/cart');
    await browser.executeScript('window.localStorage.clear();');
  });

  it('должен добавлять товар в корзину', async () => {
    await element(by.cssContainingText('.product-name', products.item1.name)).click();
    await element(by.id('addToCart')).click();

    const cartItems = await element.all(by.css('.cart-item'));
    expect(cartItems.length).toBe(1);
  });
});

Fixtures для API и моков

В некоторых случаях тестирование требует не только статических данных, но и имитации ответов сервера. Protractor позволяет использовать fixtures для мокирования HTTP-запросов:

const mockData = require('../fixtures/mockData.json');

browser.addMockModule('httpMock', function(data) {
  angular.module('httpMock', ['ngMockE2E'])
    .run(function($httpBackend) {
      $httpBackend.whenGET('/api/products').respond(data.products);
    });
}, mockData);

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


Рекомендации по использованию fixtures

  • Делить данные по контексту: пользователи, товары, настройки — отдельные файлы.
  • Минимизировать повторяющиеся данные: использовать общие объекты, чтобы избежать дублирования.
  • Автоматический сброс состояния: очищать данные перед каждым тестом через beforeEach.
  • Использовать асинхронные операции корректно: при работе с базой или API использовать async/await для гарантии завершения подготовительных операций.

Интеграция с TypeScript и Protractor

В проектах на TypeScript fixtures подключаются аналогично, с добавлением типов:

interface User {
  username: string;
  password: string;
}

const users: Record<string, User> = require('../fixtures/users.json');

Это повышает читаемость тестов и уменьшает вероятность ошибок при обращении к данным.


Использование fixtures в Protractor позволяет создавать надежные, повторяемые и изолированные тестовые сценарии, значительно упрощая тестирование сложных веб-приложений и поддерживая стабильность автоматизации.