Налаштування Codeception-тестів для 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування Codeception-тестів для 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування Codeception-тестів для 1С-Бітрікс

Codeception — PHP-фреймворк для тестування, який об'єднує unit, functional та acceptance (E2E) тести в одному інструменті. Для 1С-Бітрікс це особливо зручно: можна писати functional-тести, які тестують PHP-логіку без браузера, і acceptance-тести через WebDriver — все в одному стеці, з одними хелперами та однією конфігурацією.

Налаштування Codeception-тестів для 1С-Бітрікс

Встановлення і структура

# Встановлюємо в /local/ або в корінь проєкту
composer require --dev codeception/codeception
composer require --dev codeception/module-webdriver
composer require --dev codeception/module-phpbrowser
composer require --dev codeception/module-db

# Ініціалізація
vendor/bin/codecept bootstrap

Структура після ініціалізації:

tests/
    Acceptance/
        CatalogCest.php
        CheckoutCest.php
        AuthCest.php
    Functional/
        OrderCest.php
        CatalogFilterCest.php
    Unit/
        PriceCalculatorTest.php
        DeliveryZoneTest.php
    _support/
        AcceptanceTester.php
        FunctionalTester.php
        Helper/
            Bitrix.php    <- хелпер для Бітрікс
    _data/
        dump.sql
codeception.yml

codeception.yml для проєкту на 1С-Бітрікс

namespace: Tests
support_namespace: Support

paths:
    tests: tests
    output: tests/_output
    data: tests/_data
    support: tests/_support
    envs: tests/_envs

settings:
    shuffle: false
    lint: true

params:
    - .env.test

extensions:
    enabled:
        - Codeception\Extension\RunFailed

suites:
    acceptance:
        actor: AcceptanceTester
        modules:
            enabled:
                - WebDriver:
                    url: '%SITE_URL%'
                    browser: chrome
                    window_size: 1280x900
                    capabilities:
                        goog:chromeOptions:
                            args: ['--headless', '--no-sandbox']
                    host: selenium
                    port: 4444
                - Db:
                    dsn: 'mysql:host=%DB_HOST%;dbname=%DB_NAME%'
                    user: '%DB_USER%'
                    password: '%DB_PASS%'

    functional:
        actor: FunctionalTester
        modules:
            enabled:
                - Bitrix:
                    document_root: '%DOCUMENT_ROOT%'
                - Db:
                    dsn: 'mysql:host=%DB_HOST%;dbname=%DB_NAME%'
                    user: '%DB_USER%'
                    password: '%DB_PASS%'

    unit:
        actor: UnitTester

Хелпер для середовища Бітрікс

// tests/_support/Helper/Bitrix.php
namespace Tests\Support\Helper;

use Codeception\Module;

class Bitrix extends Module
{
    public function _beforeSuite(array $settings = []): void
    {
        $docRoot = $this->config['document_root'];

        define('NO_KEEP_STATISTIC', true);
        define('NOT_CHECK_PERMISSIONS', true);
        define('BX_WITH_ON_AFTER_EPILOG', false);
        define('BX_NO_ACCELERATOR_RESET', true);

        $_SERVER['DOCUMENT_ROOT'] = $docRoot;

        if (!defined('B_PROLOG_INCLUDED')) {
            require_once $docRoot . '/bitrix/modules/main/include/prolog_before.php';
        }
    }

    public function loginAs(string $login, string $password): bool
    {
        global $USER;
        $USER = new \CUser();
        return (bool)$USER->Login($login, $password);
    }

    public function addProductToCart(int $productId, int $quantity = 1): int
    {
        \Bitrix\Main\Loader::includeModule('sale');
        \Bitrix\Main\Loader::includeModule('catalog');

        $basket = \Bitrix\Sale\Basket::loadItemsForFUser(
            \CSaleBasket::GetBasketUserID(),
            \Bitrix\Main\Context::getCurrent()->getSite()
        );

        $item = $basket->createItem('catalog', $productId);
        $item->setField('QUANTITY', $quantity);
        $basket->save();

        return $basket->getOrderableItems()->count();
    }
}

Functional-тест: замовлення через 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

// 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);
        }
    }
}

Запуск тестів

# Усі тести
vendor/bin/codecept run

# Тільки acceptance
vendor/bin/codecept run acceptance

# Конкретний тест
vendor/bin/codecept run acceptance CatalogCest:filterByBrandShowsCorrectProducts

# З детальним виводом
vendor/bin/codecept run --steps --debug

Терміни

Завдання Терміни
Налаштування Codeception + хелпер Бітрікс + конфігурація suite 1 день
Functional-тести для бізнес-логіки (замовлення, кошик, розрахунки) 1–3 дні
Acceptance-тести через WebDriver (каталог, чекаут, авторизація) 2–4 дні