LoginSignup
8
10

More than 5 years have passed since last update.

CircleCIでFuelPHPのテスト自動化

Last updated at Posted at 2016-08-14

CircleCIでFuelPHPのテスト自動化

はじめに

今時テスト自動化なんて当たり前だが、うちのチームではやっておらず以下の課題があった。

  • 個人の環境によってテストが通らないことがある
  • テストをし忘れることがある(したという証拠がない)

サクッと自動化できないかと思い、CircleCIでためしてみた。

構成

  • FuelPHP 1.7
  • PHP 5.6

CircleCIとは?

他の人の見た方が早いので簡単に・・・

  • SaaS型のCIサービス
  • 他にもTravis CIとかある
  • StackShareみてるとSolano CIの広告が最近でている

プロジェクトの追加

https://circleci.comGitHubアカウントでログイン後以下を行う。

circle_ci.png

ビルド一覧の説明

circle_ci_build.png

ビルドの方法

  • リポジトリのrootcircle.ymlを置く
  • circle.ymlにはテストするための準備(composerだったり、ddl流したり)やテストコマンドを記述する
  • PHPのバージョンなども指定できたりする
circle.yml
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はあるが、初期のdatabasetableの作成する部分がない。ただ、ddlがあるためそれを使用している。

build.png

実際の動きはこんな感じ。

  1. composer install
  2. database
  3. test

という順番で動いてる。

スクリーンショット 2016-05-09 15.43.41.png

テスト結果。

いつもは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が終わるのを待ちどうしくなった
8
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
10