Тестирование с PHPUnit и Codeception в Yii2

Самая объёмная тема среди предложенных завершена. Выкладываю исправленную и дополненную запись вебинара-скринкаста о тестировании c PHPUnit и Codeception. Добавлены и доработаны примеры кода, пункты про аннотации, фикстуры, анализ покрытия, Faker, про установку всего через composer и другие нюансы:

Открыть на YouTube
Коды примеров
Код проекта с тестами

Статья про запуск в проекте
Статья про применение моков и TDD

Ещё в тему доклад по обновлённым тестам в Yii2:

Структура вебинара-скринкаста (кликабельно):

Кто ещё не подписался на остальные вебинары, тот сам себе Буратино:

И задавайте вопросы в комментариях. Заранее спасибо и до встречи в эфире!

Другие статьи

Часто встречаю вопрос о том, что же это за странные блоки комментариев постоянно генерируются в представлениях, в ActiveRecord-моделях и перед всеми методами в коде? Что они обозначают и зачем они нужны? Это какой-то особый синтаксис объявления переменных в PHP или что?

В этот раз порассуждали о понятиях и реализациях различных подходов к авторизации, аутентификации и контроле доступа на основе ролей в Yii2. Рассмотрели нюансы, сравнили друг с другом различные подходы к реализации RBAC.

Недавно в обратную связь поступил вопрос: куда пойти работать неопытному молодому программисту? А именно, продолжить искать заказы на фрилансе или всё-таки устроиться удалённо в крупную студию или другую компанию и работать там?

После добавления личного кабинета пользователя и редактора профиля в прошлых частях сегодня начнём делать модуль администратора. А именно, создадим модуль и CRUD для управления пользователями с помощью генератора Gii и доработаем его вид и маршрутизацию под свои требования.

Комментарии

 

ken

Огромное спасибо за проделанный труд! )

Ответить

 

Даниил

Огромная работа!!! Смотрю пока оригинал, очень ценная информация. Спасибо большое! Задонатил.

Ответить

 

ken

Скажите в чем делали mindmap о тестировании. Спасибо

Ответить

 

Дмитрий Елисеев

В XMind.

Ответить

 

Web design Dubai

Спасибо огромное, все руки не доходили до тестирования :)

Ответить

 

Ramil Z.

Спасибо за видео. Давно хотел изучить вопрос тестирования.

Написал в консоли:
composer global require "phpunit/phpunit:~4.8"

Но в итоге почему-то устанавливается: PHPUnit 3.7.21 by Sebastian Bergmann.

В чем может быть проблема?

Ответить

 

Дмитрий Елисеев

Возможно, что ставили что-то в global раньше.

Ответить

 

Ramil Z.

Ставил только composer global require "fxp/composer-asset-plugin:~1.0.3"

Ответить

 

Сергей Сероед

Очень полезная информация, собранная мастером и занесена в самое ядро мозга.
Вдохновлен и впечатлен.
Спасибо!

Ответить

 

Artem

Добрый день.
Такая проблема возникает:
Установил глобально 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, чтобы их туда не подтягивать.

Ответить

 

Artem

Спасибо за подсказку Установил компоненты в секцию 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:

codecept run --no-colors

А так это просто в PHPStorm отбычная консоль цветная, а тестовая - чёрно-белая. Я на Windows раньше ставил эмулятор линуксового терминала Cygwin, и он как раз цветным был.

Ответить

 

Arthur Mr

Дмитрий, спасибо большое за видео!

По поводу цветной консоли в шторме можно подробнее? У меня никак не хочет отображать цвета. В настройках есть цвета (в примере), а в самой консоли весь вывод одного цвета... не очень читабельно. Win 8 + PhpStorm 10.

Поставил ConEmu, там все ок. Пробовал заменить консоль шторма на ConEmu, но оно открывается отдельно, не очень удобно. Хотелось бы именно встроенную в шторм консоль сделать нормальной на винде.

И что Вы имели в виду под "обычная консоль" и "тестовая консоль"?

Ответить

 

Дмитрий Елисеев

Обычная - которая во вкладке "Terminal" и в которой мы команды пишем, тестовая - в которой результаты тестов выводятся при запуске кнопкой "Run".

