CakePHP3とPHPUnitでControllerの単体テストを実施してみた

CakePHP3とPHPUnitでの単体テストコードの勉強をするために簡単なコードを書いて実施してみた。

環境
CakePHP 3.6.3
PHPUnit 5.7.27
PHP 7.0.27

UsersController.phpにsum()を追加する。
sum()はGETまたはPOSTから渡されるパラメータa、bの値を足し算する。

//UsersController.php
public function sum()
{
    $this->request->allowMethod(['post', 'get']);
    if($this->request->is('post')) {
        $a = $this->request->getData('a');
        $b = $this->request->getData('b');
    } elseif ($this->request->is('get')) {
        $a = $this->request->getQuery('a');
        $b = $this->request->getQuery('b');
    }
    $this->set('sum', $a + $b);
}

Controllerがsum()なのでsum.ctpテンプレートを追加する。

//Template/Users/sum.ctp
<?php
echo $sum;

UsersControllerTest.phpにはGETとPOST用のコードを作成する。
viewVariable()はControllerからset()した値を取得している。

//UsersControllerTest.php
public function testSumGet()
{
    $this->get('Users/sum?a=0&b=0');
    $sum = $this->viewVariable('sum');
    $this->assertEquals(0, $sum);

    $this->get('Users/sum?a=10&b=20');
    $sum = $this->viewVariable('sum');
    $this->assertEquals(30, $sum);

    $this->get('Users/sum?a=1000000&b=2000000');
    $sum = $this->viewVariable('sum');
    $this->assertEquals(3000000, $sum);
}

public function testSumPost()
{
    $this->post('Users/sum', ['a' => 0, 'b' => 0]);
    $sum =  $this->viewVariable('sum');
    $this->assertEquals(0, $sum);

    $this->post('Users/sum', ['a' => 10, 'b' => 20]);
    $sum =  $this->viewVariable('sum');
    $this->assertEquals(30, $sum);

    $this->post('Users/sum', ['a' => 1000000, 'b' => 2000000]);
    $sum =  $this->viewVariable('sum');
    $this->assertEquals(3000000, $sum);
}

PHPUnitを実行すると以下のような成功メッセージが出力される。

> php vendor\phpunit\phpunit\phpunit --coverage-html ./report.html tests\TestCase\Controller\UsersControllerTest.php

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
.. 2 / 2 (100%)

Time: 1.91 seconds, Memory: 12.00MB

OK (2 tests, 6 assertions)

Generating code coverage report in HTML format ... done

・途中で手が止まった点
testSumGet()とtestSumPost()の2つ目以降のテストがエラーになっていた。
メッセージを見るとControllerから受け取る$sumがnullになっていた。
原因はTemplate/Users/sum.ctpを作成していなかったため。
cli-error.logにテンプレートファイルが見つからないエラーが出ていた。

・今回解決できなかった点
UsersController.phpのsum()はGETとPOST以外は許容していない。
allowMethod()で指定したメソッド以外のアクセスは
500エラーが返るのでassertResponseFailure()を使ったテストコードを作った。
その結果、テストコードは成功した。
しかし、カバレッジレポートが生成されるがテストが通過したことにならなかった。

Macを使うようになって調べたショートカットなど

Macを使うようになってWindowsと違うところがあって調べたことを残しておく。

macOS:Sierra
MacBook Pro(15-inch, 2017)

・日本語入力にする。
Shift + control + J

・英数字入力にする。
Shift + control + ;

・コピー
command + C

・ペースト
command + V

・バックスラッシュ
option + ¥

・デスクトップを表示する
トラックパッド上で親指+3本(人差し指、中指、薬指)を広げる
Mac で Multi-Touch ジェスチャを使う – Apple サポート

・範囲を選択して画面キャプチャをする。
Shift + command + 4

PHPの公式サポートの状況を調べてみた

いま、PHPは5系と7系があるのはなんとなく知っていた。
けれど、詳しいバージョンとサポート終了日を知らなかったので調べてみた。

参考にしたページ
PHP: Supported Versions

Version Latest Release Active Support Security Support
5.6 2018/04/26 (5.6.36) 2017/01/19 2018/12/31
7.0 2018/04/26 (7.0.30) 2017/12/03 2018/12/03
7.1 2018/06/22 (7.1.19) 2018/12/01 2019/12/01
7.2 2018/06/21 (7.2.7) 2019/11/30 2020/11/30

Active Supportの日付はバグやセキュリティーの問題があればその日まではサポートしてくれる締切日。
Security Supportの日付は重大なセキュリティーの問題のみその日まではサポートしてくれる締切日。

5.6と7.0は今年中で終了。7.1も来年で終了してしまう。
7.3はまだアルファ版なので、今からPHPのバージョンを変えるとすると7.2か。