Spec-Zone.ru › Phalcon 2

Тестирование юнит-уровня

Написание корректных тестов способствует написанию лучшего программного обеспечения. Если вы создадите правильные тестовые случаи, вы сможете устранить большинство функциональных ошибок и лучше поддерживать свое программное обеспечение.

Интеграция PHPunit с Phalcon

Если у вас еще не установлен phpunit, вы можете установить его с помощью следующей команды Composer:

composer require phpunit/phpunit

или вручную добавив его в composer.json:

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

Или, если у вас нет Composer, вы можете установить phpunit через PEAR:

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

После установки phpunit создайте директорию с именем «tests» в корневом каталоге:

app/
public/
tests/

Далее, нам нужен файл «helper» для инициализации приложения для тестирования юнит-уровня.

Файл помощника PHPunit

Файл помощника необходим для инициализации приложения для запуска тестов. Мы подготовили пример файла. Поместите файл в каталог tests/ как TestHelper.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);

Если вам нужно протестировать какие-либо компоненты из вашей собственной библиотеки, добавьте их в автозагрузчик или используйте автозагрузчик из вашего основного приложения.

Чтобы помочь вам создать тесты юнит-уровня, мы создали несколько абстрактных классов, которые вы можете использовать для инициализации самих тестов юнит-уровня. Эти файлы находятся в инкубаторе Phalcon по адресу https://github.com/phalcon/incubator.

Вы можете использовать библиотеку инкубатора, добавив ее в качестве зависимости:

composer require phalcon/incubator

или вручную добавив ее в composer.json:

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

Вы также можете клонировать репозиторий, используя ссылку на репозиторий выше.

Файл phpunit.xml

Теперь создайте файл 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>

Измените файл phpunit.xml в соответствии с вашими потребностями и сохраните его в каталоге tests/.

Это запустит любые тесты в каталоге tests/.

Пример теста юнит-уровня

Чтобы запустить любые тесты юнит-уровня, вам нужно их определить. Автозагрузчик позаботится о загрузке соответствующих файлов, поэтому все, что вам нужно сделать, это создать файлы, и phpunit запустит для вас тесты.

В этом примере отсутствует файл конфигурации, однако большинство тестовых случаев требуют его. Вы можете добавить его в DI, чтобы получить файл UnitTestCase.

Сначала создайте базовый тест юнит-уровня с именем UnitTestCase.php в каталоге /tests:

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().');
        }
    }
}

Всегда рекомендуется разделять тесты юнит-уровня по именам пространств. Для этого теста мы создадим пространство имен «Test». Поэтому создайте файл testsTestUnitTest.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'
        );
    }
}

Теперь, когда вы выполните команду «phpunit» в командной строке из каталога tests, вы получите следующий вывод:

$ 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.

Теперь вы можете начать создавать свои тесты юнит-уровня. Вы можете ознакомиться с хорошим руководством здесь (мы также рекомендуем прочитать документацию PHPunit, если вы не знакомы с PHPunit):

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

© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/unit-testing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API