Написание unit-тестов для модулей 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Написание unit-тестов для модулей 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Написание unit-тестов для модулей 1С-Битрикс

Unit-тесты для Битрикс-модулей — задача с двойной сложностью. Первая — модульный код часто написан с прямыми вызовами статических методов ядра (CIBlockElement::GetList(), \Bitrix\Main\Application::getInstance()), которые нельзя подменить моком. Вторая — тесты требуют загруженного ядра Битрикс, что делает их медленнее обычных unit-тестов. Решение: чёткое разделение тестируемой логики от инфраструктурного кода Битрикс.

Принцип тестируемой архитектуры

Нетестируемый код:

// Бизнес-логика смешана с инфраструктурой — нельзя протестировать изолированно
public function calculateDiscount(int $userId): float
{
    $user = \CUser::GetByID($userId)->Fetch(); // статический вызов Битрикс
    $orders = \CSaleOrder::GetList([], ['USER_ID' => $userId])->Fetch();
    return $orders['count'] > 10 ? 0.15 : 0.05;
}

Тестируемый код:

// Логика отделена, зависимости инжектируются
class DiscountCalculator
{
    public function __construct(
        private UserRepositoryInterface $users,
        private OrderRepositoryInterface $orders,
    ) {}

    public function calculate(int $userId): float
    {
        $user = $this->users->findById($userId);
        $orderCount = $this->orders->countByUserId($userId);
        return $orderCount > 10 ? 0.15 : 0.05;
    }
}

Репозитории реализуются через Битрикс API в продакшн-коде и через моки в тестах.

Инфраструктура тестов

Bootstrap для PHPUnit с загрузкой ядра Битрикс (когда без него не обойтись):

// tests/bootstrap.php
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'] = realpath(__DIR__ . '/../../../..');
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
\Bitrix\Main\Loader::includeModule('your.module');

Для чистых unit-тестов без ядра Битрикс — отдельный bootstrap без prolog_before.php, только Composer autoload.

Примеры unit-тестов

Тест бизнес-логики (без ядра):

class DiscountCalculatorTest extends TestCase
{
    private DiscountCalculator $calculator;

    protected function setUp(): void
    {
        $this->calculator = new DiscountCalculator(
            users: $this->createStub(UserRepositoryInterface::class),
            orders: $this->createConfiguredMock(
                OrderRepositoryInterface::class,
                ['countByUserId' => 5]
            ),
        );
    }

    public function testLessThan10OrdersGivesBasicDiscount(): void
    {
        $this->assertSame(0.05, $this->calculator->calculate(1));
    }

    public function testMoreThan10OrdersGivesPremiumDiscount(): void
    {
        $repo = $this->createConfiguredMock(
            OrderRepositoryInterface::class,
            ['countByUserId' => 15]
        );
        $calc = new DiscountCalculator($this->createStub(UserRepositoryInterface::class), $repo);
        $this->assertSame(0.15, $calc->calculate(1));
    }
}

Тест с использованием ORM Битрикс (интеграционный):

class BookingTableTest extends \Bitrix\Main\Test\TableTest
{
    protected static function getTable(): string
    {
        return BookingTable::class;
    }

    public function testCreateBooking(): void
    {
        $result = BookingTable::add([
            'ROOM_ID' => 1,
            'DATE_FROM' => new \Bitrix\Main\Type\Date('2026-04-01'),
            'DATE_TO' => new \Bitrix\Main\Type\Date('2026-04-05'),
            'STATUS' => 'pending',
        ]);
        $this->assertTrue($result->isSuccess(), implode(', ', $result->getErrorMessages()));
        $this->assertGreaterThan(0, $result->getId());
    }
}

Покрытие и приоритизация

Не нужно покрывать тестами 100% кода — это нерентабельно для Битрикс-проектов. Приоритеты:

Приоритет Что тестируем
Высокий Расчёты цен, скидок, стоимости доставки
Высокий Бизнес-логика состояний (статусная машина)
Высокий Парсеры и маппинг данных (импорт из 1С, Excel)
Средний Валидаторы входных данных
Средний Алгоритмы формирования отчётов
Низкий Шаблоны компонентов, UI-логика

Метрики покрытия

Подключение Xdebug для измерения покрытия:

<!-- phpunit.xml -->
<coverage processUncoveredFiles="true">
    <include>
        <directory suffix=".php">local/modules/your.module/lib</directory>
    </include>
    <report>
        <html outputDirectory="coverage-report"/>
    </report>
</coverage>

Целевое покрытие для ключевой бизнес-логики — 80%+. Для инфраструктурного кода (репозитории, адаптеры) — достаточно интеграционных тестов.

Что входит в написание unit-тестов

  • Аудит кода модуля на тестируемость, рефакторинг точек внедрения зависимостей
  • Настройка PHPUnit с bootstrap для Битрикс-окружения
  • Написание тестов для бизнес-логики: расчёты, статусные машины, парсеры
  • Настройка отчёта покрытия через Xdebug
  • Интеграция запуска тестов в CI (GitHub Actions / GitLab CI)
  • Документация по запуску тестов и добавлению новых