PHPUnit.

CakePHP3でのPHPUnitを使った単体試験.

PHPUnitインストール

前提事項としてプロジェクト配下に、composer.pharが存在すること.

Windows環境で無い場合、以下コマンド実行でComposerを取得可能.

php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

以下コマンドを実行して、CakePHP3プロジェクト中にPHPUnitを導入する.

//Composer経由でPHPUnitインストール
php composer.phar require --dev phpunit/phpunit:"^5.7|^6.0"

//CakePHP3.4.1よりも前の場合
php composer.phar require --dev phpunit/phpunit:"<6.0"

以下コマンドでPHPUnitが実行可能か確認.

vendor/bin/phpunit

//実行結果
PHPUnit 4.8.35 by Sebastian Bergmann and contributors.

......

Time: 4.12 seconds, Memory: 13.00MB

OK (6 tests, 34 assertions)

上記のような実行結果が表示されれば、PHPUnitは利用可能.

ControllerでのPHPUnit

bakeコマンドでControllerクラスを作成すると、Testクラスも自動生成される.

//Windowsでの実行時は[/]を[\]に置き換える
bin/cake bake controller XXX

//SampleController.phpを作る
bin/cake bake controller Sample

画面上に適当な文字(Hello World)が表示されるようにviewを用意する.

view表示が可能かどうかテスト

view上に[Hello World]が表示されているか確認.

尚、routesはDocumentRoot/sampleとする.

namespace App\Test\TestCase\Controller;

use Cake\TestSuite\IntegrationTestCase;

/**
 * App\Controller\SampleController Test Case
 */
class SampleControllerTest extends IntegrationTestCase
{
    public function testIndex()
    {
        $this->get('/sample');
        $this->assertResponseOk();
        $this->assertTemplate('index');
        $this->assertResponseContains('Hello World');
    }   
}

12行目でGETリクエストを投げ、指定メソッドを呼んでいる.

13行目でレスポンスコードが2xxであるかチェック.

14行目で指定のテンプレートが呼び出されたかチェック.

15行目でレスポンス内容に[Hello World]が含まれているかチェック.

最低限13行目だけで良いと思うけど、アサーションメソッドの詳細は以下参照↓↓↓

アサーションメソッド

view表示が不可能であることのテスト

アクセスNG画面にアクセスできないことを確認する時など利用.

class SampleControllerTest extends IntegrationTestCase
{
    public function testIndex()
    {
        $this->get('/sample');
        // 5xx レスポンスコードをチェック
        $this->assertResponseFailure();
    }
    
}

例外など起きると、レスポンスに500系が返ってくる.

ShellでのPHPUnit

bakeコマンドでShellクラスを作成すると、Testクラスも自動生成される.

ただし公式ページでもコンソール試験は紹介されてないので、やる必要ないかも...

class SampleShellTest extends TestCase
{

    public $io;
    public $Sample;

    public function setUp()
    {
        parent::setUp();
        $this->io = $this->getMockBuilder('Cake\Console\ConsoleIo')->getMock();
        $this->Sample = new SampleShell($this->io);
    }

    public function tearDown()
    {
        unset($this->Sample);
        parent::tearDown();
    }

    public function testIndex()
    {
        $this->Sample->runCommand([]);
    }
}

一応runCommandでコンソール実行させることが出来る.

Fin.