Intereting Posts

Автозагрузка классов в PHPUnit с использованием Composer и autoload.php

Я только что установил PHPUnit версии 3.7.19 от Себастьяна Бергмана через Composer и написал класс, который я хотел бы провести в модуле.

Я хотел бы, чтобы все мои классы автоматически загружались в каждый модульный тест без необходимости include или require в начале моего теста, но это оказывается сложным!

Это то, что выглядит моя структура каталогов (трейлинг / слэш указывает каталог, а не файл):

  • composer.json
  • composer.lock
  • composer.phar
  • Библиотека /
    • returning.php
  • Тесты /
    • returningTest.php
  • продавец /
    • бен /
      • PHPUnit
    • композитор/
    • PHPUnit /
    • Symfony /
    • autoload.php

Мой файл composer.json включает в себя следующее:

 "require": { "phpunit/phpunit": "3.7.*", "phpunit/phpunit-selenium": ">=1.2" } 

В файл класса return.php входит следующее:

 <?php class Returning { public $var; function __construct(){ $this->var = 1; } } ?> 

В тестовый файл returnTest.php входит следующее:

 <?php class ReturningTest extends PHPUnit_Framework_TestCase { protected $obj = null; protected function setUp() { $this->obj = new Returning; } public function testExample() { $this->assertEquals(1, $this->obj->var); } protected function tearDown() { } } ?> 

Однако, когда я запускаю ./vendor/bin/phpunit tests из командной строки, я получаю следующую ошибку:

PHP Неустранимая ошибка: класс «Возврат» не найден в /files/code/php/db/tests/returningTest.php в строке 8

Я заметил, что composer создал файл autoload.php файле vendor/autoload.php но не уверен, что это относится к моей проблеме.

Кроме того, в некоторых других ответах на Stack Overflow люди упоминали что-то об использовании PSR-0 в композиторе и команде namespace в PHP, но мне не удалось использовать ни один из них.

Пожалуйста помоги! Я просто хочу, чтобы автозагрузка моих классов в PHPUnit, поэтому я могу просто использовать их для создания объектов, не беспокоясь о include или require .


Обновление: 14 августа 2013 г.

Теперь я создал проект с открытым исходным кодом под названием PHPUnit Skeleton, который поможет вам легко запускать и тестировать PHPUnit для вашего проекта.

Ну, сначала. Вы должны указать автозагрузчику, где найти файл php для класса. Это делается, следуя стандарту PSR-0.

Лучший способ – использовать пространства имен. Автозагрузчик выполняет поиск файла Acme/Tests/ReturningTest.php когда вы запрашиваете класс Acme\Tests\ReturningTest . Там есть несколько замечательных учебников по пространству имен, просто поиск и чтение. Обратите внимание, что пространство имен не входит в PHP для автозагрузки, это то, что можно использовать для автоматической загрузки.

Composer поставляется со стандартным автозагрузчиком PSR-0 (тот, который входит в состав vendor/autoload.php ). В вашем случае вы хотите сказать автозагрузчику поиск файлов в каталоге lib . Затем, когда вы используете ReturningTest он будет искать /lib/ReturningTest.php .

Добавьте это в свой composer.json :

 { ... "autoload": { "psr-0": { "": "lib/" } } } 

Дополнительная информация содержится в документации .

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

 $ ./vendor/bin/phpunit tests --bootstrap vendor/autoload.php 

Однако лучше использовать файл конфигурации PHPunit :

 <!-- /phpunit.xml.dist --> <?xml version="1.0" encoding="utf-8" ?> <phpunit bootstrap="./vendor/autoload.php"> <testsuites> <testsuite name="The project's test suite"> <directory>./tests</directory> </testsuite> </testsuites> </phpunit> во <!-- /phpunit.xml.dist --> <?xml version="1.0" encoding="utf-8" ?> <phpunit bootstrap="./vendor/autoload.php"> <testsuites> <testsuite name="The project's test suite"> <directory>./tests</directory> </testsuite> </testsuites> </phpunit> во <!-- /phpunit.xml.dist --> <?xml version="1.0" encoding="utf-8" ?> <phpunit bootstrap="./vendor/autoload.php"> <testsuites> <testsuite name="The project's test suite"> <directory>./tests</directory> </testsuite> </testsuites> </phpunit> 

