PhpMocker - библиотека для работы с тестовыми двойниками, позволяет создавать "моки" для private, static и final методов и работать с финальными классами и перечислениями
Привет первый пост и первый читатель, эта статья - вводная телега про PhpMocker, библиотеку для работы с моками (тестовыми двойниками). История, зачем и по какой причине было задумано изобретение велосипеда и просто кое-какие мысли в слух.
Это мой первый пост на Дзене, и было бы ему самое место на Хабре, так как его потребитель - разработчике ПО, но на Хабре анальное огораживание и пока я его не прошел)) Ну и потом, Дзен не накладывает ограничения на стиль повествования, поэтому можно писать весьма экспрессивно - а это я люблю))
Итак, поехали - PhpMocker - это PHP библиотека для создания моков (тестовых двойников) позволяющая работать с private, static и final методами, а также с финальными классами и перечислениями. Библиотека платформонезависема, может работать с PhpUnit или иным другим фреймворком юнит-тестирования, а также позволяющая жить в мире без композера.
Ссылка на гитхаб: https://github.com/dracul-aid/PhpMocker
Зачем - затем, что PhpUnit хорош всем, кроме того, что он не позволяет создавать тестовые двойники для private, static и final и работать с финальными классами. Так как моки он создает с помощью наследования. Создание классов с помощью наследования - это очень экономно в плане ресурсов и простоты использования. Но вот накладывает неприятные ограничения на ключевые слова private, static и final. А эти самые ограничения накладываю ограничения на архитектурные решения в вашем коде.
До 2022 года я работал практически все время с "самописными движками", писались они как хотелись и все эти private, static и final были коду друзьями и товарищами. Покрывался ли код - да, был и собственный функционал для юнит-тестирования. Но так работал я в вечных стартапах, тестами покрывалось довольно мало чего. Заказчик всегда был не готов к лишним расходам + вечный аврал, так что хотелось не писать тесты за свой счет, а смотреть сериальчик (ставь палец вверх, если представил, что смотришь ютуб :D)
В 2022 я попал на большую галеру, она меня познакомила в очередной раз с проблемой быстрого роста компании, эффективностью (зачеркнуть) менеджмента и очень плотной работой с юнит-тестами.
Код в моей компании был старый и не добрый, писался он без мысли о юнит тестах. Так что любая попытка сделать что-то новое заканчивалась рефакторингом чего-то старого. Очень часто рефакторинг был вызван единственной причиной - завести юнит тесты, так как private и static старый код использовал по полной...
В загашнике у меня был старый говнокод, который давал возможность тестировать private и static методы, но давать его применение в проекте никто давать не стал. Причина - все были заняты очень важными делами, симуляцией работы)) Поэтому, распрощавшись с работодателем, севшем на трактор и уехавшим в закат из России - я решил, что пришло время привести свои старые наработки в порядок и запилить библиотеку для тестовых двойников, что бы в будущем можно было использовать все синтаксические возможности PHP и не жить в тесных рамках PhpUnit
На момент написания статьи тут PhpMocker подбирается к своей первой реализ версии. Он уже почти взрослый, поэтому может:
- Работать с final классами и перечислениями
- private, static и final методами
- Создавать "мок-методы" в трейтах (а не в классах-потомках, как обычно)
- Возможность назначать выброс исключения при вызове методов
- Возможность выполнения пользовательской функции при вызове методов
В планах - дать возможность мок-методам возвращать значения по ссылкам
Что меня настораживает - My English is very bad, I am not "Ptica Godorun" поэтому имена методов и классов такие себе, как бы не пришлось переделывать(((
Ну и на последок:
Документация: hhttps://github.com/dracul-aid/PhpMocker/blob/master/documentation-ru/README.md
Пример: https://github.com/dracul-aid/PhpMocker/tree/master/examples-ru/phpunit-and-composer
И набор ключевых слов, типа я продвигаю:
- Mock static, private и final методов в PhpUnit
- Тестовые двойники для finale class в PhpUnit
- Перечисления и PhpUnit (enum)
Ну и теги #PhpMocker #PhpUnit #юнит-тесты #разработка