CircleCIでFuelPHPのテスト自動化
はじめに
今時テスト自動化なんて当たり前だが、うちのチームではやっておらず以下の課題があった。
- 個人の環境によってテストが通らないことがある
- テストをし忘れることがある(したという証拠がない)
サクッと自動化できないかと思い、CircleCIでためしてみた。
構成
- FuelPHP 1.7
- PHP 5.6
CircleCIとは?
他の人の見た方が早いので簡単に・・・
- SaaS型のCIサービス
- 他にもTravis CIとかある
- StackShareみてるとSolano CIの広告が最近でている
プロジェクトの追加
https://circleci.com にGitHub
アカウントでログイン後以下を行う。
ビルド一覧の説明
ビルドの方法
- リポジトリの
root
にcircle.yml
を置く -
circle.yml
にはテストするための準備(composerだったり、ddl流したり)やテストコマンドを記述する - PHPのバージョンなども指定できたりする
test:
override:
- php oil test --exclude-group=integration,Format
machine:
php:
version: 5.6.14
database:
post:
- mysql -u root < $HOME/$CIRCLE_PROJECT_REPONAME/ddl/mysql/setup.sql
- mysql hoge_test -u root < $HOME/$CIRCLE_PROJECT_REPONAME/ddl/mysql/create_table.sql
- psql -U postgres -f $HOME/$CIRCLE_PROJECT_REPONAME/ddl/postgres/setup.sql
- psql -d hoge_logs_test -U postgres -f $HOME/$CIRCLE_PROJECT_REPONAME/ddl/postgres/create_table.sql
- psql -d hoge_logs_test -U postgres -f $HOME/$CIRCLE_PROJECT_REPONAME/ddl/postgres/create_table2.sql
- FUEL_ENV=test php $HOME/$CIRCLE_PROJECT_REPONAME/oil refine migrate -all
上記の例だと、
-
database
でテストに必要なスキーマを流している(CircleCIにはMySQLとPostgresが存在)- マイグレーションもここでしている
-
machine
で使用するマシンのPHPのバージョンを変更している -
test
でテストコマンドを流している
composer install
についてはcomposer.json
があるためか、CircleCi
が自動で検知して使用してくれているため記述しない。
※ ddl
を使用している理由としては、そもそもmigration
はあるが、初期のdatabase
やtable
の作成する部分がない。ただ、ddl
があるためそれを使用している。
実際の動きはこんな感じ。
- composer install
- database
- test
という順番で動いてる。
テスト結果。
いつもはFormat
(FuelPHPのCoreのテスト)も一緒にテストしているのだが、マシンによっては修正が必要なため今回はスキップしている。(1.8では修正済み)
https://github.com/fuel/core/pull/1946/files
詰まったところ
スキーマの作成
ERROR 1231 (42000) at line 454: Variable 'time_zone' can't be set to the value of 'NULL'
ローカルのスキーマをインポートした際に出たエラー。
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
上記の内容がdumpの最後に追加されておりここらへんを削除するとエラーは消える。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html
mysqlのバージョンによってグローバルの設定が異なるせい?
スルーしてます。
FuelPHPのテスト時の環境変数
php oil test
だとapp/config/test
ディレクトリをみにいってしまうため、
FUEL_ENV=circle_ci php oil test --exclude-group=integration,Format
こんな風にしたいが、普通にやるとできない。
fuel/core/phpunit.xml
の設定で<server name="FUEL_ENV" value="test"/>
があるせいで、上書きできないらしい。
なので、解決方法としては、
-
fuel/app/phpunit.xml
にコピーしたあとに、<server name="FUEL_ENV" value="test"/>
を削除すればできる。 - ただ、これは間違いを防ぐためのものである可能性があるため、今回は
config/test/db.php
の中で条件分岐することで対応した。
良かったところ
- 皆がテストを意識するようになった
- CircleCIが終わるのを待ちどうしくなった