LoginSignup
10
10

More than 5 years have passed since last update.

CodeceptionをDockerでもCIでも動かしてみる

Last updated at Posted at 2016-07-19

はじめに(2018-03-21 更新)

2016年7月、Symfony Meetup #13での@ksetaさんのLTに触発されて、Codeceptionをとにかく動かしてみました。
お急ぎの方は、exampleを作りましたので、cloneするなりして動かしみてください。
https://github.com/imunew/docker-codeception-example (2018−03−21更新)

構成

ざっくりと構成は以下のとおりです。

  • Webアプリケーションは、Symfony Demo Applicationをそのまま利用
  • Codeceptionのコードは、Codeception/symfony-demoを参考に
  • 受入テスト(Acceptance tests)のみを対象に
  • PHPBrowserではなく、WebDriver + chromedriver

Docker環境(2018-03-21 更新)

ざっくりと構成は以下のとおりです。

主要なファイルは下記のとおり。

docker-compose.yml
version: '3.2'
services:
  php:
    build: ./docker/php
    volumes:
      - ./:/var/www/symfony.demo
    working_dir: /var/www/symfony.demo
    ports:
      - "80:80"
    networks:
      main:
        aliases:
          - symfony.demo

  selenium:
    image: 'selenium/standalone-chrome-debug'
    volumes:
      - ./:/data
    ports:
      - "4444:4444"
      - "5900:5900"
    privileged: true
    networks:
      main:
        aliases:
          - selenium.demo

networks:
  main:

FROM php:7-apache

ENV DEBIAN_FRONTEND noninteractive

RUN a2enmod rewrite

RUN apt-get update && apt-get install -y git zlib1g-dev libicu-dev g++ vim

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer

RUN docker-php-ext-configure intl
RUN docker-php-ext-install intl

ADD date.ini /usr/local/etc/php/conf.d/date.ini

ADD ./symfony-demo.conf /etc/apache2/sites-available/symfony-demo.conf
RUN a2ensite symfony-demo.conf
RUN a2dissite 000-default.conf

EXPOSE 80

VNCでブラウザの動きを確認しながらテスト実行

READMEにも書きましたが、selenium/standalone-chrome-debugは、VNCサーバーがセットアップされているので、Mac標準のVNCクライアントから接続して、ブラウザの動きを確認しながらテスト実行することができます。

codeception-demo.gif

ハマったところ(解決済み 2018-03-21更新)

相互参照になる場合は、networksを使うことで回避することが可能です。
下記のブログが参考になりました。

seleniumコンテナにextra_hostsを追加してますが、この部分が解決できず、10時間ほど費やしてしまった気がします。

  • chromeブラウザから、http://symfony.demoにアクセスできないといけないので、seleniumコンテナ/etc/hostsでホスト名を解決する必要あり
  • phpコンテナから、seleniumコンテナをlinkしているので、その逆をしようとすると、循環参照になってしまうとのことでエラーになる
  • 本当はextra_hostsに内部IPを書きたくない。誰かスマートなやり方教えてください。

CI環境(v1からv2に 2018-03-21更新)

ざっくりと構成は以下のとおりです。

  • circle-ciを利用
  • Dockerコンテナと違い、All-In-One構成
  • ChromeDriverはインストール済み
  • Seleniumは、ダウンロード&インストール&バックグラウンド実行
  • ローカル同様、CI上でもdocker-composeを利用
.circleci/config.yml
version: 2
jobs:
  build:
    machine: true
    working_directory: ~/project
    steps:
      - checkout
      - run:
          name: Install Docker Compose
          command: |
            pip install --upgrade pip
            pip install docker-compose
      - run:
          name: Setup environment
          command: |
            docker-compose up -d --build
            docker-compose exec php composer install --no-interaction
            docker-compose exec php bin/console cache:clear --env=prod --no-debug
            docker-compose exec php chmod -R a+w var/cache var/sessions
      - run:
          name: Run tests
          command: |
            docker-compose exec php bin/codecept run acceptance
            cp -R tests/_output /tmp/artifacts/
      - store_artifacts:
          path: /tmp/artifacts

ハマったところ(2018-03-21更新)

  • Seleniumはインストール済みってしばらく勘違いしてた
  • Codeceptionのverboseでは、アプリが動かない原因はよく分からない
  • xdebug有効にしてると、./tests/_output/XxxxxCept.fail.pngにエラーの詳細が表示されているので助かった
  • 困ったら、Rebuild with SSHでコンテナにログインしてデバッグ

これから試したいこと

おわりに(2018-03-21更新)

Nightmare(v2)で消耗気味なので、別の候補を探している最中ではありますが、少なくてもSelenium系にはしたいと考えています。
Codeceptionは、多少、独特のルールがありますが、普段PHPでサーバーサイドのコードを書いているエンジニアでもとっつきやすいと感じました。
Codeceptionの中身については、また別の投稿で書ければと思います。

10
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
10
10