Тестирование интеграций 1С-Битрикс со службами доставки
Интеграция со службами доставки в Битрикс — это не только красивая форма выбора пункта выдачи. Это цепочка: расчёт стоимости → создание заказа в ЛК службы → печать накладной → трекинг. Любое звено может ломаться тихо, без явных ошибок на сайте. Покупатель оформляет заказ, менеджер уходит создавать отправление — и тут выясняется, что адрес не прошёл валидацию в CDEK или ПВЗ DHL уже закрыт. Тестирование интеграций доставки направлено именно на выявление таких сценариев до продакшна.
Архитектура интеграции доставки в Битрикс
Службы доставки подключаются через модуль sale как обработчики доставки (\Bitrix\Sale\Delivery\Services\Base). Для каждой службы есть отдельный класс с реализацией:
-
calculateConcrete()— расчёт стоимости -
createShipment()— создание отправления во внешней системе (если реализовано) -
getTrackingInfo()— получение статуса трекинга
Кастомные обработчики размещаются в /local/php_interface/include/sale_delivery/. Стандартные модули служб доставки (CDEK, DHL, DPD, Boxberry, PickPoint, СДЭК) устанавливаются из Маркетплейса.
Что тестировать
Расчёт стоимости доставки — первая и самая частая точка отказа. Проверяют:
- Корректность расчёта для разных габаритов товара (нужны товары с заполненными
WEIGHT,WIDTH,HEIGHT,DEPTHв каталоге) - Работу при отсутствии габаритов у части товаров в корзине
- Корректность зон доставки — тариф для Москвы не должен применяться к Владивостоку
- Кэширование расчётов: повторный запрос той же корзины должен возвращать результат из кэша, не дёргая внешний API
// Проверяем кэш расчёта доставки
$cacheManager = \Bitrix\Main\Data\Cache::createInstance();
$cacheKey = 'delivery_calc_' . md5(serialize($basketItems) . $cityCode);
if ($cacheManager->initCache(3600, $cacheKey, '/sale/delivery/calc')) {
$cachedResult = $cacheManager->getVars();
} else {
$result = $deliveryService->calculate($shipmentItemCollection, $extraServices);
$cacheManager->startDataCache();
$cacheManager->endDataCache($result);
}
Выбор ПВЗ — виджеты CDEK, Boxberry, PickPoint грузят карту через JS. Тестируют:
- Загрузку виджета на всех целевых браузерах
- Корректную передачу выбранного ПВЗ в форму оформления
- Сохранение выбранного ПВЗ при обновлении страницы
- Поведение при недоступности JS (graceful degradation)
Создание отправления — проверка того, что заказ корректно регистрируется в ЛК службы доставки при смене статуса в Битрикс:
// Обработчик события смены статуса заказа
AddEventHandler('sale', 'OnOrderStatusChange', function(\Bitrix\Main\Event $event) {
$order = $event->getParameter('ORDER');
$newStatus = $event->getParameter('NEW_STATUS');
if ($newStatus === 'PROCESSING') {
foreach ($order->getShipmentCollection() as $shipment) {
if (!$shipment->isSystem()) {
$deliveryService = $shipment->getDelivery();
// Тест: проверяем что createShipment возвращает трек-номер
$result = $deliveryService->createShipment($shipment);
// result должен содержать tracking_number
}
}
}
});
Кейс: CDEK + Битрикс
Типичная проблема при тестировании официального модуля CDEK: расчёт стоимости возвращает 0 или пустой массив тарифов. Причины в порядке частоты:
-
Не заполнены габариты товаров — CDEK API v2 при отсутствии
weight/lengthвозвращает 400, модуль молча возвращает 0 -
Неверный код города — CDEK использует собственные коды городов (не КЛАДР, не ФИАС); проверяют через
POST /v2/location/cities -
Тариф не активирован в договоре — попытка рассчитать тариф
136(Посылка склад-склад) при неподключённой услуге даёт ошибку авторизации, не 403 -
Sandbox vs Production — тестовые credentials CDEK:
EMscd6r9JnFiQ3bLoyjJY6eM,PjLZkKBHEiLK3YsjtNrt7ZpUWSrTJtp6
Для проверки raw-запросов к API CDEK v2 в тестовом окружении:
# Получить токен
curl -X POST https://api.edu.cdek.ru/v2/oauth/token \
-d "grant_type=client_credentials&client_id=EMscd6r9JnFiQ3bLoyjJY6eM&client_secret=PjLZkKBHEiLK3YsjtNrt7ZpUWSrTJtp6"
# Рассчитать доставку
curl -X POST https://api.edu.cdek.ru/v2/calculator/tariff \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"tariff_code":136,"from_location":{"code":44},"to_location":{"code":270},"packages":[{"weight":1000,"length":20,"width":15,"height":10}]}'
Если raw-запрос проходит, а модуль Битрикс не работает — проблема в адаптере модуля.
Трекинг тестируют на реальных трек-номерах (у CDEK есть тестовые трек-номера в документации sandbox) с проверкой обновления поля UF_TRACKING в b_sale_shipment.
Автоматизация
Для регрессионного тестирования расчётов доставки пишут unit-тесты на PHPUnit с мокированием HTTP-клиента:
class CdekDeliveryTest extends \PHPUnit\Framework\TestCase
{
public function testCalculateReturnsNonZeroForValidPackage(): void
{
$httpMock = $this->createMock(HttpClient::class);
$httpMock->method('post')->willReturn($this->getFixture('cdek_tariff_response.json'));
$service = new CdekDeliveryService(['http_client' => $httpMock]);
$result = $service->calculate($this->buildShipment(weight: 1000, city: 'SPB'));
$this->assertGreaterThan(0, $result->getPrice());
$this->assertNotEmpty($result->getPeriodMin());
}
}
Сроки
| Конфигурация | Срок |
|---|---|
| Тестирование 1 службы (расчёт + ПВЗ) | 1–2 дня |
| Тестирование 2–3 служб + трекинг | 3–5 дней |
| Полный цикл + автотесты | 6–10 дней |







