初期設定

ComposerでCakePHPをインストールした場合はそのままでもUnitTestが使用できる状態ですが、データベース設定の確認だけしておきましょう。
テストで使用するデータベースは実際のデータベースを分けておいた方がいいです。

config/app_local.php
'Datasources' => [
'test' => [
'driver' => Sqlite::class,
'database' => ROOT . DS . 'database' . DS . 'test.sqlite',
],
],

app_local.phpがない場合はapp.phpに設定してください。

簡単なコンポーネントのテスト

いきなりコントローラーとかモデルをテストしようと思うと、ちょっとハードル高い気がするので、簡単なコンポーネントを作成してテストコードを書いてみましょう。

Bakeで作成するとコンポーネントファイルと同時にテストファイルも生成してくれます。

$ cake bake component Calc

足し算と引き算を行うという実用性ないコンポーネントを作ってみました。

src/Controller/Component/CalcComponent.php
namespace App\Controller\Component;
use Cake\Controller\Component;
class CalcComponent extends Component
{
public function add(int $num1, int $num2): int
{
return $num1 + $num2;
}
public function diff(int $num1, int $num2): int
{
return $num1 - $num2;
}
}

これをコントローラーで使う場合は次のようになります。

$this->loadComponent('Calc');
$this->Calc->add(2,4); // 6
$this->Calc->diff(2,4); // -2

次に作成したコンポーネントのテストコードです。
Bakeで作成した場合は雛形ができているはずなので、最後のtestAddの部分だけ追加してください。

tests/TestCase/Controller/Component/CalcComponentTest.php
namespace App\Test\TestCase\Controller\Component;
use App\Controller\Component\CalcComponent;
use Cake\Controller\ComponentRegistry;
use Cake\TestSuite\TestCase;
/**
* App\Controller\Component\CalcComponent Test Case
*/
class CalcComponentTest extends TestCase
{
/**
* Test subject
*
* @var \App\Controller\Component\CalcComponent
*/
protected $Calc;
/**
* setUp method
*
* @return void
*/
public function setUp(): void
{
parent::setUp();
$registry = new ComponentRegistry();
$this->Calc = new CalcComponent($registry);
}
/**
* tearDown method
*
* @return void
*/
public function tearDown(): void
{
unset($this->Calc);
parent::tearDown();
}
// 追加
public function testAdd()
{
$this->assertEquals($this->Calc->add(1,2), 3);
}
}

testAddの内容を見てみましょう。
assertEqualsに2つの引数を指定しています。
これは2つの値が同じであることをテストしています。
UnitTestはアサーションメソッドを使用し、結果がtrueになるようにコードを書きます。

テストコードのメソッド名はtestAddのように最初にtestを付与する必要がありますが、その他にも、@testアノテーションを使用する方法があります。
この場合メソッド名にtestを付与する必要はありません。

/**
* @test
*/
public function add() {
// ...
}

メソッド名は日本語で書くこともできます。

/**
* @test
*/
public function 足し算()
{
// ...
}

最小限のテストコードができました。コマンドラインからこのテストを実行してみましょう。
全てのテストを実行するには下記コマンドを実行します。

$ vendor/bin/phpunit

今作成したCalcComponentTest.phpのみを実行するには下記を実行します。

$ vendor/bin/phpunit tests/TestCase/Controller/Component/CalcComponentTest.php

さらにその中のtestAddテストだけ実行したい場合は--filterオプションを付与します。

$ vendor/bin/phpunit --filter testAdd tests/TestCase/Controller/Component/CalcComponentTest.php

次のように表示されればテストが成功したことになります。

OK (1 test, 1 assertion)

いろいろなアサーション

先ほどはassertEqualsで2つの値が同じであることをテストしましたが、テストを行う為のアサーションメソッドはその他にもいろいろあります。
ここではよく使いそうな一部を抜粋してご紹介します。

assertEquals($var1, $var2)$var1は$var2と等しい
assertSame($var1, $var2)$var1は$var2と型を含めて等しい
assertTrue($var)$varがtrueである
assertTrue($var)$varがfalseである
assertNull($var)$varがnullである
assertGreaterThan($var1, $var2)$var1 < $var2 である
assertGreaterThanOrEqual($var1, $var2)$var1 <= $var2 である
assertArrayHasKey($key, $array)$arrayに$keyキーが存在する
assertArrayHasKey($value, $array)$arrayに$value値が存在する

その他のアサーションに関してはドキュメントを確認してください。

1. アサーション — PHPUnit latest Manual

VSCodeの拡張機能

VSCodeを使用している場合は拡張機能を入れるとテストが簡単になります。

PHPUnit

PHPUnitはコマンドパレットからカーソル位置のテストを実行できるようになります。
またテストに失敗すると、その箇所を強調して表示してくれます。

VSCodeの拡張機能PHPUnit

PHPUnit

PHPUnit Test Explorer

PHPUnitはサイドバーを拡張しグラフィカルに表示してくれます。
また、エデイター上にもショトカっとボタンが表示されるようになります。

VSCodeの拡張機能PHPUnit Test Explorer

HPUnit Test Explorer