Fixtures в контексте тестирования представляют собой заранее подготовленные данные или состояния, необходимые для выполнения тестов. В Protractor они позволяют создавать стабильные условия для проверки функциональности веб-приложений, обеспечивая повторяемость и изоляцию тестов.
Fixtures чаще всего применяются для:
В Protractor fixtures реализуются через комбинацию стандартных механизмов JavaScript (модули, файлы JSON) и встроенных функций фреймворка Jasmine или Mocha.
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');
});
});
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);
});
});
В некоторых случаях тестирование требует не только статических данных, но и имитации ответов сервера. 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);
Такой подход обеспечивает предсказуемость тестов, особенно при работе с внешними сервисами.
beforeEach.async/await для
гарантии завершения подготовительных операций.В проектах на TypeScript fixtures подключаются аналогично, с добавлением типов:
interface User {
username: string;
password: string;
}
const users: Record<string, User> = require('../fixtures/users.json');
Это повышает читаемость тестов и уменьшает вероятность ошибок при обращении к данным.
Использование fixtures в Protractor позволяет создавать надежные, повторяемые и изолированные тестовые сценарии, значительно упрощая тестирование сложных веб-приложений и поддерживая стабильность автоматизации.