phpunit.xml)RefreshDatabase + $seed = true в каждом тест-классе| Категория | Всего файлов | Покрыто | Покрытие |
|---|---|---|---|
| Тест-файлов | 29 | — | — |
| Тест-методов | ~302 | — | — |
| Модели | 34 | 5 | ~15% |
| Сервисы | 28 | 13 | ~46% |
| Jobs | 21 | 0 | 0% |
| Контроллеры | 30 | 4 | ~13% |
| Form Requests | 22 | 0 | 0% |
| Helpers | 5 | 3 | 60% |
| Observers | 1 | 1 | 100% |
CountHelper — числительные (единицы/2-4/5+)DateHelper — конвертация дат (Excel, ISO, человеческий формат)Price — форматирование цен с символом ₽Order — константы статусов, атрибуты, связи, soft deleteReclamation — константы статусов, связи, activeReservations, openShortagesInventoryMovement — константы типов, акцессоры, связи, скоупы, кастыShortage — статусы, акцессоры, связи, скоупы, методы addReserved/recalculateSparePartOrder — статусы, reserved_qty, free_qty, canReserve, скоупыSparePart — цены в копейках, складские остатки, резервы, minimum stockFileService — сохранение файлов (Unicode, спецсимволы, дубликаты)GenerateDocumentsService — генерация ZIP-архивов, монтаж/сдача/рекламация (частично через markTestSkipped)ImportOrdersService — импорт заказов из ExcelShortageService — FIFO, processPartOrderReceipt, calculateOrderQuantity, getCriticalShortagesSparePartInventoryService — getStockInfo, getInventorySummary, getBelowMinStockSparePartIssueService — issueReservation, issueForReclamation, directIssue, correctInventorySparePartReservationService — reserve, cancelForReclamation, adjustReservationExport/ExportAreasService — экспорт районов в XLSXExport/ExportDistrictsService — экспорт округов в XLSXImport/ImportAreasService — импорт районов (создание, обновление, восстановление)Import/ImportDistrictsService — импорт округовImport/ImportMafOrdersService — импорт MAF-заказовImport/ImportSparePartOrdersService — импорт заказов запчастейSparePartOrderObserver — автопокрытие shortages при создании/обновлении заказаAdminAreaController — CRUD + import/export (16 тестов)AdminDistrictController — CRUD + import/export (15 тестов)OrderController — CRUD, MAF-операции, фото, документы, генерация, экспорт (22 теста)ReclamationController — CRUD, файлы, запчасти, детали, генерация (22 теста)Файл: phpunit.xml
Раскомментировать строки:
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
Текущая конфигурация требует запущенную MySQL, что делает запуск тестов в CI и на чистой машине невозможным без дополнительной настройки. Нужно убедиться, что все миграции совместимы с SQLite (убрать специфичные для MySQL типы: json → text, enum → string, fulltext-индексы).
Все 21 джоб не имеют тестов. Минимально необходимо покрыть:
| Job | Что тестировать |
|---|---|
ExportOrdersJob |
диспетчеризация, создание файла, статус Import |
ExportMafJob |
аналогично |
ExportReclamationsJob |
аналогично |
ExportScheduleJob |
аналогично |
GenerateFilesPack |
создание ZIP, корректность содержимого |
GenerateInstallationPack |
аналогично |
GenerateHandoverPack |
аналогично |
ImportJob |
обработка файла, ошибки валидации |
NotifyManagerNewOrderJob |
отправка уведомления (мок FCM) |
NotifyManagerChangeStatusJob |
аналогично |
Рекомендация: использовать Queue::fake() + Bus::fake() для проверки диспетчеризации без реального выполнения.
Сейчас все тесты сервисов — интеграционные (реальная БД). Это медленно и хрупко. Нужно добавить unit-тесты с моками для изоляции зависимостей:
// Пример: мокировать репозиторий в SparePartReservationService
$sparePart = Mockery::mock(SparePart::class);
$sparePart->shouldReceive('lockForUpdate')->andReturnSelf();
Не покрытые контроллеры с высоким бизнес-приоритетом:
| Контроллер | Что тестировать |
|---|---|
MafOrderController |
CRUD, статусы, документы |
SparePartController |
CRUD, цены, остатки |
SparePartOrderController |
создание, статусы, отгрузки |
SparePartReservationController |
резервирование, отмена |
SparePartInventoryController |
инвентаризация |
ContractController |
CRUD, загрузка файлов |
ScheduleController |
создание расписания из заказа/рекламации |
ImportController |
загрузка файла, диспетчеризация джоба |
ReportController |
генерация отчётов, фильтрация |
ProductController / ProductSKUController |
CRUD каталога |
UserController |
создание, редактирование пользователей |
Минимальный набор тестов для каждого контроллера:
22 Request-класса не имеют изолированных тестов. Добавить тесты валидации:
// tests/Unit/Requests/StoreOrderRequestTest.php
public function test_required_fields(): void
{
$request = new StoreOrderRequest();
$validator = Validator::make([], $request->rules());
$this->assertTrue($validator->fails());
$this->assertArrayHasKey('client_name', $validator->errors()->toArray());
}
Приоритетные Request-классы:
Order/StoreOrderRequest — основная форма заказаStoreMafOrderRequest — форма MAFStoreReclamationRequest / StoreReclamationDetailsRequestStoreSparePartOrderRequest / ShipSparePartOrderRequestStoreContractRequest| Сервис | Что тестировать |
|---|---|
ExportOrdersService |
формирование XLSX, корректность данных |
ExportMafService |
аналогично |
ExportReclamationsService |
аналогично |
ExportScheduleService |
аналогично |
ExportSparePartsService |
аналогично |
ImportReclamationsService |
импорт, маппинг, ошибки |
ImportMafsService |
аналогично |
ImportCatalogService |
создание/обновление товаров |
Import/ImportSparePartsService |
аналогично |
Import/ImportYearDataService |
аналогично |
PdfConverterClient |
HTTP-запрос к PDF-сервису (мок HTTP-клиента) |
Export/ExportYearDataService |
аналогично |
Модели без тестов (нет отдельных тест-файлов):
MafOrder — статусы, связи, атрибутыProduct / ProductSKU — связи, SKU-логикаContract — связи, загрузка файловSchedule — связи с Order/Reclamation, статусыReservation — связи, статусы, количествоSparePartOrderShipment — списание резервовDictionary/Area / Dictionary/District — soft delete, связиOrderView, MafOrdersView и т.д.) — корректность агрегацииExcelHelper — форматирование ячеек, типы данныхroles.php — проверка наличия/наименования ролейПокрыть базовые сценарии аутентификации:
Если в проекте есть ролевая модель (файл roles.php, Role модель) — добавить тесты:
Добавить генерацию HTML-отчёта покрытия:
<!-- phpunit.xml -->
<coverage>
<report>
<html outputDirectory="coverage"/>
<clover outputFile="coverage.xml"/>
</report>
</coverage>
Требуется Xdebug или PCOV. Добавить в Makefile:
make test-coverage # php artisan test --coverage
GenerateDocumentsServiceTest использует markTestSkipped() если шаблоны отсутствуют в /templates/. Нужно:
tests/fixtures/templates/tests/fixtures/test_orders_import.xlsxImportOrdersServiceTest требует реальный xlsx-файл. Убедиться что файл находится в git и содержит актуальные данные.
Все Unit-тесты сервисов реально обращаются к БД — это интеграционные тесты. Нужно:
tests/Unit/Services/ → tests/Integration/Services/phpunit.xml (быстрый прогресс без кода)MafOrderController Feature-тестами (высокий бизнес-приоритет)SparePartController + SparePartOrderController Feature-тестамиExportOrdersService и других экспорт-сервисовQueue::fake()