Unit Testing Phalcon

Menulis skenario tes yang tepat dapat membantu dalam menulis perangkat lunak yang lebih baik. Jika Anda mengatur uji kasus yang tepat Anda bisa menghilangkan bug yang paling fungsional dan lebih baik dalam memelihara perangkat lunak Anda.

Mengintegrasikan PHPUnit dengan Phalcon 

Jika Anda belum menginstal phpunit, Anda dapat melakukannya dengan menggunakan perintah komposer berikut:

composer require phpunit/phpunit

atau secara manual menambahkannya ke composer.json:

{
    "require-dev": {
        "phpunit/phpunit": "3.7.*"
    }
}

Atau jika Anda tidak memiliki komposer Anda dapat menginstal phpunit via pear:

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

Setelah phpunit diinstal, maka akan muncul direktori yang disebut ‘test’ dalam direktori root proyek anda:

app/
public/
tests/

Selanjutnya, kita perlu file ‘helper’ sbg bootstrap aplikasi untuk unit testing.

PHPUnit helper File 

Sebuah file helper diperlukan sbg bootstrap aplikasi untuk menjalankan tes. Kami telah menyediakan contoh file. Taruh file di direktori test/ Anda sebagai TestHelper.php.

<?php
use Phalcon\DI,
    Phalcon\DI\FactoryDefault;

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

define('ROOT_PATH', __DIR__);
define('PATH_LIBRARY', __DIR__ . '/../app/library/');
define('PATH_SERVICES', __DIR__ . '/../app/services/');
define('PATH_RESOURCES', __DIR__ . '/../app/resources/');

set_include_path(
    ROOT_PATH . PATH_SEPARATOR . get_include_path()
);

// required for phalcon/incubator
include __DIR__ . "/../vendor/autoload.php";

// use the application autoloader to autoload the classes
// autoload the dependencies found in composer
$loader = new \Phalcon\Loader();

$loader->registerDirs(array(
    ROOT_PATH
));

$loader->register();

$di = new FactoryDefault();
DI::reset();

// add any needed services to the DI here

DI::setDefault($di);

Jika Anda perlu untuk menguji setiap komponen library Anda sendiri, tambahkan saja ke autoloader atau gunakan autoloader dari aplikasi utama Anda.

Untuk membantu Anda membangun unit test, kami membuat beberapa abstract class yang dapat digunakan sbg bootstrap unit test. File-file ini ada dalam inkubator Phalcon @https://github.com/phalcon/incubator .

Anda dapat menggunakan library inkubator dengan menambahkannya sebagai dependensi:

composer require phalcon/incubator

atau secara manual menambahkannya ke composer.json:

{
    "require": {
        "phalcon/incubator": "dev-master"
    }
}

Anda juga dapat mengkloning repositori menggunakan link repo atas.

File PHPunit.xml 

Sekarang, membuat file phpunit:

<?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>

Modifikasi phpunit.xml yang sesuai dengan kebutuhan anda dan simpan dalam test/.

File ini akan menjalankan tes di bawah direktori test/.

Contoh Unit Test 

Untuk menjalankan tes unit Anda harus mendefinisikannya. Autoloader akan memastikan file yang tepat dimuat sehingga semua yang perlu Anda lakukan adalah membuat file tsb dan phpunit akan menjalankan tes untuk Anda.

Contoh ini tidak berisi file konfigurasi, Namun kebanyakan skenario pengujian akan memerlukannya. Anda dapat menambahkannya ke DI untuk mendapatkan file UnitTestCase.

Pertama membuat tes unit dasar yang disebut UnitTestCase.php di direktori test/:

<?php
use Phalcon\DI,
    \Phalcon\Test\UnitTestCase as PhalconTestCase;

abstract class UnitTestCase extends PhalconTestCase {

    /**
     * @var \Voice\Cache
     */
    protected $_cache;

    /**
     * @var \Phalcon\Config
     */
    protected $_config;

    /**
     * @var bool
     */
    private $_loaded = false;

    public function setUp(Phalcon\DiInterface $di = NULL, Phalcon\Config $config = NULL) {

        // Load any additional services that might be required during testing
        $di = DI::getDefault();

        // get any DI components here. If you have a config, be sure to pass it to the parent
        parent::setUp($di);

        $this->_loaded = true;
    }

    /**
     * Check if the test case is setup properly
     * @throws \PHPUnit_Framework_IncompleteTestError;
     */
    public function __destruct() {
        if(!$this->_loaded) {
            throw new \PHPUnit_Framework_IncompleteTestError('Please run parent::setUp().');
        }
    }
}

Akan lebih baik jika mengelompokkan UnitTest dgn namespace. Untuk tes ini kita akan membuat namespace ‘Test’. Jadi buat file bernama testsTestUnitTest.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 wil fail'
        );
    }
}

Sekarang ketika Anda mengeksekusi ‘phpunit’ di command-line di direktori tes, Anda akan mendapatkan output sebagai berikut:

$ phpunit
PHPUnit 3.7.23 by Sebastian Bergmann.

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

Time: 3 ms, Memory: 3.25Mb

There was 1 failure:

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

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

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

Sekarang Anda dapat mulai membangun tes unit Anda sendiri. Anda dapat melihat panduan yang baik di sini (kami juga merekomendasikan membaca dokumentasi PHPUnit jika Anda tidak terbiasa dengan PHPUnit):

http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/

Terjemahan dr Unit Testing Phalcon
http://docs.phalconphp.com/en/latest/reference/unit-testing.html