Ответить

 

Arthur Mr

У меня и в той и в другой весь вывод одним цветом :(

Ответить

 

Дмитрий Елисеев

Windows уже три года не пользуюсь. Так что запускайте в своей цветной ConEmu или терпите так :)

Ответить

 

андрей

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

Ответить

 

андрей

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

Ответить

 

Дмитрий Елисеев

За эту тему не так много было голосов. А так это общие принципы, касаемые любого языка в общем и PHP с Yii2 в частности.

Ответить

 

Мастер Ремонт

А планируется ли еще какой-либо вебинар и на какую тему?

Ответить

 

maxyc

Вопрос один. Если вебинар посвящен тестам ЗАЧЕМ обьяснять как работать с Yii? Как создавать приложение, как работать с моделями. Вам не кажется это выходит за рамки?

Ответить

 

Дмитрий Елисеев

Открою Вам страшную тайну: там есть перемотка клавишами влево-вправо.

Ответить

 

maxyc

Я это понимаю, но зачем рассказывать то, что не относится к теме?

Ответить

 

Игр

А вот мне нужно, чтобы вот так вот разжевывали. А Вы можете перемотать или поставить ускоренное воспроизведение.

Ответить

 

maxyc

А видели структуру тестов yii2/app-advanced? я пока досмотрел до 1:24 и не знаю занимались ли вы этим вопросом в видео (7 часов таки почти). Но полез я туда и понял, что надолго там засяду, прежде чем смогу начать полноценно работать с тестами в проекте.

Ответить

 

Дмитрий Елисеев

Видел. Там разложено по подпапкам common, backend и frontend. В видео об этом нету.

Ответить

 

Александр

Спасибо за урок. Не могли бы Вы сделать текстовую версию данного урока? Т.к. смотреть все 6 часов не всегда у всех есть возможность. Да и текст на телефоне можно прочитать. Заранее спасибо.

Ответить

 

Дмитрий Елисеев

Если есть желание, то можете под диктовку транскрибировать из речи в текст. Мы Вам дружно скажем спасибо :)

Если слово в слово и без исходного кода, то здесь выйдет примерно 100 вордовских страниц. Потом можно будет расставить листинги из репозитория. Думаю, что с вычиткой и речевыми правками успеете сделать всего за 70 часов.

Ответить

 

Alex

Можно поменьше воды, побольше дела.

Ответить

 

Дмитрий Елисеев

Можно. Разрешаю.

Ответить

 

Сергей

Отличный материал, Дмитрий, спасибо большое.

Ответить

 

Евгений

Здравствуйте. Судя по отладке кода FixtureHelper при использовании в acceptance тестах не получится задавать различные фикстуры для различных cept. Например 2 фикстуры для LoginCept, и 5 фикстур для UserCept. Как решить эту проблему на ваш взгляд?

Ответить

 

Дмитрий Елисеев

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

Ответить

 

Евгений

спасибо!

Ответить

 

xsawe

видео на 3:51:00 о статических переменных - статические переменные не перезаписываются при создании класса. Не вводите в заблуждение незнающих.

<?php
	
class Foo {
	public static $var;
}

$foo1 = new Foo;
var_dump($foo1::$var);
$foo1::$var = 'newVar';
var_dump($foo1::$var);
$foo2 = new Foo;
var_dump($foo2::$var);;
var_dump(Foo::$var);;

Ответить

 

Дмитрий Елисеев

Все методы в этих объектах будут это поле менять, как статическое Yii::$app перезаписывается при создании new Application. Там перезапись производится именно в конструкторе Application.

Ответить

 

xsawe

ок, сорри, не допоняли друг друга ;)

Ответить

 

nikosid

Спасибо ещё раз за видео.
Хочу предложить небольшую помощь тем, кто смотрит всё это и пересматривает отдельные части - можно на youtube в описании добавить таймкоды. Я об этом немного поздно задумался, но пока вот, что набросал:

