Классы автозапуска в PHPUnit с использованием Composer и autoload.РНР
я только что установил PHPUnit версии 3.7.19 Себастьяна Бергмана через Composer и написал класс, который я хотел бы модульный тест.
я хотел бы, чтобы все мои классы автоматически загружались в каждый модульный тест без использовать include или require в верхней части моего теста, но это оказывается сложно!
вот как выглядит моя структура каталогов (трейлинг / косая черта указывает на каталог, а не файл):
- композитор.json
- композитор.замок
- композитор.фар
- lib/
- возвращение.php
- тесты/
- returningTest.php
- поставщик/
- bin/
- phpunit
- композитор/
- phpunit/
- symfony/
- Автозагрузка.php
- bin/
мой композитор.json включает в себя следующее:
"require": {
"phpunit/phpunit": "3.7.*",
"phpunit/phpunit-selenium": ">=1.2"
}
мой возвращение.php файл класса включает в себя следующее:
<?php
class Returning {
public $var;
function __construct(){
$this->var = 1;
}
}
?>
мой returningTest.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 фатальная ошибка: класс 'Returning' не найден в
/files / code/php/db/tests / returningTest.php on строка 8
я заметил, что composer производства на vendor/autoload.php но не уверен, что это имеет отношение к моей проблеме.
кроме того, в некоторых других ответах на переполнение стека люди упоминали что-то об использовании PSR-0 в composer и The namespace команда в PHP, но я не был успешным в использовании любого из них.
пожалуйста, помогите! Я просто хочу автоматически загружать свои классы в PHPUnit, чтобы я мог просто использовать их для создания объектов не беспокоясь о include или require.
обновление: 14 августа 2013
теперь я создал проект с открытым исходным кодом под названием PHPUnit Скелет чтобы помочь вам встать и работать с PHPUnit тестирования легко для вашего проекта.
3 ответов:
Ну, во-первых. Вам нужно сказать автозагрузчику, где найти php-файл для класса. Это делается, следуя стандарту PSR-0.
лучший способ-использовать пространства имен. Автозагрузчик ищет
Acme/Tests/ReturningTest.phpфайл, Когда вы запросилиAcme\Tests\ReturningTestкласса. Есть некоторые большие учебники пространства имен там, просто поиск и чтение. Обратите внимание, что пространство имен не что-то, что вошло в PHP для автоматической загрузки, это то, что можно использовать для самозарядный.Composer поставляется со стандартным загрузчиком PSR-0 (тот, что в
vendor/autoload.php). В вашем случае вы хотите сказать автозагрузчику искать файлы в . Затем, когда вы используете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>теперь вы можете запустить команду, и она автоматически определит файл конфигурации:
$ ./vendor/bin/phpunitесли вы помещаете файл конфигурации в другой каталог, вам нужно поместить путь к этому каталогу в команду с помощью .
[обновление 2] еще один более простой альтернативный подход заключается в использовании на
composer.json(ссылка). Преимущество заключается в том, что вам не нужно поддерживать два прихлоп.php (один для prod, один для dev) только для того, чтобы автоматически загружать разные классы.{ "autoload": { "psr-4": { "MyLibrary\": "src/" } }, "autoload-dev": { "psr-4": { "MyLibrary\Tests\": "tests/" } } }[обновление] ответ Wouter J является более полным. Но мой может помочь людям, которые хотят настроить автоматическую загрузку PSR-0 в
tests/папка.
Phpunit сканирует все файлы с помощью этот шаблон*Test.php. Поэтому нам не нужно загружать их самостоятельно. Но мы все еще хотим автоматически загружать другие поддерживающие классы подtests/как приспособление / заглушка или некоторые родительские классы.самый простой способ-посмотреть на то, как сам проект композитора является создание теста по 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>ссылка: https://github.com/composer/composer/blob/master/tests/bootstrap.php
<?php /* * This file is part of Composer. * * (c) Nils Adermann <[email protected]> * Jordi Boggiano <[email protected]> * * 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 загружает тестовые файлы, но не заглушки/светильники. Ответ Чаун Ма не сокращает его, потому что работает
vendor/bin/phpunitуже включает autoload, поэтому нет никакого способа получить экземпляр autoloader, чтобы подтолкнуть больше путей к его стеку в этот момент.Я в конце концов нашел это в документах:
Если вам нужно искать один и тот же префикс в нескольких каталогах, вы можете указать их в виде массива, как такие:
{ "autoload": { "psr-0": { "Monolog\": ["src/", "lib/"] } } }
Comments