WebdriverIO предоставляет гибкую интеграцию с Mocha — популярным
JavaScript фреймворком для тестирования, который поддерживает
асинхронные операции и богатую систему хуков. Основным инструментом
конфигурации является файл wdio.conf.js. В нём можно
указать Mocha как тестовый фреймворк, настроить интерфейс
(bdd или tdd), timeout для тестов и количество
повторений.
Пример минимальной конфигурации для Mocha:
exports.config = {
runner: 'local',
framework: 'mocha',
mochaOpts: {
ui: 'bdd',
timeout: 60000
},
specs: [
'./test/specs/**/*.js'
]
};
Здесь:
framework: 'mocha' указывает WebdriverIO использовать
Mocha для выполнения тестов.mochaOpts.ui выбирает стиль написания тестов
(bdd — describe/it,
tdd — suite/test).mochaOpts.timeout задаёт максимальное время ожидания
выполнения теста в миллисекундах.Mocha поддерживает следующие ключевые блоки:
describe — логическая группировка тестов.it — отдельный тестовый случай.before, after, beforeEach,
afterEach — хуки для подготовки и очистки окружения.Пример использования хуков с WebdriverIO:
describe('Авторизация пользователя', () => {
before(async () => {
await browser.url('https://example.com/login');
});
beforeEach(async () => {
await browser.refresh();
});
it('должна отображать форму входа', async () => {
const loginForm = await $('#loginForm');
await expect(loginForm).toBeDisplayed();
});
it('должна позволять авторизоваться с корректными данными', async () => {
await $('#username').setValue('user');
await $('#password').setValue('password');
await $('#loginButton').click();
const dashboard = await $('#dashboard');
await expect(dashboard).toBeDisplayed();
});
afterEach(async () => {
await browser.deleteCookies();
});
after(async () => {
await browser.closeWindow();
});
});
async/awaitWebdriverIO полностью поддерживает асинхронные операции, поэтому все
действия с браузером должны выполняться через await. Это
обеспечивает последовательное выполнение команд и предотвращает гонки
между действиями.
Использование промисов напрямую с Mocha допустимо, но
async/await делает код более читаемым и предсказуемым.
Mocha интеграция с WebdriverIO позволяет подключать различные репортеры, чтобы улучшить читаемость результатов тестирования:
reporters: ['spec', ['allure', { outputDir: 'allure-results' }]],
spec выводит результаты тестов в консоль.allure позволяет создавать визуальные отчёты с
вложениями, скриншотами и логами.WebdriverIO поддерживает параллельное выполнение тестов через
maxInstances в конфигурации. Это особенно полезно для
ускорения тестов при большом количестве сценариев:
capabilities: [{
maxInstances: 5,
browserName: 'chrome'
}]
При использовании Mocha важно учитывать, что хуки выполняются для каждого экземпляра отдельно. Асинхронные операции в хуках не должны блокировать другие тесты.
before и after в глобальном масштабеMocha позволяет определять глобальные хуки, например, для подключения к API или подготовки базы данных до запуска всех тестов:
before(async () => {
await api.login('admin', 'adminpass');
});
after(async () => {
await api.logout();
});
Глобальные хуки применяются один раз для всего тестового набора, в
отличие от хуков внутри describe, которые выполняются
локально.
describe:
позволяют структурировать тесты по функционалу.--grep "login" запустит только тесты с “login” в
имени.retries:mochaOpts: {
ui: 'bdd',
timeout: 60000,
retries: 2
}
Внутри Mocha-тестов доступны все WebdriverIO команды для элементов и браузера:
browser.url(), browser.refresh(),
browser.deleteCookies().$('#selector').click(),
$('#selector').setValue(),
$('#selector').getText().waitForDisplayed(),
waitForClickable(), а также expect() с
WebdriverIO matchers.Правильное сочетание Mocha хуков и команд WebdriverIO позволяет писать надежные и поддерживаемые тесты для сложных веб-приложений, минимизируя дублирование кода и обеспечивая предсказуемое поведение тестовой среды.
Mocha поддерживает динамическую генерацию тестов с помощью массивов и циклов:
const credentials = [
{ user: 'user1', pass: 'pass1' },
{ user: 'user2', pass: 'pass2' }
];
credentials.forEach(({ user, pass }) => {
it(`авторизация для ${user}`, async () => {
await $('#username').setValue(user);
await $('#password').setValue(pass);
await $('#loginButton').click();
await expect($('#dashboard')).toBeDisplayed();
});
});
Это особенно полезно для тестирования множества комбинаций данных без дублирования кода.
Mocha позволяет интегрировать автоматическое снятие скриншотов при падении теста через хуки:
afterEach(async function() {
if (this.currentTest.state === 'failed') {
await browser.saveScreenshot(`./screenshots/${this.currentTest.title}.png`);
}
});
Такой подход значительно облегчает анализ причин падений тестов и ускоряет отладку.
Встроенная интеграция с CI/CD возможна через WebdriverIO CLI. Параметры Mocha, репортеры и хуки полностью поддерживаются при запуске через Jenkins, GitHub Actions, GitLab CI. Это позволяет автоматически запускать тесты, собирать отчёты и сохранять артефакты (скриншоты, логи) без изменения структуры тестов.