Ответы пользователя по тегу Модульное тестирование
  • Как тестировать компоненты в Yii2?

    @matperez
    Ну раз никто не отвечает..
    Посмотрите как это сделано в https://github.com/yiisoft/yii2-codeception/blob/m...
    Конкретно метод mockApplication. Он позволяет перед каждым тестом создать новый инстанс приложения с заданным конфигом (в том, числе с компонентами). Странно что вы его не использовали, потому что это входит в стандартный сетап для тестов в yii2-basic и yii2-advanced шаблонах.
    Ответ написан
    2 комментария
  • Продвинутая литература по тестированию?

    @matperez
    Как не смешно звучит, сам я эти книжки не читал, но, когда собирал подобную же вашей коллекцию, заметил, что их во многих местах рекомендовали безотносительно языка:
    The-Art-Unit-Testing-examples
    xUnit-Test-Patterns-Refactoring-Code
    ActiveRecord нормально тестируется с помощью частичных моков. Даже запросы нормально тестируются, если их выносить в отдельный класс, а ActiveRecord::find() использовать только как фасад для получения инстанса нужно класса с запросами.
    П.С. Поделитесь потом что нашли и что реально оказалось полезным.
    П.П.С. А вот еще книжка хорошая The Clean Architecture in PHP. Она вроде бы не сложная, но очень хорошо описывает как можно IoC использовать, а это прямой путь к хорошим тестам.
    Ответ написан
    1 комментарий
  • Механизм для модульного тестирования без базы данных?

    @matperez
    Чем вам не нравится вариант с частичными моками? Вам ведь нужно не CRUD как таковой протестировать, а корректную реакцию окружающего кода на то как ведет себя модель ActiveRecord. Мокайте методы CRUD, остальное пусть работает как есть.
    Ответ написан
  • PhpUnit позволяет замерять потребляемую память и CUP?

    @matperez
    Вам нужен профайлер. Например xhprof или xdebug.
    Ответ написан
    Комментировать
  • Как правильно писать unit тесты?

    @matperez
    По хорошему, в юнит тестах нужно использовать заглушки вместо других частей системы, которые вы не хотите сейчас тестировать. Эти заглушки нужно подсовывать в тестируемую модель либо через контейнер DI на этапе конфигурации тестового окружения, либо через явный метод в модели.

    Пример:
    В LoginForm можно выделить явную зависимость от чего-то вроде UserFinder, который может найти пользователя по email или login. Вместо него можно подсунуть некий объект возвращающий вполне конкретную модель пользователя.
    Тестировать модель пользователя в этом тесте нам тоже не хочется, поэтому UserFinder должен вернуть не реальную модель User, а опять же некую заглушку, возвращающую наперед заданные данные.

    Проще всего для создания заглушек использовать моки из phpunit. Через эту штуку так же можно мокать отдельный метод всего класса. К примеру можно сделать, что бы метод findUser в модели LoginForm сразу отдавал "правильного" пользователя и тем самым убрать из рассмотрения UserFinder.

    В общем, какой код - такие и тесты. Если код позволяет легко подставить зависимости, можно его тестировать в юнит стиле, иначе получаются недоинтерационные тесты. Соответственно, если будете писать тесты до самого кода, само собой будет получаться более тестируемый код.
    Ответ написан
    6 комментариев