Я только что установил PHPUnit версии 3.7.19 от Себастьяна Бергмана через Composer и написал класс, который я хотел бы провести в модуле.
Я хотел бы, чтобы все мои классы автоматически загружались в каждый модульный тест без необходимости include
или require
в начале моего теста, но это оказывается сложным!
Это то, что выглядит моя структура каталогов (трейлинг / слэш указывает каталог, а не файл):
Мой файл 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/"] } } }