Symfony勉強会 #6 Silexチュートリアル ファンクショナルテスト

2012年7月12日

symfony-logo

前回はSilexのCRUDアプリを作成しました。

symfony-logo
Symfony勉強会 #6 Silexチュートリアル

先日、Symfony勉強会 #6 Silexワークショップに参加しました。 Silexは全くの初心者だった私ですが、ワー ...

続きを見る

今回はこのアプリをファンクショナルテストでガードします。

目次

  1. PHPUnitのダウンロード
  2. ファンクショナルテストの記述
  3. PHPUnit実行ファイルを作成
  4. phpunit.xml.distを作成
  5. 動作確認
  6. ディレクトリ構成

PHPUnitのダウンロード

PHPUnitはPEARからインストールしても良いですが、せっかくなので、composerからダウンロードしてみます。ファンクショナルテストに必要なSymfonyコンポーネントも一緒にダウンロードします。

composer.jsonを下記のように編集します。

{
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear.symfony-project.com"
        },
        {
            "type": "pear",
            "url": "http://pear.phpunit.de"
        }
    ],
    "minimum-stability": "dev",
    "require": {
        "silex/silex": "1.0.*",
        "twig/twig": "1.8.*",
        "doctrine/dbal": "2.2.*",
        "doctrine/common": "2.2.*",
        "pear-phpunit/PHPUnit": "*",
        "symfony/browser-kit": "2.1.*",
        "symfony/dom-crawler": "2.1.*",
        "symfony/css-selector": "2.1.*"
    }
}

下記コマンドを実行してダウンロードします。

php composer.phar upate

ファンクショナルテストの記述

vendorと同じ階層にtestsフォルダを作成し、テストコードを記述します。

silex/tests/functional/MemberControllerTest.php

<?php
require_once __DIR__.'/../../vendor/autoload.php';

use Silex\WebTestCase;
class MemberControllerTest extends WebTestCase
{
    private $db;
    private $member;
    
    public function __construct()
    {
        $app = new Silex\Application();
        $app->register(new Silex\Provider\DoctrineServiceProvider(), array(
            'db.options' => array(
                'driver'   => 'pdo_mysql',
                'dbname'   => 'silex',
                'host'     => 'localhost',
                'user'     => 'admin',
                'password' => 'admin'
            ),
        ));
        $this->db = $app['db'];
        $this->db->exec("TRUNCATE TABLE member");
    }
    
    public function createApplication()
    {
        require __DIR__ . '/../../web/index.php';
        $app['debug'] = true;
        unset($app['exception_handler']);
        return $app;
    }
    
    public function testMemberRegistration()
    {
        $client = $this->createClient();
        $crawler = $client->request('GET', '/silex/web/member/register');
        $this->assertTrue($client->getResponse()->isSuccessful());
        $this->assertSame(1, $crawler->filter('title:contains("会員登録")')->count());
        $form = $crawler->filter('#register_submit')->form();
        $data = array(
            'member[email]' => 'sample@example.com',
            'member[password]' => 'sample',
        );
        $crawler = $client->submit($form, $data);
        $this->assertTrue($client->getResponse()->isSuccessful());
        $this->assertSame(1, $crawler->filter('title:contains("会員登録完了")')->count());
    }
}

PHPUnit実行ファイルを作成

PHPUnitの実行ファイルをvendorと同じ階層に作成します。

#!/usr/bin/env php
<?php
require_once __DIR__.'/vendor/autoload.php';
$paths = get_include_path();
foreach (glob(__DIR__.'/vendor/pear-phpunit/*') as $path) {
    $paths .= PATH_SEPARATOR . $path;
}
set_include_path($paths);
require_once 'PHPUnit/Autoload.php';
PHPUnit_TextUI_Command::main();

phpunit.xml.distを作成

phpunit.xml.distをvendorと同じ階層に作成します。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
>
    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

index.phpにルーティングの作成

なぜか / のルーティングが存在しないとエラーが出るので作成します。

// ...
$app->get('/', function() use($app) {
});
// ...

動作確認

作成したPHPUnit実行ファイルを下記のように実行します。

cd silex
phpunit

phpunitコマンドの引数にファイルを指定すると、そのテストだけ実行、省略するとすべてのテストが実行されます。phpunit.xml.distは同じ階層にあるので自動で読み込まれます。

実行結果は下記のようになります。

PHPUnit 3.6.10 by Sebastian Bergmann.
Configuration read from /Users/karasawa/Sites/silex/phpunit.xml.dist
.
Time: 0 seconds, Memory: 11.25Mb
OK (1 test, 4 assertions)

ディレクトリ構成

ディレクトリ構成は下記になります。参考までに。

silex
├── composer.json
├── composer.lock
├── composer.phar
├── phpunit
├── phpunit.xml.dist
├── tests
│   └── functional
│       └── MemberControllerTest.php
├── vendor
├── views
│   └── member
│       ├── finish.html.twig
│       └── register.html.twig
└── web
    └── index.php

次回はリファクタリングです。

symfony-logo
Symfony勉強会 #6 Silexチュートリアル リファクタリング

前回は、CRUDアプリをファンクショナルテストでガードしました。 今回は、index.phpに集中しているロジックをMV ...

続きを見る

-技術ブログ
-,