初期設定
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はコマンドパレットからカーソル位置のテストを実行できるようになります。
またテストに失敗すると、その箇所を強調して表示してくれます。
PHPUnit
PHPUnit Test Explorer
PHPUnitはサイドバーを拡張しグラフィカルに表示してくれます。
また、エデイター上にもショトカっとボタンが表示されるようになります。
HPUnit Test Explorer