17 November 2013

まずは導入してみよう

なぜ、テストコードを書くのか、テストコードはどう書くべきか、といった話はおいといて、今回はとにかくテストコードを書いて実行してみるということを目的とします。

PHPUnitのインストール(composer)

さっそくインストールからはじめましょう。
今回はタイトルにもあるようにSymfony2(2.3)環境にPHPUnit(3.7)を導入します。
composer.jsonに下記記述を追加し、updateすれば、インストールは完了です。

第3章 PHPUnit のインストール - phpunit

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}

さっそくやってみよう

はじめにこれを読みましょう。

ユニットテスト

下記のようなシンプルなクラスがあるとします。
年月を指定して、月初もしくは月末を取得するだけのクラスですが、実際に使う前に単体である何パターンかテストしておきたいところです。

<?php
namespace Sopra\CoreBundle\Helper;
use DateTime;

class DateTimeHelper {
    
    private function __construct() {  }
    
    public static function getFirstDayInMonth($year, $month) {
        
        return new DateTime("$year-$month-01");
    }
    
    public static function getLastDayInMonth($year, $month) {
        
        return new DateTime(date('Y-m-d', mktime(0,0,0, $month + 1, 0, $year)));
    }
}

そこで、下記のようなテストケースを作成します。

<?php
namespace Sopra\CoreBundle\Tests\Helper;

use Sopra\CoreBundle\Helper\DateTimeHelper;
use Sopra\CoreBundle\Tests\TestCase\BaseTestCase;

class DateTimeHelperTest extends BaseTestCase {
    
    public function testGetFirstDayInMonth() {
        
        $firstDay = DateTimeHelper::getFirstDayInMonth(2013, 1);
        $this->assertEquals('2013-01-01', $firstDay->format('Y-m-d'));
        
        $firstDay = DateTimeHelper::getFirstDayInMonth(2013, 12);
        $this->assertEquals('2013-12-01', $firstDay->format('Y-m-d'));
        
        $firstDay = DateTimeHelper::getFirstDayInMonth(2014, 3);
        $this->assertEquals('2014-03-01', $firstDay->format('Y-m-d'));
    }
    
    public function testGetLastDayInMonth() {
        
        $lastDay = DateTimeHelper::getLastDayInMonth(2012, 2);
        $this->assertEquals('2012-02-29', $lastDay->format('Y-m-d'));
        
        $lastDay = DateTimeHelper::getLastDayInMonth(2013, 2);
        $this->assertEquals('2013-02-28', $lastDay->format('Y-m-d'));
        
        $lastDay = DateTimeHelper::getLastDayInMonth(2013, 12);
        $this->assertEquals('2013-12-31', $lastDay->format('Y-m-d'));
    }
}

テストの実行

作成したテストを実行するために、phpunitコマンドを実行します。
phpunitコマンドについては、本家サイトに詳しい説明がありますので参照ください。

コマンドラインのテストランナー - PHPUnit

実際に上述のDateTimeHelperTestを実行してみると、下記のように出力されます。

$ cd bin
$ ./phpunit -c ../app/ ../src/Sopra/CoreBundle/Tests/Helper/DateTimeHelperTest.php
PHPUnit 3.7.27 by Sebastian Bergmann.

Configuration read from /path/to/Application Root/app/phpunit.xml

..

Time: 353 ms, Memory: 16.25Mb

OK (2 tests, 6 assertions)