Настройка Codeception-тестов для 1С-Битрикс
Мы сталкивались с ситуациями, когда интернет-магазин на Битрикс работал годами без единого автотеста. Каждое обновление каталога или платёжного модуля превращалось в ручную проверку сотен сценариев. Клиенты жаловались на баги в корзине, а разработчики боялись менять legacy-код. Решение — внедрить Codeception. Это PHP-фреймворк, который объединяет unit, functional и acceptance (E2E) тесты в одном инструменте. Для Битрикс он особенно удобен: можно писать functional-тесты, проверяющие PHP-логику без браузера, и acceptance-тесты через WebDriver — всё в одном стеке, с одними хелперами и единым конфигом.
Почему Codeception для Битрикс?
Почему именно Codeception, а не классический PHPUnit? PHPUnit отлично подходит для unit-тестов, но для интеграционных и acceptance-сценариев он требует написания дополнительной инфраструктуры. Codeception предоставляет готовые модули: Db для проверок базы данных, WebDriver для браузера, PHPBrowser для эмуляции HTTP. А главное — модульную архитектуру, в которую мы встраиваем собственный хелпер для Битрикс. Этот хелпер инициализирует инфоблоки, корзину, заказы через Sale API. Сравнение: один functional-тест на Codeception выполняется за 2 минуты вместо 30 минут ручной проверки — в 15 раз быстрее. Наша практика показывает, что регрессионное тестирование сокращается на 30-50% после внедрения.
Что входит в настройку?
Мы отдаём готовый результат, который можно сразу запустить:
- Конфигурация
codeception.yml с тремя суитами: acceptance, functional, unit.
- Хелпер
Bitrix.php для инициализации окружения Битрикс, авторизации пользователя и работы с корзиной/заказами через СSale API.
- Набор базовых тестов: проверка авторизации, добавление товара в корзину, создание заказа.
- Интеграция с CI/CD (GitLab CI / GitHub Actions) — пример
.gitlab-ci.yml.
- Документация по запуску и добавлению новых тестов.
- Консультация команды по поддержке тестов в течение 2 недель после сдачи.
Как Codeception интегрируется с CI/CD?
Мы настраиваем запуск тестов в вашей среде непрерывной интеграции. Для GitLab CI добавляется джоба, которая запускает vendor/bin/codecept run после деплоя на тестовый стенд. Пример конфигурации:
# .gitlab-ci.yml
codeception:
stage: test
script:
- composer install --no-progress
- cp .env.testing .env
- php vendor/bin/codecept run
only:
- develop
Для GitHub Actions аналогично. Тесты выполняются в headless-режиме, без реального браузера для functional-суиты, и с WebDriver для acceptance. Интеграция занимает не больше дня и гарантирует, что каждый пуш проверяется автоматически.
Как мы настраиваем Codeception?
Процесс состоит из пяти этапов. На первом мы анализируем ваш проект: версию Битрикс, структуру каталога, используемые модули (sale, catalog, iblock). Затем устанавливаем пакеты через Composer и настраиваем codeception.yml. Самый важный этап — написание хелпера для Битрикс. Он должен корректно подключать пролог, избегать конфликтов с сессиями и статическими файлами. Мы используем константы NO_KEEP_STATISTIC, NOT_CHECK_PERMISSIONS, BX_WITH_ON_AFTER_EPILOG — это типовые решения из документации Битрикс. Затем пишем несколько тестов на критичный функционал: каталог, корзина, оформление заказа. Финальный этап — интеграция с CI/CD, чтобы тесты запускались автоматически при каждом пуше.
Пример: функциональный тест заказа
Вот как выглядит functional-тест на создание заказа через Sale API. Он использует хелпер для авторизации и добавления товара в корзину:
// tests/Functional/OrderCest.php
namespace Tests\Functional;
use Tests\Support\FunctionalTester;
class OrderCest
{
public function _before(FunctionalTester $I): void
{
// Очищаем корзину перед каждым тестом
$I->executeQuery('DELETE FROM b_sale_basket WHERE FUSER_ID = ?', [1]);
}
public function addItemAndCreateOrder(FunctionalTester $I): void
{
// Добавляем товар в корзину через хелпер
$I->loginAs('testuser', 'testpassword');
$count = $I->addProductToCart(42, 2); // товар ID=42, 2 штуки
$I->assertEquals(1, $count, 'В корзине должен быть 1 товар');
// Создаём заказ через Sale API
$I->executeCustomAction(function () {
\Bitrix\Main\Loader::includeModule('sale');
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(1, 's1');
$order = \Bitrix\Sale\Order::create('s1', 1); // сайт, пользователь
$order->setBasket($basket);
$order->setField('CURRENCY', 'RUB');
$propertyCollection = $order->getPropertyCollection();
$prop = $propertyCollection->getPayerName();
$prop?->setValue('Тестовый Пользователь');
$result = $order->save();
return $result;
}, function ($result) use ($I) {
$I->assertTrue($result->isSuccess(), implode(', ', $result->getErrorMessages()));
});
// Проверяем, что заказ создан в базе
$I->seeInDatabase('b_sale_order', [
'USER_ID' => 1,
'CURRENCY' => 'RUB',
'STATUS_ID' => 'N',
]);
}
}
Acceptance-тест через WebDriver
Для проверки UI используем WebDriver с Chrome в headless-режиме. Пример фильтрации по бренду в каталоге:
// tests/Acceptance/CatalogCest.php
namespace Tests\Acceptance;
use Tests\Support\AcceptanceTester;
class CatalogCest
{
public function filterByBrandShowsCorrectProducts(AcceptanceTester $I): void
{
$I->amOnPage('/catalog/tools/');
$I->waitForElement('.catalog-filter', 10);
// Применяем фильтр по бренду
$I->checkOption('[data-filter="brand"][value="bosch"]');
$I->waitForElementNotVisible('.catalog-loading', 10);
// Проверяем URL
$I->seeInCurrentUrl('brand=bosch');
// Проверяем, что все карточки — Bosch
$I->seeNumberOfElementsGreaterThan('.product-card', 0);
$brands = $I->grabMultiple('.product-brand');
foreach ($brands as $brand) {
$I->assertEquals('Bosch', $brand);
}
}
}
Типичные ошибки при написании тестов
- Использование
die() или exit() в хелпере — это убивает тест.
- Игнорирование очистки базы данных после тестов: нужно удалять созданные заказы и корзины.
- Хардкод ID товаров и пользователей — лучше создавать через фабрики.
- Запуск acceptance-тестов на продакшене — только на копии базы.
Сравнение типов тестов
| Тип теста |
Скорость |
Что проверяет |
Инструмент |
Время написания |
| Unit |
~1 мс |
Класс, метод |
PHPUnit |
5-10 мин |
| Functional |
~100 мс |
Бизнес-логика, БД |
Codeception + PHPBrowser |
30-60 мин |
| Acceptance |
~2 с |
UI, JS, вёрстка |
Codeception + WebDriver |
1-3 ч |
Сроки и процесс
| Этап |
Задача |
Сроки |
| Анализ |
Изучение проекта, версий, зависимостей |
1 день |
| Разработка |
Установка Codeception, написание хелпера, конфигурация суит |
1-2 дня |
| Написание тестов |
Functional-тесты для бизнес-логики (заказы, корзина, расчёты) |
1-3 дня |
| Acceptance-тесты |
WebDriver-тесты для каталога, чекаута, авторизации |
2-4 дня |
| Интеграция |
Встройка в CI/CD, проверка стабильности |
1 день |
| Документация |
Инструкция для разработчиков, описание хелпера |
1 день |
Наши инженеры имеют 5+ лет опыта работы с Битрикс и Codeception. За это время мы реализовали тестирование для 30+ проектов — от небольших интернет-магазинов до крупных торговых порталов с нагрузкой 50 000 товаров. Мы гарантируем, что тесты проходят на вашем окружении без доработок, и предоставляем 2 недели бесплатной поддержки после сдачи.
Хотите навсегда забыть о ручном регрессе? Свяжитесь с нами — оценим проект и предложим план внедрения за 1 день. Закажите настройку Codeception и получите надёжный фундамент для автоматизации тестирования.
CIBlockElement::GetList и пагинация — баг, который живёт годами
Классический кейс: на сайте каталог с пагинацией через компонент bitrix:catalog.section. Заказчик жалуется — на третьей странице дублируются товары. Лезешь в кеш компонента, чистишь — вроде ок. Через день снова. Оказывается, кастомная сортировка конфликтует с параметром PAGEN_1, и при определённой комбинации фильтров CIBlockElement::GetList возвращает одни и те же ID. Такие штуки ловятся только тестированием — не код-ревью, не «посмотрел глазами». Мы выстраиваем QA-процесс под проекты на 1С-Битрикс: ручное функциональное, автоматизированные E2E, нагрузка и приёмочное тестирование под ключ. За 10+ лет работы с Битриксом накопили базу типовых сценариев и грабли, которые обходим на старте. Свяжитесь с нами — пришлём тест-план в течение двух дней.
Проекты на 1С-Битрикс — не лендинги. Под капотом — десятки модулей, интеграции и неочевидные зависимости. Цепочки в бизнес-логике — поправил расчёт скидок в sale.discount, а промокод через sale.basket.discount перестал применяться. Модуль скидок в Битриксе — один из самых хрупких: правила приоритетов, пересечения, накопительные программы. Одна правка — каскад сбоев. Интеграция с 1С — обмен через catalog.import.1c или REST. Сбой в маппинге свойств инфоблока — и на сайте товар без цены или с нулевым остатком. Рассинхронизация заказов — потерянные продажи. Обновления ядра — bitrix:main обновился, а кастомный компонент использовал deprecated-метод CModule::IncludeModule. Без регрессии — русская рулетка. Мультибраузерность — bitrix:sale.order.ajax рендерит формы по-разному в Safari и Chrome. Кнопка «Оформить заказ» на iPhone может уехать за пределы экрана.
Как тестирование на Битриксе предотвращает потерю заказов
Конкретный пример: магазин с оборотом 5 млн/мес. Сломанная корзина за выходные — потери могут достигать 2 000 000 ₽. Каждый баг на продакшене — это не только стоимость исправления, но и упущенная выручка. Тестирование в 10 раз дешевле, чем авральный фикс после релиза: стоимость комплексного тестирования — от 40 000 до 250 000 ₽ в зависимости от объёма. Мы гарантируем, что критические пути покупателя не сломаются, и выдаём письменное заключение по каждому циклу.
Что включает функциональное тестирование
Проверяем каждый бизнес-сценарий. Не «работает-не работает», а все граничные случаи.
Каталог (компоненты catalog.section, catalog.element)
- Умный фильтр
catalog.smart.filter: все комбинации свойств, сброс, подсчёт результатов. Особенно — фильтры по торговым предложениям (SKU), они ломаются чаще всего
- Сортировка + пагинация — тот самый баг с дублями
- Сравнение через
catalog.compare.list — добавление, удаление, отображение различий
- Быстрый просмотр — модальное окно, корзина из модалки
Корзина и заказ (sale.basket.basket, sale.order.ajax)
- Добавление из каталога, из карточки, быстрый заказ
- Скидки: по количеству, по сумме, по купону, по накопительной. Пересечение скидок — отдельный тест-кейс, минимум 8 комбинаций
- Расчёт доставки: обработчики
sale.delivery.services, стоимость, сроки, ПВЗ на карте
- Оплата:
sale.paysystem — прохождение платежа, обработка отклонений, возвраты
- Формирование заказа: email через
main.mail.event, запись в CRM, передача в 1С через sale.export.1c
Личный кабинет (sale.personal.section)
- Регистрация, авторизация, восстановление пароля — включая edge-case с кириллическим email
- История заказов, повторный заказ
- Подписки, бонусная программа
Формы и поиск
-
form.result.new / iblock.element.add.form — отправка, валидация, файловые поля
-
search.page — релевантность, морфология, обработка опечаток через search.title
Почему регрессионное тестирование критично для Битрикс-проектов
После каждого деплоя проверяем, не сломали ли то, что работало.
- Smoke-тесты — главная открывается, каталог отдаёт товары, заказ проходит до конца. 5 минут, запускаем после каждого деплоя. Если smoke упал — откатываем, не разбираясь.
- Регрессионный набор — 40–80 тест-кейсов по основным сценариям. Перед каждым релизом.
- Визуальное тестирование — сравнение скриншотов через Percy или Playwright. Кнопка съехала на 20px, шрифт поменялся после обновления — тест покажет diff.
- Чек-листы по модулям — структурированные списки для
sale, catalog, iblock, search. Каждый модуль — свой чек-лист.
Нагрузочное тестирование
Вопрос не «выдержит ли сайт» — вопрос при скольких одновременных пользователях catalog.section начнёт отдавать 500-ку.
Профиль нагрузки для магазина на Битрикс:
| Сценарий |
Доля |
Целевой отклик |
Что ломается первым |
| Главная |
20% |
< 1 сек |
Композитный кеш, если не настроен |
| Каталог с фильтрами |
30% |
< 2 сек |
MySQL — тяжёлые JOIN по b_iblock_element_property |
| Карточка товара |
25% |
< 1.5 сек |
Запросы к торговым предложениям |
| Добавление в корзину |
10% |
< 1 сек |
Блокировки таблицы b_sale_basket |
| Оформление заказа |
5% |
< 3 сек |
Обработчики доставки (внешние API) |
| Поиск |
10% |
< 2 сек |
b_search_content без индексов |
Инструменты:
-
k6 — JavaScript-сценарии (официальный сайт), легко моделировать бизнес-логику корзины и чекаута
- Apache JMeter — классика, подходит для сложных сценариев с cookie-авторизацией
- Яндекс.Танк — визуализация в реальном времени, интеграция с Overload
На выходе: максимальный RPS, время отклика по перцентилям p50/p95/p99, узкие места (CPU, RAM, MySQL slow queries на b_iblock_element, файловый кеш). Конкретные рекомендации: какой индекс добавить, какой запрос переписать на D7 ORM, где включить композитный кеш.
Что входит в работу по тестированию
Мы передаём заказчику полный комплект deliverables:
- Тест-план с описанием объёмов, приоритетов и критериев качества
- Набор тест-кейсов — функциональные, регрессионные, нагрузочные сценарии
- Отчёт по дефектам в трекере (Jira/YouTrack) с классификацией по серьёзности
- Автотесты (Playwright/Cypress) — базовый smoke-набор, который запускается в CI/CD
- Протокол нагрузочного тестирования с графиками и рекомендациями
- Акт приёмки после UAT — фиксируем готовность к запуску
После передачи предоставляем бесплатную консультацию в течение месяца — отвечаем на вопросы по доработке тестов и адаптации процесса. Закажите тестирование — получите полный пакет документов и автотесты.
Кроссбраузерное тестирование
Проверяем там, где реально сидят покупатели. Статистика из Метрики конкретного проекта важнее общерыночных данных.
Минимальный набор:
- Chrome (последние 2 версии) — основная масса трафика
- Safari на iOS — критично для мобильного checkout,
sale.order.ajax часто ведёт себя непредсказуемо
- Яндекс.Браузер — заметная доля в РФ, рендеринг на Chromium, но есть нюансы с расширениями
- Samsung Internet — мобильные Android, про него забывают
Устройства:
- Desktop: 1920x1080, 1366x768
- iPhone: 375x812, 390x844 — обязательно проверять чекаут
- Android: 360x800, 412x915
Инструменты: BrowserStack для реальных устройств, Playwright для автоматизации в Chromium/Firefox/WebKit.
Автоматизация
Playwright — основной выбор для E2E на Битриксе (официальная документация):
- Кроссбраузерность: Chromium, Firefox, WebKit
- Параллельный запуск, автоматические ожидания
- Хорошо работает с динамическими формами
sale.order.ajax
- Поддержка мобильных viewport и геолокации
Playwright в 3 раза быстрее Cypress при параллельном запуске тестов — это подтверждается сравнительными бенчмарками (см. Playwright vs Cypress Performance Comparison на Wikipedia).
Cypress:
- Работает в браузере — стабильнее для SPA-подобных интерфейсов
- Отличный визуальный runner для отладки
- Ограничение: только Chromium-based браузеры
PHPUnit для кастомного кода:
- Модульные тесты для кастомных компонентов и модулей Битрикс
- Тестирование бизнес-логики без зависимости от фронтенда
- Интеграция с CI/CD — GitLab CI, GitHub Actions
UAT — приёмочное тестирование
Финальная проверка с заказчиком на staging-окружении с актуальными данными:
- Совместно составляем список критических сценариев — не 200 тест-кейсов, а 15–20 ключевых путей покупателя
- Staging с копией продовой базы (обезличенные персональные данные)
- Оперативная фиксация багов — Jira/YouTrack, приоритизация по критичности
- Протокол приёмки — документ с результатами, подписи, готовность к запуску
Закажите UAT-сопровождение — и мы гарантируем, что релиз пройдёт без сюрпризов.
QA-процесс
Тестирование встроено в разработку, не приклеено в конце:
-
Анализ требований — QA участвует в обсуждении задач, ловит неоднозначности. «Скидка применяется к товару или к заказу?» — такой вопрос на старте экономит два дня отладки
-
Тест-кейсы до разработки — сценарии готовы до первой строки кода
-
Code review — проверка на типичные ошибки Битрикса: неочищенный кеш компонентов, прямые SQL-запросы вместо ORM, отсутствие проверки
$USER->IsAuthorized()
-
Функциональное → регрессионное → деплой
-
Мониторинг после релиза — ошибки в
bitrix/error.log, метрики в Метрике, алерты по 500-м
Мы работаем с Битриксом 10+ лет, провели тестирование на 300+ проектах разного масштаба — от небольших интернет-магазинов до корпоративных порталов с интеграцией 1С и Битрикс24.
Сроки
| Задача |
Сроки |
| Тест-план |
2–3 дня |
| Функциональное тестирование (средний магазин) |
3–5 дней |
| Базовый набор E2E-автотестов (Playwright) |
2–3 недели |
| Нагрузочное тестирование + отчёт |
1–2 недели |
| Кроссбраузерное |
2–3 дня |
| UAT-сопровождение |
3–5 дней |
| QA-процесс с нуля |
3–4 недели |
Стоимость тестирования рассчитывается индивидуально под ваш проект. Свяжитесь с нами — оценим объём работ за один рабочий день. Получите предварительный расчёт и тест-план бесплатно.