Modern Testing in PHP な Codeception を触ってみた2

## はじめに

恐れ入りますがコード量が多いため、記事を2個に分けて書きました。

* 1個目は「インストールから Acceptance Test を動かすところまで」
* 2個目は「Acceptance Test のサンプルと Codeception の導入状況や、情報など」

この記事は **Modern Testing in PHP な Codeception を触ってみた2** になります。
Modern Testing in PHP な Codeception を触ってみた1 は以下になります。
http://qiita.com/livejam_db/items/c991b00e606f50246bfe

## Acceptance Test のサンプル

わりと説明省いてもコードを見たほうがわかりやすいかなと思ったので
簡単なサンプルを作ってみました。
プロジェクトルートに index.php を作って、それをテストしてみます。

~~~index.phtml
<?php
$username = 'ゲスト';
if (isset($_POST['username']) && !empty($_POST['username'])) {
$username = $_POST['username'];
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>Codeceptionを触ってみた</h1>
    <h2>Codeceptionの特徴は？</h2>
    <a id="cept-link" href="http://codeception.com/">ここに詳細があります</a>
    <hr>
    <h2>Codeceptionでフォーム周り</h2>
    <form action="index.php" method="post">
        <input type="text" name="username">
        <input type="submit" value="クリック">
    </form>
    <div class="result">
        <?php echo 'こんにちは'.htmlspecialchars($username).'さん'; ?>
    </div>
</body>
</html>
~~~

~~~_bootstrap.php
<?php
// Here you can initialize variables that will for your tests
$username = 'hoge';
~~~

~~~ExampleCept.php
<?php
$I = new WebGuy($scenario);
$I->wantTo('Codeceptionで何ができるか確認');
$I->amOnPage('/');
$I->see('Codeceptionを触ってみた', 'h1');
$I->see('Codeceptionの特徴は？', 'h2');
$I->seeLink('ここに詳細があります');
$I->click('#cept-link');

$I->amOnSubdomain('codeception');
$I->see('Modern Testing in PHP');
$I->click('PhpBrowser', 'ul.dropdown-menu > li > a');
$I->seeInCurrentUrl('/docs/modules/PhpBrowser');
$I->see('PhpBrowser Module', 'h1');

$I->moveBack();
$I->moveBack();
$I->amOnSubdomain('localhost');
$I->see('Codeceptionを触ってみた', 'h1');

$I->see('こんにちはゲストさん', '.result');
$I->fillField('username', $username);
$I->click('クリック');
$I->dontSee('こんにちはゲストさん', '.result');
$I->see('こんにちは'.$username.'さん', '.result');
~~~

--steps オプションをつけて、各シナリオを表示しつつ、実行した結果は以下

~~~
php codecept.phar run acceptance --steps
~~~

~~~
Codeception PHP Testing Framework v1.6.3.1
Powered by PHPUnit 3.7.21 by Sebastian Bergmann.

Suite acceptance started
Trying to codeceptionで何ができるか確認 (ExampleCept.php)
Scenario:
* I am on page "/"
* I see "Codeceptionを触ってみた","h1"
* I see "Codeceptionの特徴は？","h2"
* I see link "ここに詳細があります"
* I click "#cept-link"
* I am on subdomain "codeception"
* I see "Modern Testing in PHP"
* I click "PhpBrowser","ul.dropdown-menu > li > a"
* I see in current url "/docs/modules/PhpBrowser"
* I see "PhpBrowser Module","h1"
* I move back 
* I move back 
* I am on subdomain "localhost"
* I see "Codeceptionを触ってみた","h1"
* I see "こんにちはゲストさん",".result"
* I fill field "username","hoge"
* I click "クリック"
* I don't see "こんにちはゲストさん",".result"
* I see "こんにちはhogeさん",".result"
  OK



Time: 1 second, Memory: 12.25Mb

OK (1 test, 10 assertions)
~~~

シナリオがひとつひとつ表示されて何をテストしているかわかりやすいかなと思います。
あと、ここではわかりませんが、ところどころ色付けもされています ( Mac の場合) 。

## 各モジュールについて

今回のテストは モジュールに PhpBrowser を使用していますが、
acceptance.suite.yml で、例えば Selenium2 に簡単に変更することもできたり、
Laravel4, Kohana, Symfony, ZF, Yii などの
各PHPフレームワークに対応させて使用したりもできるみたいです 
( 自分はまだ触っていないのでなんとも言えませんが ) 

## Codeception の導入状況や、情報など

現在自分が知っている限りの情報になりますが、
Yii2 で導入予定だったり、

また日本語情報としては Laravel Testing Decoded の日本語版にも詳しく載っているみたいです。
https://leanpub.com/laravel-testing-decoded-japanese

## まとめ

とりあえず Codeception で簡単なテストサンプルを書いてみました。
まだまだ触りはじめで、機能としてはごく一部しか紹介していませんが、
多分今後日本でも流行りそうな予感があるので、かしこい人もっと日本語情報下さい ...