Тестирование
Chef запускает тесты в реальном браузере через Playwright. Поддерживаются два вида тестов: unit-тесты (Mocha + Chai) и E2E-тесты (Playwright Test API).
Подготовка
Инициализируйте тестовое окружение:
chef init testsКоманда создаёт два файла в корне проекта:
| Файл | Описание |
|---|---|
playwright.config.ts | Конфиг Playwright для запуска unit и E2E тестов в браузере |
.env.test | Учётные данные для автоматической аутентификации при тестировании |
Заполните учётные данные вашей локальной установки Bitrix:
BASE_URL=http://localhost
LOGIN=admin
PASSWORD=your_password| Переменная | Описание |
|---|---|
BASE_URL | URL локальной установки Bitrix |
LOGIN | Логин тестового пользователя |
PASSWORD | Пароль тестового пользователя |
WARNING
Не коммитьте .env.test в систему контроля версий — файл содержит конфиденциальные данные.
Установите браузеры Playwright:
npx playwright installТипы для IDE
mocha, chai и их типы включены в Chef и используются при запуске chef test. Для работы автодополнения в IDE установите типы локально:
npm install --save-dev @types/mocha @types/chai @playwright/testЗапуск тестов
# Все тесты расширения
chef test vendor.my-extension
# Только unit-тесты
chef test unit vendor.my-extension
# Только e2e-тесты
chef test e2e vendor.my-extension
# Конкретный файл
chef test unit vendor.my-extension ./utils.test.ts
# Тесты по паттерну
chef test vendor.* --grep "should render"
# Watch-режим — перезапуск при изменениях
chef test vendor.my-extension -wОтладка
# Открыть браузер с DevTools
chef test vendor.my-extension --debug
# С видимым окном браузера
chef test vendor.my-extension --headed
# В конкретном браузере
chef test vendor.my-extension --project chromiumВ режиме --debug включаются source maps и открываются DevTools — можно ставить breakpoints прямо в исходном TypeScript-коде.
Советы
Изоляция тестов
Каждый тест должен быть независимым. Используйте beforeEach/afterEach для настройки и очистки:
describe('TodoList', () => {
let list: TodoList;
beforeEach(() => {
list = new TodoList();
});
afterEach(() => {
list.destroy();
});
it('should add item', () => {
list.add('Buy milk');
assert.equal(list.getCount(), 1);
});
it('should start empty', () => {
assert.equal(list.getCount(), 0);
});
});Организация тестов
Группируйте тесты по функциональности:
describe('UserService', () => {
describe('create', () => {
it('should create user with valid data', () => { /* ... */ });
it('should throw on duplicate email', () => { /* ... */ });
});
describe('update', () => {
it('should update user name', () => { /* ... */ });
it('should not allow empty name', () => { /* ... */ });
});
describe('delete', () => {
it('should soft delete user', () => { /* ... */ });
});
});