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.ymlconfiguration with three suites: acceptance, functional, unit. -
Bitrix.phphelper 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)
- Analyze the project – examine Bitrix version, directory structure, used modules (sale, catalog, iblock).
- Install packages via Composer and configure
codeception.yml. - 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. - Write several tests for critical functionality – catalog, cart, checkout.
- 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.