Теперь вы можете запустить команду, и она автоматически обнаружит файл конфигурации:

 $ ./vendor/bin/phpunit 

Если вы поместите файл конфигурации в другой каталог, вам нужно поместить путь в этот каталог в команде с параметром -c .

[ Update2 ] Другим более простым альтернативным подходом является использование директивы autoload autoload-dev в composer.json ( reference ). Преимущество в том, что вам не нужно поддерживать два bootstrap.php (один для prod, один для dev) только для того, чтобы автозагружать разные классы.

 { "autoload": { "psr-4": { "MyLibrary\\": "src/" } }, "autoload-dev": { "psr-4": { "MyLibrary\\Tests\\": "tests/" } } } 

[ Обновить ] Ответ Wouter J более полный. Но мой может помочь людям, которые хотят настроить автозагрузку PSR-0 в tests/ папке.
Phpunit сканирует все файлы с помощью этого шаблона *Test.php . Поэтому нам не нужно самостоятельно загружать их. Но мы все же хотим автозагружать другие поддерживающие классы в рамках tests/ таких как fixture / stub или некоторые родительские классы.

Легкий способ – посмотреть, как сам проект Composer настраивает тест phpunit. На самом деле это очень просто. Обратите внимание на строку с «bootstrap».

ссылка: https://github.com/composer/composer/blob/master/phpunit.xml.dist

 <?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/bootstrap.php" > <testsuites> <testsuite name="Composer Test Suite"> <directory>./tests/Composer/</directory> </testsuite> </testsuites> <groups> <exclude> <group>slow</group> </exclude> </groups> <filter> <whitelist> <directory>./src/Composer/</directory> <exclude> <file>./src/Composer/Autoload/ClassLoader.php</file> </exclude> </whitelist> </filter> </phpunit> во <?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/bootstrap.php" > <testsuites> <testsuite name="Composer Test Suite"> <directory>./tests/Composer/</directory> </testsuite> </testsuites> <groups> <exclude> <group>slow</group> </exclude> </groups> <filter> <whitelist> <directory>./src/Composer/</directory> <exclude> <file>./src/Composer/Autoload/ClassLoader.php</file> </exclude> </whitelist> </filter> </phpunit> во <?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/bootstrap.php" > <testsuites> <testsuite name="Composer Test Suite"> <directory>./tests/Composer/</directory> </testsuite> </testsuites> <groups> <exclude> <group>slow</group> </exclude> </groups> <filter> <whitelist> <directory>./src/Composer/</directory> <exclude> <file>./src/Composer/Autoload/ClassLoader.php</file> </exclude> </whitelist> </filter> </phpunit> 

ссылка: https://github.com/composer/composer/blob/master/tests/bootstrap.php

 <?php /* * This file is part of Composer. * * (c) Nils Adermann <naderman@naderman.de> * Jordi Boggiano <j.boggiano@seld.be> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ error_reporting(E_ALL); $loader = require __DIR__.'/../src/bootstrap.php'; $loader->add('Composer\Test', __DIR__); 

Последняя строка выше – автозагрузка тестовых классов phpunit в пространстве имен Composer \ Test.

Ни один из этих ответов не был тем, что я искал. Да PHPUnit загружает тестовые файлы, но не заглушки / приборы. Ответ Chaun Ma не сокращает его, потому что запуск vendor/bin/phpunit уже включает автозагрузку, поэтому нет способа получить экземпляр автозагрузчика, чтобы направить больше путей в его стек.

В конце концов я нашел это в документах:

Если вам нужно найти один и тот же префикс в нескольких каталогах, вы можете указать их как массив как таковой:

 { "autoload": { "psr-0": { "Monolog\\": ["src/", "lib/"] } } }