понедельник, 13 июля 2015 г.

§2.8 Тестирование в Yii 2 для новичков. Подключение базы данных в Codeception

С подключением базы данных для тестов промучился целую неделю! Но в конце-концов получилось.
Прочитал, что тестовая база данных должна быть отдельной от рабочий базы. Хорошо - создал базу данных catalog_test. А рабочая база данных - catalog. Изначально рабочая база пустая, в ней ничего нет. Все таблицы и данные в миграциях.
Первая миграция удаляет все таблицы из базы (за исключением таблицы миграций, в которой хранится состояние этих миграций, какие уже были применены). Применив (или откатив) эту миграцию получаем пустую базу данных. Какие бы там ни были таблицы - все начисто стирается. Тут был один момент, определить из какой базы данных стирать: из рабочей или из тестовой. Не нашел ничего лучше, чем распарсить dns запись:
 
$dbname = explode("=", Yii::$app->getDb()->dsn);

$dbname = $dbname[2];

echo 'Активная база данных: '. $dbname;

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

Настройка codeception

В файле /var/www/yii2/basic/tests/codeseption.yml
Прописываем url до индекс файла-тестов:
 
test_entry_url: http://yii2.lamp/index-test.php

и добавляем модуль Db:
modules:

  config:

    Db:

      dsn: mysql:host=localhost;dbname=catalog_test

      user: root

      password: 8246

      dump: codeception/_data/dump.sql

В дамп надо записать базу данных с созданием таблиц и вставкой данных (включая таблицу миграций) как есть на текущий момент, и обновлять этот дамп, если были применены новые миграции. Перед каждым тестом этот дамп создает тестовую базу аднных заново. Если вы сняли дамп с рабочий базы, проверьте, там не должно остаться названия рабочей базы данных! Поменяйте название базы данных в дампе на тестовую.
В файле /var/www/yii2/basic/tests/codeseption/unit.suite.yml активируем модуль Db
 
modules:

    enabled: [Asserts, Db]

Теперь в файле  /var/www/yii2/basic/tests/codeseption/config/config.php прописываем подключение к базе данных (по аналогии с /var/www/yii2/basic/config/db.php)
 
'components' => [

 'db' => [

     'dsn' => 'mysql:host=localhost;dbname=catalog_test',

     'username' => 'root',

     'password' => 'root',

     'charset' => 'utf8',

     'tablePrefix' => 'tbl_',

 ]

],

Я сам не уловил, для чего прописывать подключение в двух разных файлах, может для разных видов тестов используются разные модули?
Теперь нужно сделать (так как мы подключали модули)
 codecept build    
Применить миграции на тестовую базу данных, это делается так:
php /var/www/yii2/basic/tests/codeception/bin/yii migrate
Теперь можно создавать тесты, проверяющие код, который использует базу данных.
Продолжение следует.

пятница, 26 июня 2015 г.

§2.7 Yii2. Странное кодирование ( %2F вместо / ) в URL

Заметил странную вещь: URL кодируется:
Все работает, но в адресной строке
http://yii2.lamp/index.php?r=category%2Fstructure
вместо
http://yii2.lamp/index.php/category/structure

Слеш кодируется в %2F.

Это лечится добавлением
 
'enablePrettyUrl' => true,

в массив urlManager массива $config. Делается это в файле /var/www/yii2/basic/config/web.php
Полностью этот файл можно увидеть на моем github.

§2.6 Тестирование в Yii 2 для новичков

Надо не отставать от жизни и научиться использовать тесты. Yii2 предлагает полный набор для тестов: модульные, функциональные, приемочные. Для тестирование используется Codeception

Глобальная установка codeception

При помощи Composer необходимо (везде рекомендуют :) ставить глобально codeception - приложение для тестирования, которое используется в Yii2.
composer global require "codeception/codeception=2.0.*"
composer global require "codeception/specify=*"              
composer global require "codeception/verify=*"                  

Внесение изменений в переменную $PATH

При глобальной установке с помощью Composer пакеты ставятся в папку (вместо username подставьте имя пользователя) /home/username/.composer/vendor/bin чтобы система искала команды в этой папке её надо добавить в переменную $PATH
echo 'export PATH=$PATH:/home/username/.composer/vendor/bin' >> ~/.bash_profile   После этого надо разлогиниться и залогиниться снова.

