Тестирование юнит-уровня
Написание корректных тестов способствует написанию лучшего программного обеспечения. Если вы создадите правильные тестовые случаи, вы сможете устранить большинство функциональных ошибок и лучше поддерживать свое программное обеспечение.
Интеграция 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