Список всех статей:

  1. Вступление

  2. Вспомогательные инструменты разработки

Самое ужасное, что может предоставить рабочий код – внезапную проблему. Будь то отложенная бага или неудачное обновление. Для того чтобы избежать такой ситуации, мы в команде договорились покрывать тестами как можно больше написанного кода, проверять все допустимые варианты, делать статический анализ и проверять обратную совместимость будущих версий библиотек.

Как вы уже могли догадаться, в этой статье разговор пойдет о вспомогательных инструментах при разработке. Все эти инструменты вы можете использовать в личных проектах. Надеюсь, что хоть один из инструментов вам покажется интересным и вы захотите его попробовать в деле.

PHPUnit

Для тестирования пакетов в основном мы используем всем известный PHPUnit.

Из названия инструмента понятно, что он предназначен для Unit тестирования и прекрасно с этим справляется.

Помимо Unit тестирования, PHPUnit также предоставляет возможность сделать и функциональные тесты. На текущий момент PHP фреймворки обычно представляют из себя независимые от окружений приложения. Благодаря этому можно запустить веб-приложение из консольного окружения и наоборот. Поэтому сэмулировать запуск полноценного веб приложения для написания функциональных тестов с использованием PHPUnit не составляет труда. Функциональные тесты на PHPUnit у нас тоже есть. Пакет yii-testing уже хранит нужную логику запуска приложения.

PHPUnit Watcher

Если вы писали тесты на NodeJS, то наверняка привыкли к тому, что тесты там перезапускаются сами, отслеживая ваши изменения в коде или непосредственно в тестах. Эта библиотека предоставляет такую же возможность. Особенно удобно при долгом рефакторинге, когда запускать тесты хочется после каждой контрольной точки.

Codeception

Обычно PHPUnit достаточно для маленьких и средних проектов. Для больших проектов тоже, но бывают исключения, когда нужно делать какие-то громоздкие интеграции и тогда уже хочется чего-то более удобного с точки зрения конфигурирования, разделения и наличия предоставляемого количества проверочных методов.

Codeception – инструмент, который позволяет удобно писать не только Unit и Functional тесты, а так же e2e и даже “бизнес-тесты”, они же “поведенческие тесты”. В общем, тесты по BDD.

Мы используем Codeception в app-* и demo-* шаблонах, так как чаще всего в проектах вы будете пользоваться именно им, а не PHPUnit. Кстати, Codeception отлично дружит и с Phiremock.

Infection

Этот инструмент очень хорош в поиске полноты написания ваших тестов. Более детально как он работает, вы можете почитать на официальном сайте или поискать готовые статьи в интернете. Вот одна с хабра.

Обычно этот инструмент не используют в коммерческих приложениях, так как для этого нужно писать больше тестов, а этого обычно не позволяет делать бизнес. Зато все хотят предсказуемое поведение инструментов, с помощью которых разрабатываются эти приложения.

Пакеты Yii3 покрываются тестами с учетом мутационного тестирования. Мы стараемся “убивать всех мутантов” (это на сленге) в наших библиотеках. Для мутационного тестирования мы пользуемся плагином Roave/infection-static-analysis-plugin, который позволяет валидировать сбежавших мутантов при помощи Psalm, о котором далее.

Psalm

Разработчики компилируемых языков ушли в интерпретируемые, чтобы иметь возможность по-быстрому запустить свой код и начать зарабатывать на нём деньги. Однако предупреждения о синтаксических ошибках догнали их и здесь. Лучше потратить некоторое время на написание хорошего кода без багов, чем упасть в вечер пятницы и потерять большое количество денег на этом простое.

Psalm – отличный анализатор кода, который поможет вам сверить используемые типы данных, проверить логические операции и многое другое. Также о Psalm вы можете почитать подробнее на официальном сайте или, опять же, найти статьи на просторах в интернете.

Кстати, раньше у нас был Phan. Мы ушли к Psalm из-за большей популярности и более быстрого развития.

StyleCI

Холивары по поводу код-стайла будут вас преследовать всегда, пока вы не решите их автоматизацией. Важно не просто установить одинаковые настройки в IDE, а форсировано исправлять все разногласия с помощью какого-то инструмента.

У нас это StyleCI. К сожалению, у него нет версии для исправления кода локально, но зато он отлично справляется с выполнением этой задачи в CI.

А чтобы не получать большие диффы от StyleCI, мы предоставляем файл .editorconfig, в котором фиксируем используемые правила. С помощью плагинов к PHPStorm или VSCode эти настройки применяются к каждому проекту автоматически, что избавляет от ручного изменениях настроек от проекта к проекту.

Кстати, для своих проектов вы можете использовать php-cs-fixerprettier или любые другие линтеры.

Rector

Держать большую кодовую базу в актуальном состоянии сложно. Но я, мечту свою лелея…

Rector довольно просто поможет актуализировать код под новую версию PHP. И не только на новые версии, но и наоборот – на старые.

Держать кодовую базу актуальной очень важно. Новые версии языка добавляют различного рода улучшения, позволяющие делать некоторые вещи проще и производительнее, а также могут отказываться от поддержки старых возможностей.

