Заметки WEB-разработчика

Полезные материалы для web-разработки

Как организовать unit тестирование в Zend Framework 2 под Windows

В этой статье пойдет речь, как организовать unit тестирование (Unit Testing)  на основе PHPUnit в Zend Framework 2 под Windows.

Как организовать unit тестирование в Zend Framework 2 под Windows

Zend Framework 2 API использует PHPUnit, поэтому установим данный модуль через композер (composer) выполнив команду в консоли (cmd от имени админа):

composer require --dev phpunit/phpunit

После этого у вас в composer.json добавится что-то вроде:

"require-dev": {
	"phpunit/phpunit": "^4.8"
}

Далее создадим каталог test в нужном вам для теста модуле. У меня это project.local\module\Mymodule\test

В эту папку положим файл phpunit.xml. Это настройки.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="Bootstrap.php" colors="true">
  <testsuites>
    <testsuite name="zf2tutorial">
      <directory>MymoduleTest</directory>
    </testsuite>
  </testsuites>
</phpunit>

Там же создадим файл Bootstrap.php

namespace MymoduleTest;

use Zend\Loader\AutoloaderFactory;
use Zend\Mvc\Service\ServiceManagerConfig;
use Zend\ServiceManager\ServiceManager;
use RuntimeException;

error_reporting(E_ALL | E_STRICT);
chdir(__DIR__);

/**
 * Test bootstrap, for setting up autoloading
 */
class Bootstrap
{
    protected static $serviceManager;
    public static $em;

    public static function init()
    {
        echo 1;
        $zf2ModulePaths = array(dirname(dirname(__DIR__)));
        if (($path = static::findParentPath('vendor'))) {
            $zf2ModulePaths[] = $path;
        }
        if (($path = static::findParentPath('module')) !== $zf2ModulePaths[0]) {
            $zf2ModulePaths[] = $path;
        }

        static::initAutoloader();

        // use ModuleManager to load this module and it's dependencies
        $config = array(
            'module_listener_options' => array(
                'module_paths' => $zf2ModulePaths,
                'config_glob_paths'    => array(
                    '../../../config/autoload/{,*.}{global,local}.php',
                ),
            ),
            // подключите все ваши модули
            'modules' => array(
                'DoctrineModule',
                'DoctrineORMModule',
                'Application',
                'Mymodule',
            ),
        );

        $serviceManager = new ServiceManager(new ServiceManagerConfig());
        $serviceManager->setService('ApplicationConfig', $config);
        $serviceManager->get('ModuleManager')->loadModules();
        static::$serviceManager = $serviceManager;
        static::$em = self::getEntityManager(self::$serviceManager);
    }
	// если вы используете доктрину
    static public function getEntityManager($serviceManager)
    {
        return $serviceManager->get('Doctrine\ORM\EntityManager');
    }

    public static function chroot()
    {
        $rootPath = dirname(static::findParentPath('module'));
        chdir($rootPath);
    }

    public static function getServiceManager()
    {
        return static::$serviceManager;
    }

    protected static function initAutoloader()
    {
        $vendorPath = static::findParentPath('vendor');

        if (file_exists($vendorPath.'/autoload.php')) {
            include $vendorPath.'/autoload.php';
        }

        if (! class_exists('Zend\Loader\AutoloaderFactory')) {
            throw new RuntimeException(
                'Unable to load ZF2. Run `php composer.phar install`'
            );
        }

        AutoloaderFactory::factory(array(
            'Zend\Loader\StandardAutoloader' => array(
                'autoregister_zf' => true,
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/' . __NAMESPACE__,
                ),
            ),
        ));
    }

    protected static function findParentPath($path)
    {
        $dir = __DIR__;
        $previousDir = '.';
        while (!is_dir($dir . '/' . $path)) {
            $dir = dirname($dir);
            if ($previousDir === $dir) {
                return false;
            }
            $previousDir = $dir;
        }
        return $dir . '/' . $path;
    }
}
Bootstrap::init();
Bootstrap::chroot();

Далее создадим папку, где будем хранить сами файлы тестов, у меня это папка MymoduleTest

Теперь заходим в папку project.local\module\Mymodule\test и выполлняем команду phpunit. Мы должны увидеть примерно это:

PHPUnit 3.7.13 by Sebastian Bergmann.
Configuration read from path_to/phpunit.xml
Time: 0 seconds, Memory: 1.75Mb
No tests executed!

НО! Если у вас ОС windows, то вы увидите ошибку: phunit: command not found

Придется делать батник. Создадим же phpunit.bat или скопируем его из vendor\bin. Открываем и правим пути (баник должен смотреть vendor/phpunit/phpunit/phpunit):

@ECHO OFF
SET BIN_TARGET=%~dp0/../../../vendor/phpunit/phpunit/phpunit
php "%BIN_TARGET%" %*

Теперь в косоли мы будем запускать этот батник phpunit.bat из каталога project.local\module\Mymodule\test

Ну, пришло время написать первый тест. Создайте файл MymoduleTest.php в project.local\module\Mymodule\test\MymoduleTest

namespace MymoduleTest;

use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;
use Mymodule\Service\Procedure\DeleteService;

class MymoduleTest extends AbstractHttpControllerTestCase
{

    /**
     * @var \Zend\ServiceManager\ServiceManager
     */
    protected $serviceManager;

    /**
     * @var \Doctrine\ORM\EntityManager
     */
    protected $em;
    
    protected function setUp()
    {
        $this->serviceManager = Bootstrap::getServiceManager();
        $this->em = Bootstrap::$em;
        parent::setUp();
    }
  
 
    public function testProcedureDelete()
    {
        $deleteService = new DeleteService($this->em);
        $result = $deleteService->delete();
        $this->assertTrue($result);
    }

    protected function tearDown()
    {
        parent::tearDown();
        //$this->em->close();
        $this->em = null;
    }

}

Комментарии

Комментарии через Вконтакте