В процессе разработки и отладки автотестов нередко возникает
необходимость запускать не весь набор спецификаций, а только отдельные
тесты или группы тестов. Protractor, как и Jasmine, предоставляет для
этого встроенный механизм фокусировки, основанный на функциях
fit() и fdescribe(). Эти инструменты позволяют
временно ограничить область выполнения тестов без изменения конфигурации
раннера и структуры проекта.
fit() и fdescribe()Protractor использует Jasmine как тестовый фреймворк по умолчанию, поэтому механика фокусировки полностью повторяет поведение Jasmine.
fit() — фокусирует один конкретный
тест (it)fdescribe() — фокусирует группу тестов
(describe) и все вложенные в неё спецификацииПри наличии хотя бы одного fit() или
fdescribe() все остальные тесты
игнорируются, независимо от их расположения в проекте.
fit() — фокусировка
на одном тестеfit() является аналогом it(), но с
приоритетом выполнения.
describe('Авторизация пользователя', () => {
it('не пускает с неверным паролем', async () => {
// обычный тест
});
fit('успешно входит с корректными данными', async () => {
await browser.get('/login');
await element(by.id('username')).sendKeys('admin');
await element(by.id('password')).sendKeys('admin123');
await element(by.buttonText('Войти')).click();
expect(await browser.getCurrentUrl()).toContain('/dashboard');
});
it('блокирует пользователя после 3 ошибок', async () => {
// тест не будет выполнен
});
});
В этом примере будет выполнен только один тест,
помеченный fit(). Все остальные it()
игнорируются, даже если они находятся в других файлах спецификаций.
Ключевые особенности:
fdescribe()
— фокусировка на группе тестовfdescribe() применяется, когда требуется выполнить целый
блок связанных тестов.
fdescribe('Форма регистрации', () => {
it('отображает обязательные поля', async () => {
// тест
});
it('показывает ошибку при пустом email', async () => {
// тест
});
it('успешно регистрирует пользователя', async () => {
// тест
});
});
describe('Форма входа', () => {
it('не будет выполнен', async () => {
// игнорируется
});
});
Все тесты внутри fdescribe() будут выполнены, а
остальные describe() — пропущены.
Важно:
fit();describe() внутри fdescribe()
также выполняются;Если в проекте присутствуют одновременно fit() и
fdescribe(), Jasmine применяет следующий порядок:
fdescribe()fit() и обычные
it()describe() и it() вне
фокусированных блоков полностью игнорируютсяПример:
fdescribe('Основной сценарий', () => {
fit('критический тест', async () => {
// выполнится
});
it('второстепенный тест', async () => {
// выполнится
});
});
fit('одиночный тест вне блока', async () => {
// тоже выполнится
});
it('обычный тест', async () => {
// не выполнится
});
Выполнение будет ограничено двумя фокусированными областями, остальные тесты исключаются.
При запуске через protractor.conf.js механизм
фокусировки:
directConnect и при запуске
через Selenium Server;specs или
suites.Protractor просто передаёт управление Jasmine, который фильтрует тесты на этапе построения spec tree.
xdescribe()
и xit()Фокусировка и исключение тестов — разные концепции.
| Функция | Назначение |
|---|---|
fit() |
выполнить только этот тест |
fdescribe() |
выполнить только этот блок |
xit() |
временно отключить тест |
xdescribe() |
отключить группу тестов |
fit() и fdescribe() — инструменты
активной фокусировки, тогда как x* —
инструменты пассивного отключения.
Забытый fit() в коммите
Наиболее распространённая проблема — случайное попадание
fit() или fdescribe() в репозиторий. В CI это
приводит к:
Непредсказуемое поведение при множестве
fdescribe()
Несколько fdescribe() в разных файлах могут создать
иллюзию частичного запуска, хотя на самом деле выполняется только их
совокупность.
В реальных проектах часто применяются дополнительные меры:
fit() и fdescribe()
(eslint-plugin-jasmine);Пример правила ESLint:
"jasmine/no-focused-tests": "error"
fit() и fdescribe() полезны:
В стабильной ветке и CI они недопустимы и должны отсутствовать полностью.
Несмотря на то что Protractor объявлен устаревшим, механизм фокусировки остаётся актуальным:
only()
в Mocha, test.only() в Jest).Понимание работы fit() и fdescribe()
позволяет эффективно управлять объёмом выполняемых тестов и ускорять
процесс разработки без вмешательства в инфраструктуру тестового
запуска.