С помощью собственных “ректоров” можно создать собственные регламенты написания кода, тем самым дать разработчикам волю и разрешить писать в их привычном стиле, вместо того, чтобы давать учить очередной свод правил по использованию тех или иных функций и подходов :)

Rector – отличный инструмент для избавления от legacy уровня языка и не только.

Roave Backward Compatibility Check

Этот инструмент предназначен для сигнализирования о том, что новая кодовая база нарушает правила обратной совместимости по SemVer. Узнать по каким признакам эта библиотека проверяет ваш код, вы можете изучив исходный код проекта.

Мы используем эту библиотеку, чтобы не преподнести разработчикам неожиданностей при очередном composer update, когда на ревью кто-то проморгал такие правки.

Codecov

Codecov.io – сервис, который хранит тестовое покрытие. Также есть бот, который уведомляет в сообщении к PR о том, как изменилось покрытие. Скриншот сверху как раз от бота.

Для того, чтобы держать планку покрытия тестами ближе к 100%, нужно постоянно следить за её изменениями. Без Codecov тоже можно, например, при помощи Scrutinizer. Однако он не имеет бота, который пишет сообщение в PR; обычно отрабатывает очень долго и, помимо хранения покрытия, делает еще массу вещей с кодовой базой, которую уже делают другие инструменты.

What the diff

WhatTheDiff.ai – еще один сервис с ботом в Github Actions, который упрощает быстрый осмотр PR. Бот генерирует сообщение, основываясь на изменения в самом PR и дополнительно на сообщениях коммитов. Довольно полезно при отсутствии комментариев к PR.

Пока что мы только обкатываем этот инструмент. О явных плюсах говорить сложно. Однако инструмент хорош в распознании изменений.

ComposerRequireChecker

ComposerRequireChecker – инструмент, который подсвечивает пропущенные и транзитивные зависимости в composer.json. К сожалению или к счастью, PHP и PHPStorm игнорируют несуществующие use, пока дело не дойдет до выполнения кода, непосредственно касающегося подключаемого класса.

Если Psalm или другие статические анализаторы смогут указать на полное отсутствие подключаемого класса, то ComposerRequireChecker покажет и использование транзитивных зависимостей, и отсутствие зависимостей от PHP расширений. Например, ext-mbstring.

Github Actions

Все перечисленные выше инструменты хороши, если ими пользоваться. Но разработчики по своей натуре очень ленивые, поэтому доверять на слово им нельзя. Даже самому себе.

Так как мы живем в Open Source мире, то Continuous Integration можно довольно просто сделать самому или использовать бесплатные сервисы. Github Actions – отличная платформа, которая предоставляет возможности CI и делает это бесплатно, что для Open Source довольно важно.

Чтобы не дублировать код инициализации и запуска инструментов, мы создали отдельный репозиторий yiisoft/actions, где храним все наши используемые инструменты. Использование этих инструментов определяется в директории .github/workflows в каждом из пакетов.

Yii-dev-tool

Yii-dev-tool – это наш внутренний инструмент для удобной работы с пакетами Yii3.

Имея более сотни пакетов в поддержке, встает вопрос о том, как ими правильно и удобно манипулировать. Инструмент позволяет установить в одну директорию нужные для работы пакеты и производить над ними различные массовые операции.

Этот пакет создает некий виртуальный моно-репозиторий, похожий по своему смыслу на работу git submodules, однако с дополнительным функционалом, таким как:

  • Установка/обновление пакетов

  • Выполнение тестов

  • Выполнение любых команд из директории каждого пакета

  • Синхронизация файлов проекта

  • Синхронизация зависимостей в composer.json

  • Построение таблицы зависимостей

  • Релиз пакета на github

  • Создание PR

  • И многое другое

За счет линковки пакетов, можно удобно копаться сразу в нескольких зависимых пакетах. Более детальный разбор также будет представлен в одной из следующих статей.

Мы развиваем этот инструмент в целях упрощения разработки сотен пакетов Yii3. В планах делать этот пакет независимым от Yiisoft, но после релиза, возможно :)

Если у вас похожая с Yii3 архитектура библиотек, то можете пользоваться этим инструментом и помогать развивать его.

Наличие этого инструмента не ограничивает никого от привычной работы с библиотеками. Всё так же можно зайти в любую из библиотек, сделать форк и отправить изменения.


Исходя из опыта, ни один инструмент не может быть идеальным всегда. Если сейчас что-то работает, то шанс, что всё заработает после очередного обновления никогда не будет 100%. Используйте вспомогательные инструменты, но и не забывайте прокачивать свои скиллы. Ведь если прод упадет после изменений, то вина будет не на стороне неисправного инструмента.

Вступительные статьи закончились. А этого значит, что в следующей статье начнется самое интересное. Следующая статья будет посвящена обзору на app-* и demo-* шаблоны и используемые в них библиотеки и их возможности.

Полезные ссылки

Хроники Yii3. Постим там новости практически каждый день.

Канал для обсуждения Yii3. Задавайте вопросы, помогайте другим, принимайте участие в развитии фреймворка.

Инструкции, которые помогут вам стать контрибьютером.

Страничка, где вы можете выразить благодарность финансово и ускорить разработку фреймворка.

Комментарии (0)