|
1 |
| -### Административное приложение Backend |
| 1 | +### Знакомство с тестированием |
2 | 2 |
|
3 |
| -В этом разделе добавим функциональности в backend приложение. Создадим место, где администратор сможет просматривать |
4 |
| -результаты опроса. Рассмотрим возможности ограничения доступа к тому или иному функционалу. |
| 3 | +Неотъемлемой частью разработки масштабного приложения служит тестирование тех или иных частей этого приложения. |
| 4 | +Есть даже методика разработки приложений, которая тесно связана с тестированием - разработка через тестирование. Возможно, |
| 5 | +вы знакомы с ней как <a href="https://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a>. |
5 | 6 |
|
6 |
| -Чтобы начать, выполните команду из директории yii2-tutorial: |
| 7 | +Разработчики и сообщество Yii приложило много усилий, чтобы можно было максимально просто покрыть тестами необходимый код. |
7 | 8 |
|
| 9 | +Раньше, например когда создавали форму опрос, приходилось открывать браузер, заполнять форму выдуманными данными, проверять |
| 10 | +результат. Добавляли успешный вывод сообщения, в виде результата - опять открывали форму, заполняли данными, проверяли |
| 11 | +результат. Добавили, поведение к форме - опять проверяли, открывая форму и вводя данные. Сохраняли результат в базе данных - |
| 12 | +приходилось смотреть сохранились ли данные корректно. Всё это наверное вам знакомо. Возможно, вам приходится такое проделывать, |
| 13 | +когда разрабатывается тот или иной функционал. А когда приложение становится масштабным, уже боязно вносить изменения |
| 14 | +в код. Так как далее приходится тратить много времени, чтобы пройтись по некоторым страницам сайта и проверить |
| 15 | +вручную всё ли работает как требуется. И часто, спустя несколько дней, кто-нибудь сообщает, что то что, когда-то работало, |
| 16 | +перестало работать. И опять тратиться время на выяснение причины неисправности, а так как изменения вносились несколько |
| 17 | +дней назад, то поиск истиной причины становится мукой. Или причина неисправности определяется неверно и в результате |
| 18 | +добавляется "костыль", который исправляет проблему. |
| 19 | + |
| 20 | +Может вы к этому привыкли и вас всё устраивает. Но что, если про это всё забыть и использовать всего лишь одну команду: |
| 21 | + |
| 22 | +``` |
| 23 | +codecept run |
| 24 | +``` |
| 25 | + |
| 26 | +Всё! Больше ничего. Запустив команду, после очередного изменения кода и не увидев ни одной ошибки в результатах, вы можете |
| 27 | +со спокойной душой сообщить всем, что всё работает, как того требует техническое задание. |
| 28 | + |
| 29 | +В этой главе посмотрим, что скрывается под командой `codecept run`. Чтобы начать, выполните команду из |
| 30 | +директории yii2-tutorial: |
| 31 | + |
| 32 | +``` |
| 33 | +git checkout -f step-1.0 |
| 34 | +``` |
| 35 | + |
| 36 | + |
| 37 | +<p class="alert alert-info">Под Windows вместо стандартной командной строки cmd лучше использовать другой интерпретатор. |
| 38 | +Тот который использует подсветку кода, например <a href="http://gooseberrycreative.com/cmder/" target="_blank">Cmder</a> |
| 39 | +</p> |
| 40 | + |
| 41 | +#### Codeception |
| 42 | + |
| 43 | +Yii для тестирование кода предоставляет систему <a href="http://codeception.com/" target="_blank">Codeception</a>. |
| 44 | +Codeception основан на php фреймворке для тестирования <a href="https://phpunit.de/" target="_blank">PHPUnit</a>. |
| 45 | +Вся настройка Codeception сводится к следующим шагам: |
| 46 | + |
| 47 | +- создайте директорию `codecept`, где посчитаете нужным (не внутри учебника) |
| 48 | +- создайте в этой директории `composer.json`: |
| 49 | +``` |
| 50 | +{ |
| 51 | + "require": { |
| 52 | + "codeception/codeception": "*", |
| 53 | + "codeception/verify": "*", |
| 54 | + "codeception/specify": "*" |
| 55 | + } |
| 56 | +} |
| 57 | +``` |
| 58 | +- запустите команду `composer install` из этой директории |
| 59 | +- после установки всех зависимостей, настройте переменную |
| 60 | +<a href="https://ru.wikipedia.org/wiki/PATH_%28%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F%29" target="_blank"> |
| 61 | +PATH</a> на директории `codecept\vendor\bin\`, чтобы команда codecept была доступна из любого места. |
| 62 | + |
| 63 | +Теперь можно выполнить команду `codecept -V`, чтобы увидеть версию Codeception и убедиться, что он успешно установлен. |
| 64 | + |
| 65 | +#### Виды тестов |
| 66 | + |
| 67 | +Codeception поддерживает следующие виды тестов: |
| 68 | + |
| 69 | +- Модульные тесты (Unit), которые проверяют код, который выполняется в изоляции. |
| 70 | +- Функциональные тесты (Functional), которые проверяют код, через эмуляцию браузера. |
| 71 | +- Приёмочные тесты (Acceptance), которые проверяют код, через браузер. |
| 72 | + |
| 73 | +Все тесты располагаются в `\yii2-tutorial\yii2-app-advanced\tests\codeception`. Как и структура Advanced шаблона Yii, |
| 74 | +тесты также разделены для гибкости на backend и frontend. Только настройки вынесены в отдельную директорию `config`. |
| 75 | + |
| 76 | +Кстати для некоторых тестов необходимо соединение с базой данных. Придётся извлекать, записывать данные, а иногда и удалять. |
| 77 | +Понятное дело, что основную базу лучше в этом случае не использовать. Нужна тестовая. Используя миграции, не составит труда |
| 78 | +создать копию основной базы данных. |
| 79 | + |
| 80 | +Поэтому в `yii2-app-advanced/tests/codeception/config/config.php` указана: |
| 81 | + |
| 82 | +```php |
| 83 | +'db' => [ |
| 84 | + 'dsn' => 'sqlite:' . dirname(__FILE__) .'/../../sqlite-test.db', |
| 85 | +], |
8 | 86 | ```
|
9 |
| -git checkout -f step-0.3 |
| 87 | + |
| 88 | +К этой базе данных применены все миграции, которые использовались и для основной. Чтобы это выполнить, понадобилось |
| 89 | +вызвать `php yii migrate` из `yii2-app-advanced/tests/codeception/bin`. |
| 90 | + |
| 91 | +Теперь вернёмся к структуре директорий. Открыв `yii2-app-advanced/tests/codeception/backend`, можно обнаружить |
| 92 | + |
| 93 | +``` |
| 94 | +[_output] |
| 95 | +[acceptance] |
| 96 | +[functional] |
| 97 | +[unit] |
| 98 | +``` |
| 99 | + |
| 100 | +`acceptance, functional, unit` директории, которые хранят тесты в зависимости от их видов. `_output` - это директория, в |
| 101 | +которую будет попадать результат эмуляции браузера (html код страницы) для функциональных тестов, в случае ошибки. |
| 102 | + |
| 103 | +В Codeception есть понятие "Исполнители тестов". Из названия понятно, для чего они. Для того, чтобы их создать |
| 104 | +необходимо произвести их инициализацию. В директории `tests/codeception/frontend` |
| 105 | +необходимо выполнить `codecept build`. Создадутся файлы: |
| 106 | + |
10 | 107 | ```
|
| 108 | +yii2-app-advanced/tests/codeception/frontend/acceptance/AcceptanceTester.php |
| 109 | +yii2-app-advanced/tests/codeception/frontend/functional/FunctionalTester.php |
| 110 | +yii2-app-advanced/tests/codeception/frontend/unit/UnitTester.php |
| 111 | +``` |
| 112 | + |
| 113 | +которые и будут являться исполнителями. В последствии, тоже самое нужно проделать и для backend части. |
| 114 | + |
| 115 | +#### Запуск тестов |
| 116 | + |
| 117 | +Можно попробовать для frontend запустить тесты. В `yii2-tutorial\yii2-app-advanced\tests\codeception\frontend\` |
| 118 | +запустим на выполнение все функциональные тесты: |
| 119 | + |
| 120 | +```php |
| 121 | +codecept run functional |
| 122 | + |
| 123 | +Time: 3 seconds, Memory: 29.25Mb |
| 124 | +OK (6 tests, 49 assertions) |
| 125 | +``` |
| 126 | + |
| 127 | +Выполнив эту команду, вы наверное ничего и не почувствовали. Но обратите внимание на время выполнения - **3 секунды**. |
| 128 | +За эти три секунды `FunctionalTester` успел посетить страницу <a href="/yii2-app-advanced/frontend/web/index.php?r=site/about" target="_blank"> |
| 129 | +о нас</a>, <a href="/yii2-app-advanced/frontend/web/index.php?r=site/contract" target="_blank">обратная связь</a>, |
| 130 | +<a href="/yii2-app-advanced/frontend/web/index.php?r=site/index" target="_blank">домашнюю страницу</a> и проверить |
| 131 | +что они работают без ошибок. В эти 3 секунды исполнитель побывал на |
| 132 | +<a href="/yii2-app-advanced/frontend/web/index.php?r=site/signup" target="_blank">странице регистрации</a>, |
| 133 | +<a href="/yii2-app-advanced/frontend/web/index.php?r=site/login" target="_blank">аутентификации</a>, |
| 134 | +и на <a href="/yii2-app-advanced/frontend/web/index.php?r=site/login" target="_blank">странице опроса</a>, проверил эти |
| 135 | +формы, на корректность ввода данных. Исполнитель проверил работоспособность поведения accessOnce, которое было создано ранее. |
| 136 | +В сумме за три секунды исполнитель выполнил 6 тестов, в которых присутствовало 49 проверок. |
| 137 | + |
| 138 | +Представьте сколько бы времени у вас ушло, если бы это выполняли самостоятельно через браузер. И запустив |
| 139 | + |
| 140 | +```php |
| 141 | +codecept run functional |
| 142 | +``` |
| 143 | + |
| 144 | +после очередного рефакторинга кода, можно с уверенностью сказать, корректно ли работает сайт. А не бродить по сайту в поисках |
| 145 | +"А не поломал ли я чего-нибудь?". В этом и есть одна из приятных особенностей тестирования. |
| 146 | + |
| 147 | +Также можно попробовать запустить модульные тесты: |
| 148 | + |
| 149 | +```php |
| 150 | +codecept run unit |
| 151 | + |
| 152 | +Time: 8.29 seconds, Memory: 17.00Mb |
| 153 | +OK (9 tests, 25 assertions) |
| 154 | +``` |
| 155 | + |
| 156 | +А вот для приёмочных, вы обнаружите ошибки. |
| 157 | + |
| 158 | +```php |
| 159 | +codecept run acceptance |
| 160 | + |
| 161 | +FAILURES! |
| 162 | +Tests: 5, Assertions: 0, Errors: 5. |
| 163 | +``` |
| 164 | + |
| 165 | +Всё дело в том, что для работы приёмочных тестов нужен браузер. Окружение для Codeception в Yii настроено таким образом, |
| 166 | +что используется <a href="http://codeception.com/docs/modules/PhpBrowser" target="_blank">PhpBrowser</a>. |
| 167 | + |
| 168 | +``` |
| 169 | +// Файл yii2-app-advanced/tests/codeception/frontend/acceptance.suite.yml |
| 170 | +modules: |
| 171 | + enabled: |
| 172 | + - PhpBrowser |
| 173 | + - tests\codeception\common\_support\FixtureHelper |
| 174 | + config: |
| 175 | + PhpBrowser: |
| 176 | + url: http://localhost:8080 |
| 177 | +``` |
| 178 | + |
| 179 | +Т.е. настраивать ничего не нужно, остаётся изменить только путь к нашему сайту с http://localhost:8080 на |
| 180 | +http://localhost:8888/yii2-app-advanced/. Сделайте это. |
| 181 | + |
| 182 | +Вместо PhpBrowser может быть выбран любой другой браузер (Chrome, FF, IE или другой) под управлением специального |
| 183 | +веб-драйвера, например <a href="http://www.seleniumhq.org/" target="_blank">Selenium</a>. Смена PhpBrowser браузера |
| 184 | +позволит тестировать поведения в браузере, связанные с javascripts. |
| 185 | + |
| 186 | +А сейчас, когда PhpBrowser настроен, можно пробовать запускать и приёмочные тесты. |
| 187 | + |
| 188 | +Запуск отдельных тестов, сокращает время ожидания выполнения. Codeception поддерживает: запуск всех тестов, |
| 189 | +запуск тестов по видам и запуск отдельных тестов. Например, для `yii2-app-advanced/tests/codeception/frontend` можно |
| 190 | +выполнить: |
| 191 | + |
| 192 | +``` |
| 193 | +codecept run |
| 194 | +codecept run functional |
| 195 | +codecept run functional functional\InterviewCept.php |
| 196 | +``` |
| 197 | + |
| 198 | +#### Дополнительная информация для самостоятельного ознакомления: |
11 | 199 |
|
| 200 | +- <a href="https://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D1%82%D1%80%D0%B5%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" target="_blank">Экстремальное программирование</a>. |
| 201 | +- <a href="http://codeception.com/docs/01-Introduction" target="_blank">Руководство по Codeception</a>. |
| 202 | +- <a href="https://phpunit.de/manual/current/en/index.html" target="_blank">Руководство по PHPUnit</a>. |
0 commit comments