Modern PHP Testing Framework “Codeception” を使って簡単なブラウザテストをする

Modern PHP Testing Framework “Codeception” を使って簡単なブラウザテストをする

画面が正しく表示されているのか、を確認したいときにSeleniumを使うのは大変だなーと調べていたらCodeceptionを見つけました

Codeception PHP Testing Framework is designed to work just out of the box. This means its installation requires minimal steps and no external dependencies preinstalled (except PHP, of course). Only one configuration step should be taken and you are ready to test your web application from an eye of actual user.

だそうです。

導入は簡単、Quick Start Codeceptionの通りにするだけです

1. Download

~~~
php composer.phar require “codeception/codeception:*”
~~~
Quick Startには codecept.phar を直接取って来る方法が載っていますが、他との連携も考えるとcomposerを使っておくほうがいいんじゃないかと思います

2. Install

~~~
php ./vendor/bin/codecept bootstrap
~~~
codeception.yml と tests ディレクトリーが作られます
ここでtestsディレクトリーの名前を変えたりは出来ないようです。。(あとからはたぶん出来ます)

3. Create Test

~~~
php ./vendor/bin/codecept generate:cept acceptance Welcome
~~~
acceptanceというのが、ブラウザテストの事です

4. Write Basic Test

tests/acceptance/WelcomeCept.phpが作成されているので、このファイルを編集します
~~~
wantTo(‘ensure that frontpage works’);
$I->amOnPage(‘/’);
$I->see(‘Home’);
~~~

/ のパスに Home という文字があるかどうか、をテストするという内容になります。
日本語も試しましたが普通に大丈夫でした

他にも
~~~
$I->seeElement(‘#id’);
$I->dontSeeElement(‘.class’);
~~~
など、文字を見るだけで何をしているのかがわかってわかりやすいですね

5. Configure Acceptance Tests

テストを実行するための設定ファイルがあるのでこれを修正します

tests/acceptance.suite.yml
~~~
class_name: AcceptanceGuy
modules:
enabled: [PhpBrowser, AcceptanceHelper]
config:
PhpBrowser:
url: ‘{YOUR APP’S URL}’
~~~
{YOUR APP’S URL} をlocalhost:8000にしておけば、ビルトインサーバーでテストが出来ます

引数によって挙動を変えたい場合などはenvを使うことも出来ます

~~~
class_name: WebGuy
modules:
enabled:
– PhpBrowser
– WebHelper
config:
PhpBrowser:
url: ‘http://localhost:8080/’

env:
homuhomu:
modules:
config:
PhpBrowser:
url: ‘http://localhost/’
~~~
envはrunの時に足せば有効に
~~~
run –env homuhomu
~~~

6. Run!

あとは実行するだけ、簡単!
~~~
php ./vendor/bin/codecept run

Suite acceptance started
Trying to ensure that frontpage works (WelcomeCept.php) – Ok
Suite functional started
Suite unit started

Time: 1 second, Memory: 21.00Mb
OK (1 test, 1 assertions)
~~~
その他コマンドの説明はリファレンスがそこそこしっかり書かれています
Console Commands – Codeception – Documentation

ここからはおまけ
せっかくテストを書いたのでTravis CIでも実行されるようにしましょう

7. Travis CI

.travis.ymlを編集
~~~
language: php

php:
– 5.6
– 5.5
– 5.4
– 5.3

before_script:
– export DISPLAY=:99.0
– sh -e /etc/init.d/xvfb start
– curl -s http://getcomposer.org/installer | php
– php composer.phar install –dev –no-interaction
– php -S localhost:8080 -t html/ &
– ‘[[ “$TRAVIS_PHP_VERSION” == “5.3” ]] || php vendor/bin/codecept build’

script:
– ‘[[ “$TRAVIS_PHP_VERSION” == “5.3” ]] || php vendor/bin/codecept run’
~~~

PHP5.3だと動かないので、5.3の場合は実行しない

export DISPLAY=:99.0
sh -e /etc/init.d/xvfb start
をして、ブラウザからのテストを受け付けるように

php -S localhost:8080 -t public_html/ &
ビルトインサーバーをバックグラウンドで実行

ハマったポイント
ローカルでは、codecept.pharを使い、Travis CIではcomposerを使ったらエラーが出てbuildでエラー
~~~
[Codeception\Exception\Configuration]
Asserts could not be found and loaded
~~~

runでもエラーが出てテストが動かず意味がわからん感じになりました。
~~~
Codeception PHP Testing Framework v1.8.7
Powered by PHPUnit 3.7.37 by Sebastian Bergmann.
PHP Fatal error: Class ‘Codeception\Actor’ not found in /home/travis/build/nobuhiko/EC-CUBE/tests/acceptance/AcceptanceTester.php on line 25
PHP Stack trace:
PHP 1. {main}() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/codecept:0
PHP 2. Symfony\Component\Console\Application->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/codecept:29
PHP 3. Symfony\Component\Console\Application->doRun() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:124
PHP 4. Symfony\Component\Console\Application->doRunCommand() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:193
PHP 5. Symfony\Component\Console\Command\Command->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:889
PHP 6. Codeception\Command\Run->execute() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:252
PHP 7. Codeception\Command\Run->runSuites() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Command/Run.php:93
PHP 8. Codeception\Codecept->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Command/Run.php:125
PHP 9. Codeception\Codecept->runSuite() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Codecept.php:131
PHP 10. Codeception\SuiteManager->__construct() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Codecept.php:145
PHP 11. require_once() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/SuiteManager.php:50
Fatal error: Class ‘Codeception\Actor’ not found in /home/travis/build/nobuhiko/EC-CUBE/tests/acceptance/AcceptanceTester.php on line 25
Call Stack:
0.0004 255304 1. {main}() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/codecept:0
0.0327 2917656 2. Symfony\Component\Console\Application->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/codecept:29
0.0380 3336384 3. Symfony\Component\Console\Application->doRun() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:124
0.0382 3337224 4. Symfony\Component\Console\Application->doRunCommand() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:193
0.0383 3337648 5. Symfony\Component\Console\Command\Command->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Application.php:889
0.0389 3342296 6. Codeception\Command\Run->execute() /home/travis/build/nobuhiko/EC-CUBE/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:252
0.0770 5844784 7. Codeception\Command\Run->runSuites() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Command/Run.php:93
0.0770 5845336 8. Codeception\Codecept->run() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Command/Run.php:125
0.0818 5849528 9. Codeception\Codecept->runSuite() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Codecept.php:131
0.0830 5974688 10. Codeception\SuiteManager->__construct() /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/Codecept.php:145
0.0866 6373552 11. require_once(‘/home/travis/build/nobuhiko/EC-CUBE/tests/acceptance/AcceptanceTester.php’) /home/travis/build/nobuhiko/EC-CUBE/vendor/codeception/codeception/src/Codeception/SuiteManager.php:50
~~~

ハマったポイント②
tiger-seo/PhpBuiltinServer
ビルトインサーバーを使うなら、これを使いなよ、と書いてあったので試したけど静的なものは表示できるが、phpは動いていないという不可思議な状態に。。
使い方が悪いんだろうか?

というわけで、Codeceptionを使った簡単ブラウザテストでした
CodeceptionはSeleniumを使ったテストも出来るし、PHPUnitを使ったUnitテストも出来るので使いこなすと便利そうです