LoginSignup
36
39

More than 5 years have passed since last update.

ComposerでPHPUnitをインストールし、FuelPHPでユニットテストを行う

Posted at

概要

以下のページでセットアップした環境を前提としている。
http://qiita.com/uchiko/items/a5c2e45264963acc0e4a

oil経由でPHPUnitを実行できるように設定をする。

PHPUnitのインストール

composer.jsonを編集して、PHPUnitをインストールするように設定する。
また、Stagehand TestRunnerというのが便利らしいので、それもインストールする。

composer.json
    ...
    "require": {
        ...
        "phpunit/phpunit": "4.1.*",
        "piece/stagehand-testrunner": ">=3.5.0"
    },
    ...

以下のコマンドを実行するとインストールが始まる。

$ php composer.phar update

oilの設定変更

oilのデフォルト設定だと、phpunitコマンドへのパスが通っていない。
以下の手順で、oilの設定を変更する。

oil.phpをappディレクトリにコピーする。

$ cp fuel/packages/oil/config/oil.php fuel/app/config/

oil.phpに項目を以下のように設定する。

fuel/app/config/oil.php
'autoload_path' => '' ,
'binary_path' => DOCROOT.'fuel/vendor/bin/phpunit' ,

oilコマンド経由でテストが実行できるようになる。

テストを実行してみる

以下のコマンドで、FuelPHPのCoreのテストを走らせることができる。

$ php oil test --group=Core

いくつかテストが失敗するのだがいいのだろうか。

テストを書く

ここに記載しているコードは、
以下の書籍に載っているものを参考にさせていただきました。
http://tatsu-zine.com/books/fuelphp1st

以下のようにフィルタクラスを作成する。

fuel/app/classes/myinputfilters.php
<?php

class MyInputFilters
{
    // 文字エンコーディングの検証フィルタ
    public static function check_encoding($value)
    {
        // 配列の場合は再帰的に処理
        if (is_array($value))
        {
            array_map(['MyInputFilters', 'check_encoding'], $value);
            return $value;
        }

        // 文字エンコーディングを検証
        if (mb_check_encoding($value, Fuel::$encoding))
        {
            return $value;
        }
        else
        {
            // エラーの場合はログに記録
            static::log_error('Invalid character encoding', $value);
            // エラーを表示してシュル用
            throw new HttpInvalidInputException('Invalid input data');
        }
    }

    // エラーをログに記録
    public static function log_error($msg, $value)
    {
        Log::error(
            $msg . ': ' . Input::uri() . ' ' . urlencode($value) . ' ' .
            Input::ip() . ' "' . Input::user_agent() . '"'
        );
    }
}

以下のようにテストを書く。

fuel/app/tests/myinputfilters_Test.php
<?php

/**
 * MyInputFilters class Tests
 *
 * @group App
 */
class Test_MyInputFilters extends TestCase
{
    public function test_check_encoding_invalid_sjis()
    {
        $this->setExpectedException(
            'HttpInvalidInputException', 'Invalid input data'
        );

        $input = mb_convert_encoding('SJISの文字列です。', 'SJIS');
        $test = MyInputFilters::check_encoding($input);
    }

    public function test_check_encoding_valid()
    {
        $input = '正常なUTF-8の文字列です。';
        $test = MyInputFilters::check_encoding($input);
        $expected = $input;

        $this->assertEquals($expected, $test);
    }
}

以下のようにテストを実行する。

$ php oil test --group=App
Tests Running...This may take a few moments.
PHPUnit 4.1.1-2-ge93a391 by Sebastian Bergmann.

Configuration read from /home/uchiko/project/fuelphp-1.7/fuel/core/phpunit.xml

...............

Time: 1.32 seconds, Memory: 16.25Mb

OK (15 tests, 18 assertions)

できた。

参考

3分でできる FuelPHP 1.6 テスト環境
http://d.hatena.ne.jp/Kenji_s/20130214/fuelphp_test_env

36
39
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
36
39