Найти в Дзене

Первый @%!5 или зачем я решил пилить PhpMocker

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 #юнит-тесты #разработка