EC-CUBEのSymfony検証ブランチでcodeceptionを走らせる手順

EC-CUBEの検証ブランチでcodeceptionを走らせる手順をメモ
困ったkとがあったら追記して行きます。

# 手順

## codeceptionのリポジトリをclone
リポジトリは[こちら](https://github.com/EC-CUBE/eccube-codeception)

## `.env` の調整
`.env` でテスト対象のソースを指定できる。

例えば `https://github.com/okazy/ec-cube.git` リポジトリの `styleguide-category` ブランチをテストしたいときは以下のように書き換える

```
ECCUBE_BRANCH=styleguide-category
ECCUBE_REPOS=https://github.com/okazy/ec-cube.git
```

## ビルド

```
docker-compose -f docker-compose.yml -f docker-compose.chrome.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml build --pull --no-cache
```

`--no-cache` をつけないと２回目以降キャッシュからビルドされるので本体のソースコードの変更が反映されない。

## 実行

```
docker-compose  -f docker-compose.yml  -f docker-compose.chrome.yml -f docker-compose.pgsql.yml -f docker-compose.dev.yml run --rm codecept run -d --env chrome,pgsql --coverage --coverage-html --coverage-xml --html report.html acceptance EA01TopCest:topページ_初期表示
```

`EA01TopCest:topページ_初期表示` の部分を変更することで実行対象のclassやmethodを指定できる。

## 実行結果を確認

実行結果は以下のディレクトリに出力される。

```
eccube-codeceptionのリポジトリ/tests/_output
```

結果のまとめは以下のhtmlをブラウザで表示することで確認できる。

```
eccube-codeceptionのリポジトリ/tests/_output/report.html
```

## 実際のEC-CUBEを触って確認

以下で確認可能

http://127.0.0.1:8080/

## 実行画面確認

codeceptionの実行時にVNCで実行時の画面が確認できる。
Macでは以下のコマンドでVNCが起動できる。

```
open vnc://:secret@localhost:5900
```

## 起動中のdockerを停止

以下のコマンドで起動中のdockerを停止できる。

```
docker-compose down -v -t 0
```

`down` は `stop` と `rm` ができるコマンド。
`-v` オプションでvolumeも一緒に削除してくれる。
`-t 0` オプションでdockerの状態を待たずに直ちに実行できる。

# ソースコードを更新した時の再実行の手順

## codeceptionのソースコードを更新した

[こちら](#%E5%AE%9F%E8%A1%8C)の `docker-compose run` からでOK
codeceptionのdockerは毎回実行時に作成される。

## EC-CUBE本体のソースコードを変更した

### ローカルのリポジトリをマウントする（おすすめ）

ローカルのEC-CUBEのリポジトリをDocker内のEC-CUBEのソースにマウントする設定を追加する。
codeceptionのリポジトリ直下に `docker-compose.local.yml` ファイルを作成する。
EC-CUBEのリポジトリへのpathは適宜書き換えてください。

```yml:docker-compose.local.yml
version: "2"
services:
  eccube3:
    volumes:
      - /path/to/ec-cube/app:/var/www/html/app:cached
      - /path/to/ec-cube/src:/var/www/html/src:cached
      - /path/to/ec-cube/html:/var/www/html/html:cached
```

runコマンドに `-f docker-compose.local.yml` オプションをつけて実行する。
こうするとローカルのソースコードの変更がDocker内のコードにリアルタイムに反映される。
ただし、書き換えるコードによってはキャッシュを削除する必要があるので注意が必要。

### 再ビルド

[こちら](#ビルド)の `docker-compose build` から再実行が必要
EC-CUBEのソースはbuild時にcloneされるためimageを作り直す必要がある。
実行時は`--no-cache` オプションを忘れないように。

### `docker ssh` してソースを書き換える

部分的に変更するだけなら 'docker ssh` でeccubeのdockerにアクセスして直接ソースを書き換えることもできる。
こちらの場合はdockerにviがデフォルトで入っていないのでapt-getでviをインストールするところからする必要がある。

# 困った時は以下もご確認ください

## codeceptionのキャッシュ削除

実行時に以下のようなエラーが出た。

```
In SaveEventSubscriber.php line 49:

  [Symfony\Component\Debug\Exception\FatalThrowableError]
  Type error: Argument 1 passed to Eccube\Doctrine\EventSubscriber\SaveEventSubscriber::__construct() must be an instance of Eccube\R
  equest\Context, instance of Eccube\Application given, called in /var/www/var/cache/test/ContainerDfqzc3l/EccubeTestProjectContainer
  .php on line 1715
```

codeceptionのキャッシュが残ってしまっていたので以下の手順で削除するとエラーは解消した。

1. DockerのVolumeを確認
  - `docker volume ls`
1. codeceptionのキャッシュのVolume `eccubecodeception_codecept_eccube_var` を削除
  - `docker volume rm eccubecodeception_codecept_eccube_var`
1. もう一度codeceptionを実行

## volumがたまってしまったら削除

PostgreSQLのvolume（volume名がハッシュのような文字列となっているもの）はrunの時に毎回作成されるので消すのをミスるとたまり続ける。
不要なもので、Discを圧迫してしまうので気づいたら消しておこう。

```
docker volume ls
docker volume rm $(docker volume ls -q | grep -E '.{64}')
docker volume ls
```

## imagesがたまるので削除

buildするたびにEC-CUBEをcloneしてくるのでimagesがたまり続けてしまう。
以下のコマンドで古いimagesを削除できる。

```
docker images -a
docker rmi $(docker images -f 'dangling=true' -q)
docker images -a
```