115 lines
14 KiB
Markdown
115 lines
14 KiB
Markdown
# Ноябрь 2018 — тройное ревью и выпускной gate «Интеграционные проверки PHP»
|
||
|
||
Статус: **принят в публикационный слой 31 июля 2026 года**. Пакет П10
|
||
сохраняет стабильные slug, дату и автора базового архива:
|
||
|
||
- <code>editorial-2018-11-practice-php-integration-tests</code>;
|
||
- <code>editorial-2018-11-mechanism-php-integration-tests</code>;
|
||
- <code>editorial-2018-11-field-php-integration-tests</code>.
|
||
|
||
Артефакты П10:
|
||
|
||
- <code>web/scripts/upgrade-2018-11.mjs</code>;
|
||
- <code>web/public/assets/editorial/2018/php-integration-contract-2018.svg</code>;
|
||
- <code>web/public/assets/editorial/2018/php-test-boundary-2018.svg</code>;
|
||
- <code>web/public/assets/editorial/2018/php-false-green-trace-2018.svg</code>;
|
||
- этот файл.
|
||
|
||
Сам скрипт П10 не меняет <code>web/data/articles.json</code>: публикационный
|
||
слой подключает его отдельным registry только по slug. В общем checkout во
|
||
время работы могли появляться параллельные артефакты других пакетов; они не
|
||
входят в этот список и П10 их не редактирует. Дата ревью: 31 июля 2026 года.
|
||
|
||
## 1. Факты и техника — пройдено
|
||
|
||
### Карта утверждений и первичных источников
|
||
|
||
| Утверждение | Первичный источник | Оговорка в материале |
|
||
| --- | --- | --- |
|
||
| PHPUnit 7 запускает классы, наследующие <code>PHPUnit\Framework\TestCase</code>, и тесты из файлов <code>*Test.php</code> | [Getting Started with PHPUnit 7](https://phpunit.de/getting-started/phpunit-7.html) | Пример помечен как PHP 7.2 / PHPUnit 7.5; версия закрепляется проектом, а не статьёй |
|
||
| <code>setUp()</code> и <code>tearDown()</code> создают и очищают fixture вокруг теста | [PHPUnit 7.5 Fixtures](https://docs.phpunit.de/en/7.5/fixtures.html) | Статья не выдаёт fixture за изоляцию всей системы: отдельно названы вторые соединения и HTTP |
|
||
| Mock/test double позволяет контролировать соседа класса, но не является доказательством SQL, PDO или сети | [PHPUnit 7.5 Test Doubles](https://docs.phpunit.de/en/7.5/test-doubles.html) | Unit- и integration-тесты отвечают на разные вопросы и оба остаются нужны |
|
||
| <code>PDO::beginTransaction()</code> выключает autocommit; <code>rollBack()</code> откатывает изменения и возвращает его, но MySQL может сделать неявный commit для DDL | [PDO::beginTransaction](https://www.php.net/manual/en/pdo.begintransaction.php), [PDO::rollBack](https://www.php.net/manual/en/pdo.rollback.php) | Миграции и DDL не запускаются внутри транзакции теста; показан только путь данных |
|
||
| <code>getenv()</code> читает конфигурацию, а <code>curl_exec()</code> и <code>curl_getinfo()</code> позволяют различить transport error и HTTP-статус | [getenv](https://www.php.net/manual/en/function.getenv.php), [curl_exec](https://www.php.net/manual/en/function.curl-exec.php), [curl_getinfo](https://www.php.net/manual/en/function.curl-getinfo.php) | Пример допускает только локальный учебный callback; внешние URL, production-секреты и результаты вызова не выдумываются |
|
||
|
||
### Технический проход
|
||
|
||
- Во всех трёх ревизиях ровно один главный вопрос: контракт PDO-репозитория; граница unit/integration; фальшивая зелень в связке БД/HTTP/конфигурации.
|
||
- Код вручную сверён с синтаксисом PHP 7.2: типы параметров и возврата, <code>array()</code>, методы PHPUnit 7; в тексте нет claim о запущенном контейнере, рабочем пароле или зелёном результате PHP-теста.
|
||
- В коде HTTP учебный endpoint ограничен локальным адресом. Это не выдано за универсальную политику безопасности: для тестовой сети отдельно названы allowlist и отдельные credentials.
|
||
- SQL, окружение, PDO и cURL не смешиваются в один диагноз. Каждой точке соответствует наблюдаемый факт и следующее действие.
|
||
- DDL, второй PDO-коннект и HTTP не объявлены автоматически откатываемыми. Граница уборки показана явно.
|
||
|
||
## 2. Редактура и голос М1 — пройдено
|
||
|
||
| Ревизия | Симптом и цена в первых двух абзацах | Один вопрос | Артефакт | Голос и ограничение |
|
||
| --- | --- | --- | --- | --- |
|
||
| Практика | Unit зелёный, но запись/чтение ломается; цена — неделя правок не той логики | Какой договор должен проверить PDO integration test | Тест <code>INSERT → SELECT → rollback</code>, таблица контракта, схема | Короткие шаги 2018 года; тестовая БД и контейнер не выдаются за запущенные |
|
||
| Механизм | Mock зелёный, но SQL/конфигурация не работают; цена — ложная уверенность при рефакторинге | Где граница unit и integration | Соседние unit- и integration-примеры, таблица вопросов | Нет поздних SLO/observability-терминов; история ограничена PHP 7.2/PHPUnit 7.5 |
|
||
| Поле | Регистрация 500 после записи или не уведомляет; цена — потеря следа и подмена реального клиента | Как увидеть разрыв БД/HTTP/config | Локальный callback, request ID, cURL-адаптер, трассировочная таблица | Учебная трасса не названа инцидентом; production endpoint запрещён |
|
||
|
||
- М1 сохранён: текст идёт по формуле «симптом → причина → проверка → действие → результат → ограничение», использует короткие предметные абзацы и допускает «разберём», «сначала проверяем» только рядом с конкретным действием.
|
||
- Не используются вводные о «современном мире», обещания универсального решения, SLO, Kubernetes, feature flags, продуктовые метрики или нераскрытый зрелый жаргон.
|
||
- В каждой статье есть не менее пяти смысловых разделов, таблица с <code>thead</code> и <code>scope</code>, код, упорядоченный маршрут, один собственный SVG с содержательным <code>alt</code>/<code>figcaption</code>, ограничения и точный заголовок <code><h2>Проверяемые источники</h2></code>.
|
||
|
||
## 3. Визуал и выпуск — пройдено после локальных проверок
|
||
|
||
- <code>php-integration-contract-2018.svg</code> объясняет узкий контракт <code>PHPUnit → PDO → test DB → rollback</code>; данные и DDL не показаны как часть одного обратимого действия.
|
||
- <code>php-test-boundary-2018.svg</code> контрастно разделяет подменённый репозиторий в unit-тесте и настоящий PDO/cURL-адаптер в integration-тесте. Пунктир отмечает именно границу подмены.
|
||
- <code>php-false-green-trace-2018.svg</code> показывает порядок <code>config → PDO → cURL → 202</code> и нижний integration-маршрут с request ID; смысл не зависит только от цвета.
|
||
- Все SVG имеют собственные <code>title</code>/<code>desc</code>, вертикальный viewBox <code>720 × 900</code>, контрастный текст и без скриптов, внешних ресурсов или raster-вложений.
|
||
|
||
### Фактически выполненные команды и доказательства
|
||
|
||
Выполнены следующие проверки:
|
||
|
||
node --check web/scripts/upgrade-2018-11.mjs
|
||
node web/scripts/upgrade-2018-11.mjs --print-revisions | <JSON parser>
|
||
node --input-type=module -e "import('./web/scripts/upgrade-2018-11.mjs').then(...)"
|
||
xmllint --noout web/public/assets/editorial/2018/php-*-2018.svg
|
||
<standalone structural audit of revisions>
|
||
<whitespace audit of the five P10 files>
|
||
|
||
Результаты:
|
||
|
||
- <code>node --check</code> завершился с кодом 0.
|
||
- Прямой <code>--print-revisions</code> выдал валидный JSON ровно с тремя slug: <code>practice</code>, <code>mechanism</code> и <code>field</code> П10. Import модуля не печатал побочных данных и вернул <code>revisions.length === 3</code>.
|
||
- <code>xmllint</code> принял все три SVG. Проверка пяти файлов не нашла строк с хвостовыми пробелами.
|
||
- Структурный аудит прошёл: практика — 8 753 знака основного тела и 7 541 знак без кода/источников; механизм — 9 044 и 7 578; поле — 10 956 и 7 900. У каждой ревизии 9 <code>h2</code>, одна схема, таблица, код, упорядоченный маршрут, два или более источника и явный симптом в первых 800 знаках.
|
||
- SVG открыты через локальную статическую выдачу на viewport <code>375 × 812</code>. Для каждого <code>clientWidth === scrollWidth === 375</code>; после переделки вертикальная компоновка сохранила читаемые подписи. DOM каждой схемы содержит SVG, но не содержит <code>script</code> или inline event handler.
|
||
- В окружении нет PHP CLI: <code>php --version</code> вернул <code>command not found</code>. Поэтому PHP-фрагменты прошли фактологический и ручной синтаксический проход, но не выдаются за запущенные тесты. Для реального прогона нужны отдельные test-only DSN и локальный callback.
|
||
|
||
После интеграции в registry строгий аудит опубликованного слоя прошёл для
|
||
всех трёх slug. Он подтвердил сохранность date/author базового архива,
|
||
диапазон 8 753 / 9 044 / 10 956 знаков тела, обязательные figure, таблицы,
|
||
код, маршруты и источники. `npm run build` завершился с кодом 0 и
|
||
сгенерировал 374 статические страницы.
|
||
|
||
## 4. Дополнительный выпускной проход — пройдено
|
||
|
||
Независимый draft-gate выявил, что автономные ревизии не должны переопределять
|
||
<code>date</code> и <code>author</code>: эти поля принадлежат базовому архиву и
|
||
защищают хронологию и авторство публикации. Из всех трёх exported objects эти
|
||
ключи удалены. Сохранены только поля ревизии: <code>slug</code>,
|
||
<code>title</code>, <code>categories</code>, <code>cover</code>,
|
||
<code>excerpt</code>, <code>contentHtml</code> и <code>readingMinutes</code>.
|
||
|
||
Повторные результаты:
|
||
|
||
- <code>npm run audit:draft -- scripts/upgrade-2018-11.mjs</code> завершился с
|
||
кодом 0: 8 753 / 9 044 / 10 956 знаков тела и три <code>PASS</code>.
|
||
- <code>node --check scripts/upgrade-2018-11.mjs</code> завершился с кодом 0.
|
||
- <code>xmllint --noout</code> принял все три SVG.
|
||
|
||
<code>npm</code> вывел только не блокирующие предупреждения о пользовательских
|
||
настройках <code>store-dir</code>, <code>cache-dir</code> и
|
||
<code>public-hoist-pattern</code>; сам draft-gate прошёл.
|
||
|
||
## 5. Выпусковой вердикт
|
||
|
||
Пакет принят к публикации. У связанного файла ревизий нет права менять
|
||
<code>date</code> или <code>author</code>; registry накладывает только
|
||
редакционные поля по стабильному slug. PHP-примеры не выдаются за реально
|
||
запущенные тесты: ограничение окружения и требование отдельного test-only DSN
|
||
остаются явно зафиксированными выше.
|