2015-07-04 5 views
4

Когда я запускаю PHPUnit, он пытается запустить тестовые файлы в неожиданных местах, а именно в каталог установки Twig, и пытается слишком многократно загружать файлы класса Twig. Кто-нибудь знает, как исправить эти проблемы?Модульное тестирование в PHPUnit с установленным Twig

фон

Я использую Twig (только Twig, не Symfony) в веб-приложение, с установленным Twig через Composer. Композитор и Twig установлены в пользовательских местах, и мои тесты в /test/, поэтому я имею следующую упрощенную структуру проекта:

/src/includes/vendor/ 
    autoload.php 
    composer/ 
    twig/ 
     twig/ 
      lib/ 
      test/ 
/test/ 
    bootstrap.php 
    (various files named, e.g., someClassTest.php) 

Мой загрузочный файл (/test/bootstrap.php) не делает ничего, кроме загрузки Композитор автозагрузчика:

<?php 
require_once dirname(__FILE__) . "/../src/includes/vendor/autoload.php"; 

Мой PHPUnit конфигурационный файл (phpunit.xml) выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit colors="true"> 
    <testsuites> 
     <testsuite name="All Tests"> 
      <directory>./test/phpunit/</directory> 
     </testsuite> 
    </testsuites> 
    <php> 
     <ini name="xdebug.default_enable" value="0" /> 
     <ini name="xdebug.remote_autostart" value="0" /> 
     <ini name="xdebug.remote_enable" value="0" /> 
     <ini name="xdebug.overload_var_dump" value="0" /> 
     <ini name="xdebug.show_mem_delta" value="0" /> 
    </php> 
</phpunit> 

Проблемы

1. PHPUnit запускает тесты модуля Twig в /src/includes/vendor/composer/twig/twig/test/.

Почему? Основываясь на моем файле конфигурации, я ожидал бы только тесты в /test для запуска. На данный момент, я создал отдельный конфигурационный файл, который явно исключает испытания Twig с этой записью:

<exclude>./src/includes/vendor/</exclude> 

Это чувствует Hacky и хрупким, и я не понимаю, почему это необходимо. Может кто-нибудь объяснить это?

2. Если я попытаюсь запустить PHPUnit без явного исключения тестов модуля Twig, я столкнулся с проблемами автозагрузчика.

Если я запустил PHPUnit без включения файла bootstrap.php, то автозагрузчик Composer не будет загружен, поэтому PHPUnit умрет при первом запуске любых классов Twig.

Если я включаю автозагрузчика классы загружаются дважды, и я получаю эту ошибку:

Fatal error: Cannot redeclare class Twig_Node_Expression_Test in [path to project]\src\includes\vendor\twig\twig\lib\Twig\Node\Expression\Test.php on line 32 

Call Stack: 
    0.1630  223296 1. {main}() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:0 
    0.4280  857528 2. IDE_Base_PHPUnit_TextUI_Command::main() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:552 
    0.4280  864000 3. PHPUnit_TextUI_Command->run() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:294 
    1.8451 1338552 4. PHPUnit_Runner_BaseTestRunner->getTest() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/TextUI/Command.php:150 
    107.4751 1501304 5. PHPUnit_Framework_TestSuite->addTestFiles() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Runner/BaseTestRunner.php:96 
    107.6552 1668912 6. PHPUnit_Framework_TestSuite->addTestFile() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Framework/TestSuite.php:416 
    107.6572 1668888 7. PHPUnit_Util_Fileloader::checkAndLoad() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Framework/TestSuite.php:355 
    107.6592 1669056 8. PHPUnit_Util_Fileloader::load() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Util/Fileloader.php:76 

у меня не было никаких подобных проблем, на самом деле работает приложение; это происходит только при модульном тестировании.

Если это помогает, я запускаю PHPStorm 9 (PS-141.1717), используя PHPUnit 3.7.37.

У кого-нибудь есть понимание этой проблемы?


Редактировать на основе комментариев: командная строка, PhpStorm выполняется следующим образом:

C:\xampp\php\php.exe C:/Users/Ed/AppData/Local/Temp/ide-phpunit.php --bootstrap [path to project]\test\phpunit\bootstrap.php --configuration [path to project]\phpunit.xml [path to project]

+0

Какова команда, которую вы используете для запуска тестов? –

+0

@AlainTiemblo См. Мое редактирование. –

ответ

0

Я нашел свой ответ, немного потрудившись с PHPStorm. В диалоговом окне «Run/Debug Configurations» я проверил «Directory» как «область тестирования»."Я изменил, что„Определен в конфигурационном файле.“

Screenshot of PHPStorm Run/Debug Configuration dialog

Теперь PHPUnit только тесты в /test/phpunit/, как указано в моем phpunit.xml. Это означает, что он не запускать тесты Twig (как ожидается), устранение обоих проблем, указанных в моем вопросе. Это работает, если я запустить тесты изнутри PhpStorm, а также, если я просто выполнить команду phpunit на терминале, а в каталог phpunit.xml.

Все, что сказал, если кто знает, как запустить как my tes ts и Twig одновременно, не получив ошибки «Can not redeclare class», отправьте комментарий.

0

В конце команды PHPUnit, попробуйте заменить [path to project] с [path to project]/tests/phpunit или опуская ту часть полностью.

+0

Эта команда автоматически создается и выполняется PHPStorm. Я не имею прямого контроля над этим. –

+0

Ну, боюсь, это та команда, которая виновата. PHPUnit ищет всю структуру каталогов, включая зависимостей сторонних разработчиков, для расширений '\ PHPUnit_Framework_TestCase'. Предоставляя ему путь к * вашим * тестам или не давая ему ничего, так что он использует путь, определенный вами в файле 'phpunit.xml', будет работать. Если ваша IDE не может с этим справиться, возможно, запустите команду 'phpunit' в терминале? –