Розробка системи автоматичного тестування для 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)







