EC-CUBEのプラグインをクロスプラットフォームで継続的にテストする

2019年4月22日

EC-CUBEは、システム要件が広いです
・PHP5.2~
・Windowsサーバー、Linuxサーバー
・PostgreSQL、MySQL

その他プラグインをインストール可能なバージョンがたくさん
2.12.0〜2.12.6
2.13.0~2.13.2
その他多言語版もあり。。

必然的に人力でのテストがとても大変。。
自分は基本MySQLでしかテストせず、怪しい時だけPostgreSQLを立ち上げてそこでもテストしますが非常にめんどくさい。。
というわけで自動化出来そうなところを自動化してみました

最終的には

Travis_CI_-_Free_Hosted_Continuous_Integration_Platform_for_the_Open_Source_Community

こんな感じで、必要条件のマトリクスを作ったテストが可能になります
・PHP5.4~5.6
・PostgreSQL、MySQL
・EC-CUBEの各バージョン(今のところ2.12.6と2.13.2)、ただし多言語版はなんか動かなかったのでやめました

1.テストを作る

Codeceptionを使います
プラグインを開発している環境で、Modern PHP Testing Framework “Codeception” を使って簡単なブラウザテストをする | のぶろぐ を参考に動作確認ができるテストを書きましょう

プラグインの内容にもよると思いますが、最初は「プラグインをインストールしても対象のページでシステムエラーが出ない」ぐらいの内容で構わないと思います

2. .travis.ymlを作成する

手元の環境でテストが動いたら、Travis CIを使ってマルチ環境でのテストが出来るようにします。
プライベートリポジトリの場合は、CircleCIMagnum CIを使えばいいと思いますが、基本は一緒なのでtravis.ymlで説明します

# for travis-ci
# see also. https://travis-ci.org
# http://nob-log.info/
language: php

php:
    - 5.6
    - 5.5
    - 5.4

env:
    global:
        - DBNAME=myapp_test HTTP_URL=http://localhost:8000 HTTPS_URL=https://localhost:8000 PLUGIN_CODE=[自身のプラグインのコード]
    matrix:
        - VER=eccube-2.13.2 DB=mysql USER=root DBPASS=' ' DBUSER=root
        - VER=eccube-2.13.2 DB=pgsql USER=postgres DBPASS=password DBUSER=postgres
        - VER=eccube-2.12.6 DB=mysql USER=root DBPASS=' ' DBUSER=root
        - VER=eccube-2.12.6 DB=pgsql USER=postgres DBPASS=password DBUSER=postgres
        #- VER=eccube-2.12.6en-p1 DB=mysql USER=root DBPASS=' ' DBUSER=root
        #- VER=eccube-2.12.6en-p1 DB=pgsql USER=postgres DBPASS=password DBUSER=postgres

before_script:
    - mkdir -p .${PLUGIN_CODE} 
    - mv * .${PLUGIN_CODE}
    - mv .${PLUGIN_CODE} ${PLUGIN_CODE}
    - curl -s -f -L https://github.com/nobuhiko/EC-CUBE/archive/${VER}.tar.gz | tar xvz -C ./
    - mv EC-CUBE-${VER} ec-cube
    - git clone --depth=1 https://github.com/nobuhiko/ec-cube-plugin-install-script ec-cube/ec-cube-plugin-install-script
    - mkdir -p ec-cube/data/downloads/plugin/${PLUGIN_CODE}
    - mv ${PLUGIN_CODE} ec-cube/data/downloads/plugin
    - cd ec-cube
    - curl -s -f -L https://raw.githubusercontent.com/nobuhiko/EC-CUBE/develop/eccube_install.sh -O
    - export DISPLAY=:99.0
    - sh -e /etc/init.d/xvfb start
    - php -S localhost:8000 -t html/ &
    - sh -c "if [ '$DB' = 'mysql' ]; then sh ./eccube_install.sh mysql; fi"
    - sh -c "if [ '$DB' = 'pgsql' ]; then sh ./eccube_install.sh pgsql; fi"
    - cd ec-cube-plugin-install-script
    - php plugin_install.php -e
    - cd ../data/downloads/plugin/${PLUGIN_CODE}/
    - sh -c "if [ '$DB' = 'mysql' ]; then mysql myapp_test < tests/_data/dump.sql; fi"
    - sh -c "if [ '$DB' = 'pgsql' ]; then psql myapp_test < tests/_data/dump.sql -U postgres; fi"
    - curl -s http://getcomposer.org/installer | php
    - php composer.phar install --dev --no-interaction
    - '[[ "$TRAVIS_PHP_VERSION" == "5.3" ]] || php vendor/bin/codecept build'

script:
    - '[[ "$TRAVIS_PHP_VERSION" == "5.3" ]] || php vendor/bin/codecept run --env travis --steps'

① PLUGIN_CODEを変更する

EC-CUBEにインストールされた時に、 downloads/plugin 以下に作成されるディレクトリ名です

②tests/_data/dump.sqlにSQLを書く

このプラグインを有効化にした後にSQL操作が必要な場合、そのSQLを書いておく
例えばパンくずプラグインの場合は、ブロックをレイアウトに配置する必要があるのでそのSQLを書いてあります

※プラグインを有効化するところまでは済んでいる状態なのでその後に必要なことのみ書いてください
※PosgreSQL、MySQLどちらでも動く標準化されたSQLを書く必要があります。分ける場合はここを変更してください

    - sh -c "if [ '$DB' = 'mysql' ]; then mysql myapp_test < tests/_data/dump.sql; fi"
    - sh -c "if [ '$DB' = 'pgsql' ]; then psql myapp_test < tests/_data/dump.sql -U postgres; fi"

3. acceptance.suite.ymlに追記する

# Codeception Test Suite Configuration

# suite for acceptance tests.
# perform tests in browser using the WebDriver or PhpBrowser.
# If you need both WebDriver and PHPBrowser tests - create a separate suite.

class_name: AcceptanceTester
modules:
    enabled:
        - PhpBrowser
        - AcceptanceHelper
    config:
        PhpBrowser:
            url: '[普段テストしている環境のURL]'
#以下を追記
env:
    travis:
        modules:
            config:
                PhpBrowser:                     
                    url: 'http://localhost:8000/'

travisでは、ビルトインサーバーでテストするのでその環境を追記してください。

3. push

あとは、全部コミットしてpushするだけ!
※Travis CIの設定は事前にしておいてくださいね
Travis CIに入門してPHPプロジェクトのCI / 継続的デリバリ環境を整える | のぶろぐ

これだけでTravis CI上で、複数環境のテストが完了するはずです
プラグインのメンテに苦労している人、受け入れテストに苦労している人参考にしてみてください(ΦωΦ)

githubにリポジトリ公開してますのでこちらも参考にしてください
ECCUBE-Plugin-BreadcrumbList/tests at master · nobuhiko/ECCUBE-Plugin-BreadcrumbList