Не могу протестировать пакет PHP с помощью PHPUnit, как только я его опубликую

Я создал простую библиотеку PHP, используя PHP 5.6. Он включает в себя тестовые примеры PHPUnit, и мне удалось создать пакет. Затем я обнаружил, что могу установить эти пакеты прямо из GitHub, используя композитор, и в других проектах. Я могу запускать тесты самостоятельно на этапе разработки. Но как только я публикую пакет, я не могу запустить тесты, так как он неправильно находит файлы автозагрузчика.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
     colors="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader">

<testsuites>
    <testsuite>
        <directory>tests</directory>
    </testsuite>
</testsuites>

Я добавил файлы xml в корневой каталог. Путь к файлу автозагрузки правильный, если он независим. Но после установки структура каталогов будет другой.

Проблема все еще сохраняется, если мы используем require_once файл автозагрузчика, так как структура каталогов меняется после установки.

Вопросы:

  1. Можем ли мы протестировать наш пакет после его установки в какие-либо фреймворки (laravel/Symfony) или в любые другие проекты?
  2. Какова наилучшая практика? Нужен ли тест разработчикам, использующим пакет?
  3. Если да, то какое-нибудь решение для решения этой проблемы? Есть ли другой способ решить проблему с автозагрузкой в ​​обеих средах?

Репозиторий в Github

Скриншот


person JTheDev    schedule 21.02.2017    source источник


Ответы (1)


Я бы сказал, что вам лучше посмотреть другие репозитории и посмотреть, работает он или нет.

Для меня

cd vendor/phpunit/phpunit && composer install && phpunit => работал
cd doctrine/collections/ && composer install && phpunit => работал

Так что кажется, что это должно работать для вас.

Если вы посмотрите на phpunit.xml.dist других поставщиков, которых они используют:

bootstrap="./tests/Doctrine/Tests/TestInit.php" (доктрина)
bootstrap="tests/bootstrap.php" (phpunit)

Похоже, ваш файл не так уж отличается. Вы уверены, что запускали composer install из каталога пакетов внутри папки поставщика?

Обновлять:

Я добавил ваш репозиторий в качестве зависимости к установке Symfony по умолчанию.

"repositories": [
    {
        "url": "https://github.com/jerintk/Validator.git",
        "type": "git"
    }
],

И в блоке require:

"Jthedev/Validators": "dev-master"

потом я побежал

composer update

Он работал нормально. Вам нужно запустить обновление композитора и проверить новый composer.lock, потому что он устарел.

Оттуда я перешел в каталог для вашего репо.

cd vendor/Jthedev/Validators

потом я побежал

composer install

а также

vendor/phpunit/phpunit/phpunit

и получил

OK (2 tests, 2 assertions)

Обновление два

(поскольку это было слишком долго для комментария)

@JTheDev composer update добавляет ваши зависимости для проекта laravel, но не создает папку поставщика внутри вашего каталога vendor/your-project. Если композитор установил все зависимости отдельно для каждого проекта, например:

vendor/
  my-project/
    vendor/
      dependency-A
      dependency-C
  another-library/
    vendor/
      dependency-A
      dependency-B

это будет тратить много места и пропускной способности. Вместо этого composer получает все зависимости и устанавливает их в отдельные папки, и они работают друг с другом, потому что composer загружает их все, используя vendor/autoload.php для этого проекта. Вы говорите о создании папки поставщика внутри vendor/your-project. Это ненормально - обычно вам нужно запускать тесты только при самостоятельной разработке, но в любом случае ваш вопрос касается того, как запускать тесты для вашего проекта, когда он добавляется в качестве зависимости для другого проекта.

Для этого вам нужно запустить composer install внутри каталога vendor/your-project, что означает:

cd vendor/Jthedev/Validators && composer install && vendor/phpunit/phpunit/phpunit

Окончательное обновление (надеюсь)

Из чата:

Автозагрузчик генерируется только тогда, когда вы запускаете установку композитора внутри каталога вашего проекта. Вы правы, папки поставщика обычно не должно быть, но она вам нужна, если вы хотите делать то, что пытаетесь сделать. Это необычно. Обычно разработчики запускают свои тесты в корневой папке своего проекта, а не на зависимостях, но ваш вопрос был «как я могу запускать свои тесты, когда это зависимость». Ответ: вам нужно создать файлы поставщика и автозагрузки в папке вашего проекта.

Тесты запускаются только в том случае, если вы запускаете установку композитора внутри папки проекта. Но это не проблема, если тесты не запускаются без этого.

person mickadoo    schedule 21.02.2017
comment
Я думаю, что мой вопрос нуждается в редактировании или он не ясен. У меня нет проблем с пакетом, когда он независим. Папка поставщика находится в корневой папке, как и файл phpunit.xml. но когда мы установим этот пакет в фреймворк, файл XML будет находиться глубоко внутри папки поставщика. В этом случае пакет не может отслеживать автозагрузчик. Это моя проблема. Если вы клонируете мой репозиторий GitHub, это не вызовет никаких проблем. Но когда вы устанавливаете его в другом пакете, вы не можете его протестировать. - person JTheDev; 21.02.2017
comment
Я не уверен, что ты имеешь в виду. Вы имеете в виду, что cd vendor/yournamespace/yourpackage && composer install && phpunit не работает, когда он добавлен как зависимость? Или вы ожидаете, что ваши тесты пакетов будут запускаться автоматически из корневой папки только с phpunit? - person mickadoo; 21.02.2017
comment
Нет нет. Извините за неправильное значение. Допустим, вы разрабатываете пакет для packagegist. И если кто-то установит его в свой проект. В этом случае. Имейте в виду, что пакет не зависит от фреймворка. Например, carbon, Mailgun и т. д. Независимо от фреймворка пакет должен работать. Это работает, но не тесты. Надеюсь понятно. Вы можете попробовать установить мой репозиторий GitHub и запустить тесты. - person JTheDev; 21.02.2017
comment
@JTheDev, вы ожидаете, что тесты вашей библиотеки будут выполняться, если кто-то запустит phpunit из корня проекта, которому просто требуется ваша библиотека через Composer? - person Chris; 21.02.2017
comment
Не так много. Я ожидаю, что тест должен пройти успешно, по крайней мере, когда они запускают тесты внутри папки поставщика и внутри моего пакета. - person JTheDev; 21.02.2017
comment
Я добавил его как зависимость, и тесты работают нормально. Я не уверен, какая у вас ошибка. - person mickadoo; 21.02.2017
comment
@mickadoo: Не могли бы вы рассказать мне о шагах, которые вы предприняли для проведения теста? Что я сделал, так это сначала установил laravel. Добавил мой пакет в качестве одной из зависимостей. Затем я сделал обновление композитора. После этого я сделал phpunit внутри vendor/namespace/package/tests. К сожалению, он не смог найти файл автозагрузки. - person JTheDev; 22.02.2017
comment
@JTheDev Я добавил некоторые разъяснения о том, как вы можете запускать тесты. - person mickadoo; 22.02.2017
comment
@mickadoo: как насчет моей процедуры, это правильно или я сделал какую-то ошибку? Я тоже добавил один скриншот... - person JTheDev; 22.02.2017
comment
Пожалуйста, прочитайте обновление. В нем есть все шаги, необходимые для запуска тестов. - person mickadoo; 22.02.2017
comment
Давайте продолжим обсуждение в чате. - person JTheDev; 22.02.2017