概要

適切なテストを書くことで、より良いソフトウェアを書くのに役立ちます。 適切なテストケースを設定すると、ほとんどの機能的なバグを排除し、ソフトウェアをより良く保守することができます。

PhalconとPHPUnitの統合

PHPUnit をインストールしていない場合、次のcomposerコマンドを実行してインストールすることができます。

composer require phpunit/phpunit:^5.0

またはcomposer.jsonに手動で追加:

<br />{
    "require-dev": {
        "phpunit/phpunit": "^5.0"
    }
}

PHPUnitをインストールすると、プロジェクトのルートディレクトリにtestsというディレクトリが作成されます:

app/
public/
tests/

次に、ユニットテストのためにアプリケーションをブートストラップするための 'ヘルパー' ファイルが必要です。

PHPUnitのヘルパーファイル

テストを実行するためにアプリケーションをブートストラップするには、ヘルパーファイルが必要です。 サンプルファイルを用意しました。 ファイルをtests/ディレクトリにTestHelper.phpとして置いてください。

<?php

use Phalcon\Di;
use Phalcon\Di\FactoryDefault;
use Phalcon\Loader;

ini_set("display_errors", 1);
error_reporting(E_ALL);

define("ROOT_PATH", __DIR__);

set_include_path(
    ROOT_PATH . PATH_SEPARATOR . get_include_path()
);

// phalcon/incubatorに必要
include __DIR__ . "/../vendor/autoload.php";

// アプリケーションオートローダーを使用してクラスを自動ロードする
// composer内の依存関係を自動読み込みする
$loader = new Loader();

$loader->registerDirs(
    [
        ROOT_PATH,
    ]
);

$loader->register();

$di = new FactoryDefault();

Di::reset();

// ここで必要なサービスを DI に追加します

Di::setDefault($di);

あなたのライブラリからコンポーネントをテストする必要がある場合は、それらをオートローダーに追加するか、メインアプリケーションのオートローダーを使用してください。

ユニットテストの構築に役立つように、ユニットテスト自体をブートストラップするために使用できる抽象クラスをいくつか作成しました。 これらのファイルはPhalcon Incubatorにあります。

Incubatorライブラリは依存関係として追加することで使用できます:

composer require phalcon/incubator

またはcomposer.jsonに手動で追加:

{
    "require": {
        "phalcon/incubator": "^3.0"
    }
}

上記のリポジトリリンクを使用してリポジトリを複製することもできます。

phpunit.xmlファイル

phpunit.xmlファイルを次のように作成します:

<?xml version="1.0" encoding="UTF-8"?>

<phpunit bootstrap="./TestHelper.php"
         backupGlobals="false"
         backupStaticAttributes="false"
         verbose="true"
         colors="false"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="true">

    <testsuite name="Phalcon - Testsuite">
        <directory>./</directory>
    </testsuite>
</phpunit>

あなたのニーズに合うようにphpunit.xmlを修正し、testsに保存します。 これにより、testsディレクトリの下でテストが実行されます。

ユニットテストのサンプル

ユニットテストを実行するには、ユニットテストを定義する必要があります。 オートローダーは、適切なファイルがロードされていることを確認します。そのため、ファイルを作成するだけで、phpunitがテストを実行します。

この例は設定ファイルを含んでいませんが、ほとんどのテストケースは必要です。 DIに追加してUnitTestCaseファイルを取得できます。

最初に、testsディレクトリにUnitTestCase.phpというベースのユニットテストを作成します。

<?php

use Phalcon\Di;
use Phalcon\Test\UnitTestCase as PhalconTestCase;

abstract class UnitTestCase extends PhalconTestCase
{
    /**
     * @var bool
     */
    private $_loaded = false;

    public function setUp()
    {
        parent::setUp();

        // テスト中に必要となるかもしれない追加のサービスをロードする
        $di = Di::getDefault();

        // ここでDIコンポーネントを取得。 設定がある場合、必ず親クラスに渡す。

        $this->setDi($di);

        $this->_loaded = true;
    }

    /**
     * テストケースが正しく設定されているかどうかを確認する
     *
     * @throws \PHPUnit_Framework_IncompleteTestError;
     */
    public function __destruct()
    {
        if (!$this->_loaded) {
            throw new \PHPUnit_Framework_IncompleteTestError(
                "Please run parent::setUp()."
            );
        }
    }
}

ユニットテストを名前空間で分離することは常に良い考えです。 このテストでは、名前空間 'Test'を作成します。 したがって、tests\Test\UnitTest.phpというファイルを作成します。

<?php

namespace Test;

/**
 * Class UnitTest
 */
class UnitTest extends \UnitTestCase
{
    public function testTestCase()
    {
        $this->assertEquals(
            "works",
            "works",
            "This is OK"
        );

        $this->assertEquals(
            "works",
            "works1",
            "This will fail"
        );
    }
}

testsディレクトリ内でphpunitコマンドを実行すると、次のような出力が得られます:

$ phpunit
PHPUnit 3.7.23 by Sebastian Bergmann.

Configuration read from /var/www/tests/phpunit.xml

Time: 3 ms, Memory: 3.25Mb

There was 1 failure:

1) Test\UnitTest::testTestCase
This will fail
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'works'
+'works1'

/var/www/tests/Test/UnitTest.php:25

FAILURES!
Tests: 1, Assertions: 2, Failures: 1.

今すぐユニットテストの構築を開始できます。 ここで良いガイドを見ることができます。 また、PHPUnitに精通していない場合は、PHPUnitのドキュメントを読むことをお勧めします。