Setting Up Codeception Tests for 1C-Bitrix

Setting Up Codeception Tests for 1C-Bitrix We've seen it many times: an online store on Bitrix runs for years without a single automated test. Every catalog update or payment module change turns into a manual check of hundreds of scenarios. Clients complain about cart bugs, and developers dread t

Our competencies:

Frequently Asked Questions

Setting Up Codeception Tests for 1C-Bitrix

We've seen it many times: an online store on Bitrix runs for years without a single automated test. Every catalog update or payment module change turns into a manual check of hundreds of scenarios. Clients complain about cart bugs, and developers dread touching legacy code. The solution is to adopt Codeception – a PHP framework that unifies unit, functional, and acceptance (E2E) tests in one tool. For Bitrix it's especially convenient: you can write functional tests that verify PHP logic without a browser, and acceptance tests via WebDriver – all in the same stack, with shared helpers and a single config.

Codeception vs. PHPUnit for Bitrix

Codeception offers advantages over PHPUnit for integration and acceptance scenarios. PHPUnit is fine for unit tests, but for integration and acceptance scenarios it requires extra infrastructure. Codeception provides ready modules: Db for database checks, WebDriver for the browser, PHPBrowser for HTTP emulation. And crucially – a modular architecture where we embed our own Bitrix helper. This helper initializes infoblocks, the cart, orders via the Sale API. Comparison: Codeception is 15 times faster than manual testing for functional checks – one functional test runs in 2 minutes instead of 30 minutes of manual checking. Our experience shows regression testing time drops by 30–50% after adoption. Typical setup costs range from $1,500 to $5,000 depending on project complexity. On average, clients save $8,000–$12,000 per year in reduced manual testing costs.

What's Included in the Setup?

We deliver a ready-to-run result:

  • codeception.yml configuration with three suites: acceptance, functional, unit.
  • Bitrix.php helper for initializing Bitrix environment, user authorization, and working with cart/orders via the CSale API.
  • A set of base tests: login check, adding product to cart, order creation.
  • CI/CD integration (GitLab CI / GitHub Actions) – an example .gitlab-ci.yml.
  • Documentation on running and adding new tests.
  • Two weeks of consulting for the team after handover.

How Codeception Integrates with CI/CD?

We configure test execution in your continuous integration environment. For GitLab CI, we add a job that runs vendor/bin/codecept run after deploying to the test instance. Example configuration:

# .gitlab-ci.yml codeception: stage: test script: - composer install --no-progress - cp .env.testing .env - php vendor/bin/codecept run only: - develop 

Similarly for GitHub Actions. Tests run in headless mode, without a real browser for the functional suite, and with WebDriver for acceptance. Integration takes no more than a day and guarantees every push is automatically verified.

How We Set Up Codeception (Step by Step)

  1. Analyze the project – examine Bitrix version, directory structure, used modules (sale, catalog, iblock).
  2. Install packages via Composer and configure codeception.yml.
  3. Write the Bitrix helper – correctly include the prolog, avoid session conflicts and static file issues. Use constants like NO_KEEP_STATISTIC, NOT_CHECK_PERMISSIONS, BX_WITH_ON_AFTER_EPILOG – standard solutions from the Bitrix documentation.
  4. Write several tests for critical functionality – catalog, cart, checkout.
  5. Integrate with CI/CD – so tests run automatically on every push.

Example: Functional Test for Order Creation

Here's a functional test that creates an order using the Sale API. It uses the helper to authorize and add a product to the cart:

// tests/Functional/OrderCest.php namespace Tests\Functional; use Tests\Support\FunctionalTester; class OrderCest { public function _before(FunctionalTester $I): void { // Clear the cart before each test $I->executeQuery('DELETE FROM b_sale_basket WHERE FUSER_ID = ?', [1]); } public function addItemAndCreateOrder(FunctionalTester $I): void { // Add product to cart via helper $I->loginAs('testuser', 'testpassword'); $count = $I->addProductToCart(42, 2); $I->assertEquals(1, $count, 'Cart should have 1 product'); // Create order via Sale API $I->executeCustomAction(function () { \Bitrix\Main\Loader::includeModule('sale'); $basket = \Bitrix\Sale\Basket::loadItemsForFUser(1, 's1'); $order = \Bitrix\Sale\Order::create('s1', 1); // site, user $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())); }); // Verify order exists in database $I->seeInDatabase('b_sale_order', [ 'USER_ID' => 1, 'CURRENCY' => 'RUB', 'STATUS_ID' => 'N', ]); } } 

Acceptance Test via WebDriver

For UI verification we use WebDriver with Chrome in headless mode. Example: filtering catalog by brand.

// 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); // Apply brand filter $I->checkOption('[data-filter="brand"][value="bosch"]'); $I->waitForElementNotVisible('.catalog-loading', 10); // Check URL $I->seeInCurrentUrl('brand=bosch'); // Verify all product cards are Bosch $I->seeNumberOfElementsGreaterThan('.product-card', 0); $brands = $I->grabMultiple('.product-brand'); foreach ($brands as $brand) { $I->assertEquals('Bosch', $brand); } } } 

Common mistakes when writing tests include: using die() or exit() in the helper, ignoring database cleanup after tests, hardcoding product and user IDs, and running acceptance tests on production instead of a database copy. We always use a separate test database to avoid data corruption.

Test Type Comparison

Test Type Speed What It Checks Tool Writing Time
Unit ~1 ms Class, method PHPUnit 5-10 min
Functional ~100 ms Business logic, DB Codeception + PHPBrowser 30-60 min
Acceptance ~2 s UI, JS, layout Codeception + WebDriver 1-3 h

Timeline and Process

Step Task Duration
Analysis Study project, version, dependencies 1 day
Development Install Codeception, write helper, configure suites 1-2 days
Writing tests Functional tests for business logic (orders, cart, calculations) 1-3 days
Acceptance tests WebDriver tests for catalog, checkout, authorization 2-4 days
Integration Embed into CI/CD, verify stability 1 day
Documentation Developer guide, helper description 1 day

Our engineers have 5+ years of experience with Bitrix and Codeception. We've implemented testing for 30+ projects – from small online stores to large trade portals with 50,000 products. We guarantee the tests run in your environment without modifications and provide two weeks of free support after handover.

Want to eliminate manual regression for good? Contact us for a project assessment and a 1-day implementation plan. Order Codeception setup and get a solid foundation for test automation.