Тестирование с PHPUnit и Codeception
Самая объёмная тема среди предложенных завершена. Выкладываю исправленную и дополненную запись вебинара-скринкаста о тестировании c PHPUnit и Codeception. Добавлены и доработаны примеры кода, пункты про аннотации, фикстуры, анализ покрытия, Faker, про установку всего через composer и другие нюансы:
Открыть на YouTube
Коды примеров
Код проекта с тестами
Статья про запуск в проекте
Статья про применение моков и TDD
Ещё в тему доклад по обновлённым тестам в Yii2:
Структура вебинара-скринкаста (кликабельно):
Кто ещё не подписался на остальные вебинары, тот сам себе Буратино:
И задавайте вопросы в комментариях. Заранее спасибо и до встречи в эфире!
Огромное спасибо за проделанный труд! )
Огромная работа!!! Смотрю пока оригинал, очень ценная информация. Спасибо большое! Задонатил.
Скажите в чем делали mindmap о тестировании. Спасибо
В XMind.
Спасибо огромное, все руки не доходили до тестирования :)
Спасибо за видео. Давно хотел изучить вопрос тестирования.
Написал в консоли:
composer global require "phpunit/phpunit:~4.8"
Но в итоге почему-то устанавливается: PHPUnit 3.7.21 by Sebastian Bergmann.
В чем может быть проблема?
Возможно, что ставили что-то в global раньше.
Ставил только composer global require "fxp/composer-asset-plugin:~1.0.3"
Это phpunit вместе с xampp (или другим сервером локальным) установлен из pear
Очень полезная информация, собранная мастером и занесена в самое ядро мозга.
Вдохновлен и впечатлен.
Спасибо!
Добрый день.
Такая проблема возникает:
Установил глобально Specify и Verify, сейчас эти компоненты лежат в папке vendor глубоко на диске "С", сайт же у меня развернут на другом диске, при попытке запустить тест "codecept run unit SomeTest" в консоль вываливается ошибка: "Call to undefined function expect()". Я добавил в Include Path в шторме путь к vendor на диске C, IDE начала подсвечивать пути к подключаемым файлам, шторм распознает путь "\Codeception\Specify" но вылетает ошибка при выполнении.
Потому вопрос: я должен эти компоненты устанавливать в папку vendor в которой находятся компоненты сайта? То есть, чтобы использовать Specify я должен еще установить 10МБ зависимостей?
Спасибо!
Ну если не получится разобраться, то можно установить всё себе в require-dev. А на продакшене устанавливайте composer install --no-dev, чтобы их туда не подтягивать.
Спасибо за подсказку Установил компоненты в секцию require-dev. Теперь все работает.
Спасибо Дмитрий. Вы действительно профи.
Хотелось бы спросить не по теме. Будет ли обзор или статья про кэширование в Yii2?
Отличный вебинар, вы только разбивайте следующий раз на логические части, а то 6 часов через чур
Огромное спасибо за те знания, которыми Вы делитесь, Дмитрий. Это бесценно.
У меня вопрос: я пробовал делать тест модели с поведением Timestamp и модель не заполнялась. Т.е. поведения не работают в тестах?
И еще интересно - как добиться в консоли такого же вывода codeception как у Вас? У меня наполовину из такого: ←[1mUnit Tests (1) ←[22m---. Пробовал другие моноширинные шрифты - безуспешно. Кодировка проекта UTF-8.
Поведение работает и в тестах по $model->save().
А лишние символы - это спецсимволы указания цвета. Для отключения вписывайте run --no-colors.
Но хотелось бы видеть в цвете! У меня Win7, PphStorm9. Как это сделать? В консоли были сообщения про установку значений always, never, auto ( Argument #3 (No Value) of PHPUnit_TextUI_ResultPrinter::__construct() must be a value from "never", "auto" or "always"). Если в codeception.yml в setting/colors выставить одно из этих значений, то появляются эти спецсимволы, а если выставить true или false то выходит ошибка. Можно как-то сделать это в цвете?
Забыл добавить, что с --no-colors выходит ошибка: Argument #3 (No Value) of PHPUnit_TextUI_ResultPrinter::__construct() must be a value from "never", "auto" or "always"
Это для Codeception:
А так это просто в PHPStorm отбычная консоль цветная, а тестовая - чёрно-белая. Я на Windows раньше ставил эмулятор линуксового терминала Cygwin, и он как раз цветным был.
Дмитрий, спасибо большое за видео!
По поводу цветной консоли в шторме можно подробнее? У меня никак не хочет отображать цвета. В настройках есть цвета (в примере), а в самой консоли весь вывод одного цвета... не очень читабельно. Win 8 + PhpStorm 10.
Поставил ConEmu, там все ок. Пробовал заменить консоль шторма на ConEmu, но оно открывается отдельно, не очень удобно. Хотелось бы именно встроенную в шторм консоль сделать нормальной на винде.
И что Вы имели в виду под "обычная консоль" и "тестовая консоль"?
Обычная - которая во вкладке "Terminal" и в которой мы команды пишем, тестовая - в которой результаты тестов выводятся при запуске кнопкой "Run".
У меня и в той и в другой весь вывод одним цветом :(
Windows уже три года не пользуюсь. Так что запускайте в своей цветной ConEmu или терпите так :)
да спасибо большое, а то думал вы общественную деятельность забросили. буду знакомится на выходных.
а следующий вебинар не хотите посвятить теме, правильного написания кода для высоких нагрузок, что то типа лучшие практики корифеев на yii2 ?
За эту тему не так много было голосов. А так это общие принципы, касаемые любого языка в общем и PHP с Yii2 в частности.
А планируется ли еще какой-либо вебинар и на какую тему?
Да, планирую.
Вопрос один. Если вебинар посвящен тестам ЗАЧЕМ обьяснять как работать с Yii? Как создавать приложение, как работать с моделями. Вам не кажется это выходит за рамки?
Открою Вам страшную тайну: там есть перемотка клавишами влево-вправо.
Я это понимаю, но зачем рассказывать то, что не относится к теме?
А вот мне нужно, чтобы вот так вот разжевывали. А Вы можете перемотать или поставить ускоренное воспроизведение.
А видели структуру тестов yii2/app-advanced? я пока досмотрел до 1:24 и не знаю занимались ли вы этим вопросом в видео (7 часов таки почти). Но полез я туда и понял, что надолго там засяду, прежде чем смогу начать полноценно работать с тестами в проекте.
Видел. Там разложено по подпапкам common, backend и frontend. В видео об этом нету.
Спасибо за урок. Не могли бы Вы сделать текстовую версию данного урока? Т.к. смотреть все 6 часов не всегда у всех есть возможность. Да и текст на телефоне можно прочитать. Заранее спасибо.
Если есть желание, то можете под диктовку транскрибировать из речи в текст. Мы Вам дружно скажем спасибо :)
Если слово в слово и без исходного кода, то здесь выйдет примерно 100 вордовских страниц. Потом можно будет расставить листинги из репозитория. Думаю, что с вычиткой и речевыми правками успеете сделать всего за 70 часов.
Можно поменьше воды, побольше дела.
Можно. Разрешаю.
Отличный материал, Дмитрий, спасибо большое.
Здравствуйте. Судя по отладке кода FixtureHelper при использовании в acceptance тестах не получится задавать различные фикстуры для различных cept. Например 2 фикстуры для LoginCept, и 5 фикстур для UserCept. Как решить эту проблему на ваш взгляд?
Да, менять не получится. И между тестами они не перезагружаются. Просто добавляем все 7 пользователей в общую фикстуру и прогоняем разные тесты по ним.
спасибо!
видео на 3:51:00 о статических переменных - статические переменные не перезаписываются при создании класса. Не вводите в заблуждение незнающих.
Все методы в этих объектах будут это поле менять, как статическое Yii::$app перезаписывается при создании new Application. Там перезапись производится именно в конструкторе Application.
ок, сорри, не допоняли друг друга ;)
Спасибо ещё раз за видео.
Хочу предложить небольшую помощь тем, кто смотрит всё это и пересматривает отдельные части - можно на youtube в описании добавить таймкоды. Я об этом немного поздно задумался, но пока вот, что набросал:
Может немного кривые комментарии, но всё равно это очень поможет многим. Мне даже самому уже удобно.
Постараюсь чуть позже скинуть ещё коды остального времени, ну или может ещё кто-то поможет.
Странно, сделал все по образу и подобию, а в итоге в консоль все равно валит html верстку
Блин все повторял до 27 минуты. И вылезла ошибка
Дякую за гарний матеріал, причому не перший! Спочатку теж думав. що багато розжовується, але в цьому матеріалі стільки інформації для тих, хто не мав справу із тестуванням взагалі (як я), що за один раз все важко сприйняти та розжовування не зайві! Товариш підказав - можна ставити швидкість відтворення відео, наприклад 1,25 або 1,5) Ще раз дякую!
Ід прописав, ніби все перевірив, але така сама помилка -
Ось архів, якщо не важко гляньте в чому причина:
http://www.ex.ua/400575346514
Дякую)
в тому то і річ - там прописано)
І тест ніби запускається, але потім помилку пише:
http://prntscr.com/cldhrp
http://prntscr.com/cldinx
Розібрався) потрібно уважно імпортувати класи. В моєму випадку в класі Тесту потрібно було:
use tests\codeception\backend\unit\DbTestCase;
замість
use yii\codeception\DbTestCase;
Дякую Дмитру, ще раз, за гарний матеріал.
Поборов Unit тести. Тепер питання по функціональним)
LoginCept.php:
Результат:
В чому може бути проблема?
Дякую)
Помогите, выполнял все по видео и столкнулся с проблемой после установки PHPUnit, запускаю тест - вылетает ошибка:
что я сделал не так? :(
В правиле валидации [..., 'match', 'pattern' => '...'] ключ 'pattern' забыли.
Блин, мелочь такая, из-за невнимательности всю голову сломал.
Здравствуйте, отличный вебинар, то что надо.
У меня возникла небольшая проблема, при запуске команды phpunit --coverage-html ./report
у меня выводится ошибка - No whitelist is configured, no code coverage will be generated.
И понять что он хочет я немогу. Подскажите пожалуйста что я не так делаю.
Пропишите whitelist вместо blacklist.
Здравствуйте! Подскажите пожалуйста, как быть если сайт на виртуалке, но мне нужно запускать selenium-server не на виртуалке, а на самом компьютере?
Т.е. чтобы браузер запускался на компьютере, а код находится на виртуальной машине.
Здравствуйте, Дмитрий!
Не могу запустить тесты с момента после установки PHPUnit, у вас класс наследуется от PHPUnit_Framework_TestCase но такого не находит у меня (устанавливал как глобально, так и в проект), помогает только так: PHPUnit\Framework\TestCase.
Не совсем понимаю почему так.
Работабю из OpenServer, уже подумываю на vagrant перейти, может из ubuntu будет работать, но не уверен, что это поможет, думаю что чего-то не хватает, что бы был такой класс PHPUnit_Framework_TestCase
> Не совсем понимаю почему так.
В феврале вышел PHPUnit 6.0, где PHPUnit_Framework_TestCase переделали в PHPUnit\Framework\TestCase. Это нормально.
Да, я уже понял, у меня в зависимостях что-то не так было, не поставилась версия из видеоурока, потому поставил 6ю. Спасибо за ответ.
Нужна помощь, помоги плз. Прошел вебинар, инетересовало unit-тестирование. Все вродебы получилось, все стало понятно. Пытаюсь теперь запустить юнит тесты на своем проекте, advanced шаблон. Сгенерировал codeception тесты, прописал бутстрап настройки, как в уроке. Для проверки взял из урока EmailValidatorTest и не завелось. При запуске тестов пишет [Error] Class 'Yii' not found
Гуглил, не особо помогло, из того, что я нашел по советам, так это то, что надо подключать автолоад и сам Yii.php, но в бутрстрап он у меня подключен, как и в бутстрапе из урока, пути указаны правильно, помоги плз, если есть мыли, что может быть
вопрос снимаю предыдущий. я починил. но не совсем понимаю, почему так. В _bootstrap.php есть строка: Yii::setAlias('@tests', dirname(__DIR__).'/tests'); Вот именно из-за нее ругалось. Не пойму почему...
Я парился много времени с тестами, гуглил и прочее, потом спросил у знакомого, который их делал и говорит что тоже пытался долго просто стандартные запустить и ничего не выходило, а на линуксе летает, так вот хотелось спросить почему на винде не получается запустить? Ошибку точно не помню, но может известно почему, может что-то включить нужно или поставить расширение какое? Если нужно, могу скинуть ошибку, с чем работаю и что сделал для запуска?
Это не срочно или обязательно, а просто интересно, да и для других может будет полезно) Потому что я гуглил опять же этот вопрос, по поводу того, чего же на винде не запускаются, а на линуксе работает норм и ничего не нашел, никаких объяснений и прочей инфы.
Проблемы с переходом на линукс нет, или поднять сервер под виртуальной машиной, Vagrant'ом, но все же интересно что такое с виндой и в чем у нее проблема?
> Ошибку точно не помню
Оттуда и надо копать.
Уже решил проблему, на OpenServer 5.2.2, PHP7, раньше просто ставил не те расширения которые нужно было (точнее не те версии), в итоге в composer.json (для глобальных расширений) вот такой код выходит:
Пока смотрел набросал по темам еще материала
https://github.com/kopyrin/doc-codeception
Спасибо огромное. Но я был бы не я если бы не возникало вопросов. Остановился на 3:17:39 в чем запара
вот модель
вот тест
набираю в терминале
codecept unit run
получаю
и пока не просмотрел все, вы таблица со внешними ключами рассматриваете?
Переименуйте validationTest в testValidation.
Да спасибо огромное очень важное замечание.
Дмитрий, добрый день. При запуске unit тестов codeception не находит класс User. Не подскажете где мне искать ошибку?
Проверить bootstrap.php файлы.
Спасибо. Не заметил.
Скажите пожалуйста, а почему в PHPStotm может отсутствовать такой интерфейс для Unit тестов как у вас? У меня лишь какой-то странный и простой: https://i.stack.imgur.com/wJxfU.png причем версия шторма 2018.3