В автоматизированном тестировании ключевым элементом является управление данными, с которыми взаимодействует тестируемое приложение. Фикстуры позволяют создавать, загружать и использовать предопределённые наборы данных, обеспечивая повторяемость тестов, минимизируя зависимость от внешних источников и упрощая поддержку тестового окружения.
Фикстура — это заранее подготовленный набор данных, который тест может использовать для своих сценариев. В контексте WebdriverIO фикстуры обычно применяются для:
Фикстуры позволяют отделить данные от логики тестов, делая тесты более читаемыми и управляемыми.
Фикстуры обычно хранятся в отдельных 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}`);
});
});
});
Ключевые моменты:
Иногда тесту необходимы динамически создаваемые данные, например уникальные пользователи или заказы. В таких случаях фикстуру можно генерировать внутри теста:
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 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}`);
});
});
});
Такое сочетание повышает читаемость и поддерживаемость тестов, минимизируя дублирование кода.
Фикстуры являются мощным инструментом для управления тестовыми данными в WebdriverIO. Они повышают надежность тестов, делают код более чистым и упрощают масштабирование автоматизации при росте проекта.