Установка расширения CURL

Для работы codeception необходимо расширение php5-curl его надо поставить:
sudo apt-get install php5-curl                  
sudo service apache2 restart                    

Запуск тестов

Переходим в папку проекта: /var/www/yii2/basic/tests выполняем создание недостающих тестов (некоторые тесты уже созданы yii2):
 codecept build                                        

Настройка тестов

Теперь необходимо в файле /var/www/yii2/basic/tests/codeception.yml и файле  /var/www/yii2/basic/tests/acceptance.suite.yml  прописать URL вашего проекта. По умолчанию там http://localhost:...... 

Теперь можно запустить все тесты (находимся в папке /var/www/yii2/basic/tests/):

codecept run                                           

Литература:

четверг, 25 июня 2015 г.

Git для новичнов. Работа на двух компьютерах.

Расскажу, как я работаю на двух разных компьютерах делая один проект. Один компьютер дома, другой - на работе. За этими компьютерами могут работать и разные люди, тогда это будет пример работы в команде. Синхронизация файлов проекта идет через github.com.

План такой:
  • Создать на одном компьютере папку с файлами проекта
  • Передать их на github
  • Загрузить с github на другой компьютер

Теперь можно работать на любом компьютере: перед началом работы загружаем изменения проекта с github к себе, после окончания работы - загружаем сделанные изменения на github.
Как же быть с базой данных? - спросите вы. База данных будет синхронизироваться с помощью миграций.
Приступим.
На одном компьютере создаем проект. У меня это, конечно, мой проект о котором я тут и пишу: создание каталога товаров в Yii2. Он находится в виртуальной машине в каталоге /var/www/yii2/.
Устанавливаем git. Для windows - https://git-scm.com/download/win Для linux:
https://git-scm.com/book/ru/v1/Введение-Установка-Git#Установка-в-Linux
Переходим в папку проекта: если вы работаете в windows открываем папку в файл-менеджере, если в linux - выполняем команду:
cd /var/www/yii2/                                        
Теперь надо подготовится к созданию репозитория git: 
Github использует файл README.txt из корня проекта для описания проекта (отображает содержимое файла на главной станице). Создадим пустой файл README.txt в папке /var/www/yii2/ и напишем туда описание: у меня это "Этот проект я начал для изучения PHP фреймворка Yii2. В нем я создаю простой каталог товаров, а как я это делаю — описываю в блоге: http://psyhos.blogspot.com/"и сохраняем.
Git будет следить за изменениями всех файлов в данном каталоге, но правильным будет исключить некоторые файлы из репозитория. Для этого нужно создать файл .gitignore в корне нашей папке проекта. в нем можно указать, какие файлы не попадут в git у меня содержимое файла /var/www/yii2/.gitignore такое:

$ cat .gitignore
Yii 2.clpprj
/basic/config/db.php

то есть я исключил файл проекта codelobster и файл подключения к базе данных. В папке /var/www/yii2/basic тоже есть .gitignore созданный при установке yii2. Там, помимо прочего, исключается папка vendor, которая скачивается через composer.
Теперь можно создавать репозиторий git. Для windows сначала надо открыть окно git - можно щелкнуть правой кнопкой мыши в папке и выбрать Git Bash (когда установите git этот пункт появляется в контекстном меню). Откроется черное окно командной строки git, такое как на рисунке:


Для linux этот шаг пропускаем. В linux просто остаемся в терминале в нужной папке. Далее для windows и для linux одинаково.
Настраиваем git:

git config --global user.name "ваше имя"    
git config --global user.email "ваша почта" 
git config --global core.autocrlf true      
git config --global core.safecrlf true      

Команда
git init                                                                    
создает репозиторий git. это тоже папка с именем .git в которой хранятся все изменения. Вот как теперь выглядит моя папке проекта в windows если включить отображение скрытых файлов:















