Разработка системы автоматического тестирования для 1С-Битрикс
Обновление ядра Битрикс каждые две недели, постоянные доработки, интеграция с 1С — регрессионное тестирование вручную занимает 4–8 часов после каждого изменения. Автоматизированные тесты сокращают это до 10–15 минут и дают уверенность, что ключевой функционал работает. Сложность в том, что Битрикс — монолитный фреймворк с глобальным состоянием, который не любит тестовую изоляцию. Нужна специфическая инфраструктура.
Стек тестирования
Для Битрикс-проектов актуальна комбинация:
- PHPUnit — unit-тесты для изолируемой бизнес-логики
- Codeception — функциональные и интеграционные тесты (имеет модуль для Bitrix)
- Playwright / Puppeteer — e2e тесты браузерного поведения
- PHPStan — статический анализ (не тест, но часть CI)
Инфраструктура для unit-тестов
Главная проблема unit-тестирования Битрикс — код зависит от глобального состояния: \Bitrix\Main\Application::getInstance(), \CMain, $DB. Запустить тест без инициализации Битрикс-ядра нельзя.
Решение — загружать ядро в bootstrap-файле тестов:
// tests/bootstrap.php
$_SERVER['DOCUMENT_ROOT'] = dirname(__DIR__);
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
define('BX_WITH_ON_AFTER_EPILOG', false);
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
phpunit.xml:
<phpunit bootstrap="tests/bootstrap.php">
<testsuites>
<testsuite name="Unit">
<directory>tests/unit</directory>
</testsuite>
</testsuites>
</phpunit>
Что тестируется unit-тестами
Бизнес-логика, изолированная в классах без прямой зависимости от ядра:
class ArticleResolverTest extends TestCase
{
public function testResolveValidArticle(): void
{
// Мокаем зависимость от IBlock API
$resolver = new ArticleResolver($this->createMockRepository());
$result = $resolver->resolve('ABC-123', CATALOG_IBLOCK_ID);
$this->assertSame(456, $result->getSkuId());
}
public function testResolveUnknownArticleReturnsNull(): void
{
$resolver = new ArticleResolver($this->createEmptyRepository());
$this->assertNull($resolver->resolve('UNKNOWN', CATALOG_IBLOCK_ID));
}
}
Ключевой паттерн: внедрение зависимостей вместо прямых вызовов статических методов Битрикс — это и делает код тестируемым.
Функциональные тесты с Codeception
Codeception с модулем для Битрикс позволяет тестировать HTTP-сценарии без браузера:
// tests/functional/OrderCheckoutCest.php
class OrderCheckoutCest
{
public function addToCartAndCheckout(FunctionalTester $I): void
{
$I->amOnPage('/catalog/product-slug/');
$I->click('Добавить в корзину');
$I->seeInDatabase('b_sale_basket', ['PRODUCT_ID' => 123]);
$I->amOnPage('/order/');
$I->fillField('NAME', 'Тест Тестов');
$I->fillField('EMAIL', '[email protected]');
$I->click('Оформить заказ');
$I->seeInDatabase('b_sale_order', ['STATUS_ID' => 'N']);
}
}
E2E тесты с Playwright
Для критических пользовательских путей — e2e тесты, которые запускают настоящий браузер:
// tests/e2e/checkout.spec.js
test('full checkout flow', async ({ page }) => {
await page.goto('/catalog/product-slug/');
await page.click('.add-to-cart-btn');
await expect(page.locator('.cart-count')).toHaveText('1');
await page.goto('/order/');
await page.fill('[name="NAME"]', 'Test User');
await page.fill('[name="EMAIL"]', '[email protected]');
await page.click('.submit-order-btn');
await expect(page).toHaveURL(/\/order\/success\//);
});
CI/CD интеграция
Тесты запускаются автоматически при пуше в репозиторий. GitHub Actions / GitLab CI:
# .github/workflows/tests.yml
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
- run: composer install
- run: vendor/bin/phpunit --testsuite Unit
- run: vendor/bin/codecept run functional
| Тип теста | Инструмент | Время выполнения | Покрытие |
|---|---|---|---|
| Unit (изолированная логика) | PHPUnit | 30–60 с | Резолвинг, расчёты, маппинг |
| Функциональные | Codeception | 2–5 мин | Корзина, заказ, формы |
| E2E | Playwright | 5–10 мин | Критические пути пользователя |
| Статический анализ | PHPStan | 1–2 мин | Весь PHP-код |
Что входит в разработку системы тестирования
- Настройка bootstrap-окружения PHPUnit для загрузки Битрикс в тестовом режиме
- Рефакторинг кода для внедрения зависимостей и тестируемости
- Написание unit-тестов для ключевой бизнес-логики
- Настройка Codeception для функциональных тестов HTTP-сценариев
- E2e тесты на Playwright для критических пользовательских путей
- Интеграция в CI/CD (GitHub Actions, GitLab CI)