https://youtu.be/gRmEpUYaS20?t=3h37m32s - codeception
https://youtu.be/gRmEpUYaS20?t=3h00m38s - Verify
https://youtu.be/gRmEpUYaS20?t=3h10m35s - Specify
https://youtu.be/gRmEpUYaS20?t=3h20m7s - Фикстуры
https://youtu.be/gRmEpUYaS20?t=3h26m42s - Аннотации
https://youtu.be/gRmEpUYaS20?t=3h32m27s - Тесты на будущее/пустые тесты (Incomplete)
https://youtu.be/gRmEpUYaS20?t=3h35m5s - Пропущенные тесты (Skipped)
https://youtu.be/gRmEpUYaS20?t=3h38m6s - Группы тестов (@group)
https://youtu.be/gRmEpUYaS20?t=3h40m36s - (@expectedExeption)
https://youtu.be/gRmEpUYaS20?t=3h55m18s - Приёмочные и функциональные тесты

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

Ответить

 

Сергей

Странно, сделал все по образу и подобию, а в итоге в консоль все равно валит html верстку

Ответить

 

Игр

Блин все повторял до 27 минуты. И вылезла ошибка

Fatal error: Uncaught exception 'yii\base\InvalidConfigException'
with message 'The "id" configuration for the Application is required.'
Ответить

 

Дмитрий Елисеев
$config = [
    'id' => 'app',
    'language'=>'ru-RU',
    ...
];
Ответить

 

Денис Журба

Дякую за гарний матеріал, причому не перший! Спочатку теж думав. що багато розжовується, але в цьому матеріалі стільки інформації для тих, хто не мав справу із тестуванням взагалі (як я), що за один раз все важко сприйняти та розжовування не зайві! Товариш підказав - можна ставити швидкість відтворення відео, наприклад 1,25 або 1,5) Ще раз дякую!

Ответить

 

Денис Журба

Ід прописав, ніби все перевірив, але така сама помилка -

[yii\base\InvalidConfigException] The "id" configuration for the Application is required.

Ось архів, якщо не важко гляньте в чому причина:
http://www.ex.ua/400575346514

Дякую)

Ответить

 

Дмитрий Елисеев
$config = [
    'id' => 'app',
    'language'=>'ru-RU',
    ...
];
Ответить

 

Денис Журба

Розібрався) потрібно уважно імпортувати класи. В моєму випадку в класі Тесту потрібно було:

use tests\codeception\backend\unit\DbTestCase;

замість

use yii\codeception\DbTestCase;

Дякую Дмитру, ще раз, за гарний матеріал.

Ответить

 

Денис Журба

Поборов Unit тести. Тепер питання по функціональним)
LoginCept.php:

namespace tests\codeception\backend\functional;

use tests\codeception\backend\FunctionalTester;
use tests\codeception\common\_pages\LoginPage;

/* @var $scenario \Codeception\Scenario */

$I = new FunctionalTester($scenario);
$I->wantTo('ensure login page works');
$I->amOnPage('/user/login');

Результат:

Tests\codeception\backend.functional Tests (1) -------------
E LoginCept: Ensure login page works
------------------------------------------------------------
1) LoginCept: Ensure login page works
 Test  .\functional\\LoginCept.php

  [yii\base\InvalidConfigException] Unable to determine the path info of the current request.

Scenario Steps:

 2. $I->amOnPage("/user/login") at functional\LoginCept.php:17
 1. $I->amOnPage("/backend/web/index-test.php/user/login") at ption\BasePage.php:77

#1  \vendor\yiisoft\yii2\web\Request.php:677
#2  \vendor\yiisoft\yii2\web\UrlManager.php:237
#3  \vendor\yiisoft\yii2\web\Request.php:179
#4  \vendor\yiisoft\yii2\web\Application.php:78
#5  \Users\AdminD\AppData\Roaming\Composer\vendor\symfony\browser-kit\Client.php:315
#6  Codeception\Module\Yii2->amOnPage
#7  \tests\codeception\backend\_support\_generated\FunctionalTesterActions.php:554
#8  \tests\codeception\backend\functional\LoginCept.php:17

Time: 1.02 seconds, Memory: 14.00MB

В чому може бути проблема?
Дякую)

Ответить

Оставить комментарий

Войти | Завести аккаунт


(никто не увидит)



Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>