Создаем первый коммит, то есть первое сохранение в git
git commit -a -m 'Initial commit'                                   
git - всегда первое слово при работе с git-ом;
commit - создать "сохранение" или коммит;
-а - добавить все файлы для коммита;
-m 'Сообщение' - комментарий для коммита;
Теперь можно загрузить это сохранение на github. Идем на https://github.com/ и создаем себе аккаунт. Теперь на github создаем пустой репозиторий.
Теперь надо подключить свой github репозиторий к своему локальному. Делается это командой add:
git add yii2_gh https://github.com/Psyhos/Catalog_Yii2
add - добавить удаленный репозиторий
yii2_gh - псевдоним для удаленного репозиротия
https://github.com/Psyhos/Catalog_Yii2 - путь к вашему github аккаунту
Когда удаленный репозиторий подключен, можно загрузить в него ваш проект:
git  push yii2_gh master
push - выгрузить данные в удаленный репозиторий
yii2_gh - псевдоним вашего удаленного репозитория (см. предыдущую команду)
master - ветка, которую вы выгружаете (master создается сразу)
Возможно попросит ввести ваши имя пользователя и пароль от github аккаунта.
Можно проверить свой github - там должны появится файлы вашего проекта!

Теперь переходим на другой компьютер.

Устанавливаем git.
Создаем папку для проекта. В этой папке инициализируем git репозиторий, как делали на первом компьютере:
Команда
git init                                                                    
Теперь клонируем к себе проект с github:
git clone https://github.com/Psyhos/Catalog_Yii2 .         
clone - команда клонировать;
https://github.com/Psyhos/Catalog_Yii2 - адрес репозитория;
. - локальная папка, куда загрузится проект. Точка = текущая папка;
Псевдоним этого удаленного репозитория будет origin.

Теперь с любого из этих компьютеров можно работать с проектом. Вначале работы делаем:
git  pull [псевдоним удаленного репозитория]                 
В конце работы - 
git commit -a -m '[коментарий к коммиту]'                          
и
git  push [псевдоним удаленного репозитория] master    

Стоит прочитать:
https://git-scm.com/book/ru/v1


Продолжение следует


четверг, 18 июня 2015 г.

§2.5 Yii2. Мультиязычность (I18N) и миграции базы данных

Решил применить мультиязычность, как описано в статье хабра Yii2 и организация мультиязычности. В этом методе список языков хранится в базе данных, то есть придется для этого делать таблицу. Делать ее будут с помощью миграций базы данных. Если вкратце, то миграция, это php файл, в котором хранится класс, наследуемый от класса фреймворка Migration. В получившемся классе имеются методы для какого либо изменения базы данных и отката этих изменений. Нужны миграции для того, чтобы не терять контроль за состоянием базы данных в процессе работы: можно проследить историю изменений базы и в случае необходимости вернуться к прежнему состоянию.
Создать миграцию оказалось довольно просто. Сначала надо создать папку для хранения миграций: var/www/yii2/basic/migrations. Теперь подключаемся к веб-серверу через SSH переходим в папку var/www/yii2/basic/ и выполняем команду:
php yii migrate/create language
Language - это названия класса миграции, оно может быть любым. В итоге в папке var/www/yii2/basic/migrations создается файл m_дата_время_имя_класса.php в нем и надо создавать команды для изменения базы данных и команды для откатов этих изменений.
Я добавил в него все, как сказано в статье выше. Нашел небольшую неточность:
 
$this->batchInsert('{{%lang}}', ['url', 'local', 'name', 'default', 'date_update', 'date_create' ...
Должно быть не lang, а {{%lang}}.
После этого миграцию можно применить: из консоли команда:

php yii migrate

Выходит такое сообщение, в котором набираем "y"

user@server:/var/www/yii2/basic$ php yii migrate                              
Yii Migration Tool (based on Yii v2.0.4)                                              
                                                                                                               
Creating migration history table "tbl_migration"...Done.                     
Total 1 new migration to be applied:                                                    
        m150618_091819_language                                                         
                                                                                                              
Apply the above migration? (yes|no) [no]:y                                         

Если ошибок при создании таблицы и вставлении данных нет, то получаем:

*** applying m150618_091819_language                                             
    > create table {{%lang}} ... done (time: 0.014s)                                
    > insert into {{%lang}} ... done (time: 0.008s)                                  
*** applied m150618_091819_language (time: 0.031s)                        
                                                                                                                 
                                                                                                                 
Migrated up successfully.                                                                       
user@server:/var/www/yii2/basic$                                                        

Создалась новая таблица с данными. Можно продолжать.. 
PS. Кстати, теперь научились делать миграции!