mbp9v9a8316_tp_v

テストの自動化

CakePHP3 + PHPUnitでテストを自動化する方法を紹介したいと思います。

テスト自動化を行う事により、ターミナルから下記のようなコマンドを実行すると

$ vendor/bin/phpunit tests/TestCase

グラフィカルにテスト結果が閲覧出来ます。
coverage_2

コードレベルで未チェック部分は赤で表示されるのでテストにモレがなくなる事が期待出来ます。
coverage_1

手順

1.PHPUnit をインストール

下記コマンドでPHPUnitをインストールします。

$ php composer.phar require --dev phpunit/phpunit

2.インストールが成功したか確認

下記コマンドでヘルプが表示されればOKです。

$ vendor/bin/phpunit -h

3.テストファイルをbakeコマンドで作成

下記コマンドでOrderコントローラーのテストファイルを作成。

$ bin/cake bake test Controller Order

4.bakeされたファイルへ追記

bakeで「/tests/TestCase/Controller/OrdersControllerTest.php」が作成されるので今回は簡単な下記2点のテストを記述します。

・ログイン前はシステム内にアクセス出来ない。
・ログイン後はシステム内へアクセスが可能。

OrdersControllerTest.phpへtestIndexBeforeLoginとtestIndexAfterLoginメソッドを追記します。

namespace App\Test\TestCase\Controller;

use App\Controller\OrdersController;
use Cake\TestSuite\IntegrationTestCase;
use Cake\ORM\TableRegistry;

/**
* App\Controller\OrdersController Test Case
*/
class OrdersControllerTest extends IntegrationTestCase
{
  
  //******** Fixtures
  //public $fixtures = ['app.orders'];
  
  //****** ログイン前の場合はアクセス出来ない
  public function testIndexBeforeLogin()
  {
    // セッションデータの未設定
    $this->get('/orders/index');
    
    $this->assertRedirect(['controller' => 'Users', 'action' => 'login']);
  }
  
  //****** ログイン後はアクセス可能
  public function testIndexAfterLogin()
  {
    // セッションデータの擬似的にセット
    $this->session([
      'Auth' => [
        'User' => [
          'id' => 1,
          'username' => 'admin3'
        ]
      ]
    ]);

    //ログイン後のページへアクセス
    $this->get('/orders/index');

    //ページ遷移が成功(http=200)したか確認。
    $this->assertResponseOk(); 
  }

}

5.テストを実行

下記コマンドでOrdersControllerTest.php内すべてのテストを実施します。

$ vendor/bin/phpunit tests/TestCase/Controller/OrdersControllerTest.php

下記で特定のメソッド(この場合はtestIndexBeforeLogin)のテストのみを実施します。

vendor/bin/phpunit --filter testIndexBeforeLogin tests/TestCase/Controller/OrdersControllerTest.php

テスト結果をビジュアルで表示するには下記のコマンドでcoverageのhtmlを作成します。

vendor/bin/phpunit --coverage-html webroot/coverage tests/TestCase/Controller/OrdersControllerTest.php

下記URLへブラウザでアクセスするとテスト結果が閲覧可能です。
http://{cakePHPのroot}/coverage/index.html

coverage_2

付録

・fixture の作成。これでDBデータ10件分のfixtureが作成される。
bin/cake bake fixture -r -n 10 -f -s SystemUser

・recordのデータをDBから持ってくる場合。(Fixtureファイルに記載)
//これでsystem_userのデータをロードできる。(テーブルの実名で記述)
public $import = [‘table’ => ‘system_user’];

・Fixtureをロード ********test.phpファイルに記載
public $fixtures = [‘app.SystemUser’];
→ これをやるとtest_ のDBのデータが書き換えられる。(テーブルは最後にdropされるので消えてしまう。)

・画面遷移する時のテストでセッションを引き継ぎたい
$this->session($this->_requestSession->read());

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Tumblr0Share on Yummly0