CircleCIでFuelPHPのテスト自動化

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

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

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


構成

- FuelPHP 1.7
- PHP 5.6

# CircleCIとは？
他の人の見た方が早いので簡単に・・・

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

## プロジェクトの追加
https://circleci.com に`GitHub`アカウントでログイン後以下を行う。


![circle_ci.png](https://qiita-image-store.s3.amazonaws.com/0/9782/d0dc9eab-c7ea-48d9-b2ad-50a0f200b0fd.png "circle_ci.png")



## ビルド一覧の説明
![circle_ci_build.png](https://qiita-image-store.s3.amazonaws.com/0/9782/eb275b5b-6ebd-1f43-b408-b2458e6d85da.png "circle_ci_build.png")


## ビルドの方法

- リポジトリの`root`に`circle.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`はあるが、初期の`database`や`table`の作成する部分がない。ただ、`ddl`があるためそれを使用している。

![build.png](https://qiita-image-store.s3.amazonaws.com/0/9782/16fcd80f-1dc4-05cf-68a4-789af59610f6.png "build.png")



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

1. composer install
2. database
3. test

という順番で動いてる。

![スクリーンショット 2016-05-09 15.43.41.png](https://qiita-image-store.s3.amazonaws.com/0/9782/f91996c7-9cfe-ffae-3e84-33c8a6fe83d5.png "スクリーンショット 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が終わるのを待ちどうしくなった