PHPUnit всегда выводит Тесты не выполняются! на MacOS Big Sur

При попытке запустить любые тесты PHPUnit я всегда получаю сообщение No tests executed! на моем компьютере MacOS. Простой способ воспроизвести на этой конкретной машине - установить новый экземпляр Laravel и запустить тесты по умолчанию:

$ composer create-project --prefer-dist laravel/laravel blog
$ cd blog
$ vendor/bin/phpunit

=> No tests executed!

Ожидаемый результат будет OK (2 tests, 2 assertions).

Насколько мне известно, это не проблема конфигурации PHPUnit, поскольку ожидается, что код Laravel по умолчанию будет работать, такая же проблема возникает с другим фреймворком и любым кодом, который я пробую, та же проблема присутствует с другой версией PHPUnit (8.5 и 9.4), и точные шаги, перечисленные выше, возвращают ожидаемый результат внутри виртуальной машины Ubuntu, а также на другом Mac, работающем под управлением Catalina.

На самом деле, я подозреваю, что это не проблема PHPUnit, скорее проблема MacOS или проблема конфигурации PHP, которая может проявиться в другой форме позже с другим инструментом или проектом. .

PHPUnit работал нормально на этой машине, но пару недель / месяцев я фактически не использовал его. Единственное, что изменилось с тех пор, как я последний раз (успешно) использовал любой PHPUnit на этом Mac, так это обновление до MacOS Big Sur и установка (а затем удаление) Homebrew.

Проблема заключается в том, что PHPUnit не может найти какой-либо набор тестов. Запуск vendor/bin/phpunit --testsuite Unit по-прежнему выводит No tests executed!, а внутри новой установки Laravel должен выводить Ok (1 test, 1 assertion).

Итак, мой вопрос: есть ли что-нибудь еще, что я могу попытаться исправить перед новой установкой macOS Big Sur, и есть ли у кого-нибудь такая же проблема?

РЕДАКТИРОВАТЬ - 1 декабря 2020 г.

Согласно запросу в комментариях, вот мой phpunit.xml, который, как описано выше, является Laravel по умолчанию.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">./app</directory>
        </include>
    </coverage>
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <!-- <server name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <server name="DB_DATABASE" value=":memory:"/> -->
        <server name="MAIL_MAILER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
        <server name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

Опять же, это не должно иметь значения, так как любая конфигурация возвращает тот же результат на этом компьютере, даже если раньше было известно, что оно работает на другом Mac и в другой ОС.

Запуск тестов с помощью artisan:

$ php artisan test --testsuite Unit
  No tests executed! 

  Time:   0.01s

Вывод vendor/bin/phpunit --list-suites:

$ vendor/bin/phpunit --list-suites
PHPUnit 9.4.4 by Sebastian Bergmann and contributors.

Available test suite(s):
 - Unit
 - Feature

Вывод vendor/bin/phpunit -v --testsuite Unit:

$ vendor/bin/phpunit -v --testsuite Unit
PHPUnit 9.4.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.3.22-(to be removed in future macOS)
Configuration: /Users/malou/Desktop/blog/phpunit.xml

No tests executed!

Примечание: /Users/malou/Desktop/blog/phpunit.xml - это то, что показано выше.

Прямая ссылка на файлы работает:

$ vendor/bin/phpunit ./tests/Unit
PHPUnit 9.4.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.006, Memory: 8.00 MB

OK (1 test, 1 assertion)

Редактировать # 2 - 1 декабря 2020 г.

Дополнительная информация об отладке для вас:

$ php -v
WARNING: PHP is not recommended\nPHP is included in macOS for compatibility with legacy software.\nFuture versions of macOS will not include PHP.
PHP 7.3.22-(to be removed in future macOS) (cli) (built: Oct 30 2020 00:19:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.22, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.7.0, Copyright (c) 2002-2019, by Derick Rethans

MacOS Big Sur 11.0.1

Изменить - 2 декабря 2020 г.

В ответ на PHPUnit всегда выводит Тесты не выполняются! в MacOS Big Sur:

Я добавил следующее:

    public static function main(bool $exit = true): int
    {
        var_dump(ini_get("auto_prepend_file"));
        var_dump($_SERVER['argv']); die;
        return (new static)->run($_SERVER['argv'], $exit);
    }

При выполнении vendor/bin/phpunit:

/Users/malou/Desktop/blog/vendor/phpunit/phpunit/src/TextUI/Command.php:163:
string(0) ""
/Users/malou/Desktop/blog/vendor/phpunit/phpunit/src/TextUI/Command.php:164:
array(1) {
  [0] =>
  string(18) "vendor/bin/phpunit"
}

При выполнении vendor/bin/phpunit --testsuite Unit

/Users/malou/Desktop/blog/vendor/phpunit/phpunit/src/TextUI/Command.php:163:
string(0) ""
/Users/malou/Desktop/blog/vendor/phpunit/phpunit/src/TextUI/Command.php:164:
array(3) {
  [0] =>
  string(18) "vendor/bin/phpunit"
  [1] =>
  string(11) "--testsuite"
  [2] =>
  string(4) "Unit"
}

person Louis Charette    schedule 29.11.2020    source источник
comment
Примечание: переустановка Homebrew и отключение XDebug не помогли.   -  person Louis Charette    schedule 01.12.2020
comment
Что выводит vendor/bin/phpunit --list-suites? И vendor/bin/phpunit -v --testsuite Unit файл конфигурации - это phpunit.xml?   -  person Total Pusher    schedule 02.12.2020
comment
Как упоминал @TotalPusher, проверьте свой phpunit.xml. Правильно ли они определены? вероятно, вставьте его сюда, чтобы мы могли посмотреть. Также я предполагаю, что вы сделали другие биты, как ожидалось, например, определение вашего тестового пространства имен в composer json и расширение их из класса phpunit TestCase.   -  person Tuhin    schedule 02.12.2020
comment
Ладно, это непростой случай. В методе PHPUnit\TextUI\Command::main(); нашел это: return (new static)->run($_SERVER['argv'], $exit);. Пожалуйста, добавьте var_dump(ini_get("auto_prepend_file")); var_dump($_SERVER['argv']); die; и покажите результат.   -  person Total Pusher    schedule 02.12.2020
comment
Узнал почему. Это вина Apple. Напишу ответ, когда сделаю постоянное исправление.   -  person Louis Charette    schedule 03.12.2020


Ответы (1)


tl; dr Apple сломала version_compare, назвав PHP 7.3.22-(to be removed in future macOS) в Big Sur. Установка другой версии PHP исправит это.


Я нашел ответ на свой вопрос. Это действительно проблема MacOS, связанная со встроенной версией PHP в MacOS Big Sur.

После некоторой отладки (в другом проекте, использующем PHPUnit 8), я заканчиваю здесь: https://github.com/sebastianbergmann/phpunit/blob/ccbf3962a948112056b0eded6e4c880af4ee3695/src/Util/Configuration41-Lp10#L10

    private function satisfiesPhpVersion(DOMElement $node): bool
    {
        $phpVersion         = \PHP_VERSION;
        $phpVersionOperator = '>=';

        if ($node->hasAttribute('phpVersion')) {
            $phpVersion = (string) $node->getAttribute('phpVersion');
        }

        if ($node->hasAttribute('phpVersionOperator')) {
            $phpVersionOperator = (string) $node->getAttribute('phpVersionOperator');
        }

        return \version_compare(\PHP_VERSION, $phpVersion, (new VersionComparisonOperator($phpVersionOperator))->asString());
    }

Если посмотреть на последнюю строку кода PHPUnit выше (и поскольку оба $node->hasAttribute('phpVersion') и $node->hasAttribute('phpVersionOperator') возвращают false), оператор return можно упростить до:

version_compare(\PHP_VERSION, \PHP_VERSION, '>=')

Теперь, поскольку версия PHP, поставляемая с MacOS, устарела в Big Sur, Apple переименовала эту версию в 7.3.22-(to be removed in future macOS). Это то, что вызвало проблему, поскольку приведенный выше код теперь выглядит следующим образом:

version_compare("7.3.22-(to be removed in future macOS)", "7.3.22-(to be removed in future macOS)", '>=')

Которые возвращают false вместо true.

Простой способ проверить:

$foo = version_compare("7.3.22-(to be removed in future macOS)", "7.3.22-(to be removed in future macOS)", '>=');
var_dump($foo); // bool(false)

$bar = version_compare("7.3.22", "7.3.22", '>=');
var_dump($bar); // bool(true)

Вероятно, это потому, что, как объясняется в официальной документации PHP. ..

Функция сначала заменяет _, - и + точкой. в строках версии, а также вставляет точки. до и после любого не числа, так что, например, «4.3.2RC1» становится «4.3.2.RC.1». Затем он сравнивает части, начиная слева направо. Если часть содержит строки специальной версии, они обрабатываются в следующем порядке: любая строка, не найденная в этом списке ‹dev‹ alpha = a ‹beta = b‹ RC = rc ‹#‹ pl = p. Таким образом, можно сравнивать не только версии с разными уровнями, такие как «4.1» и «4.1.2», но также и любую специфическую версию PHP, содержащую состояние разработки.

Обратите внимание, что предварительные версии, такие как 5.3.0-dev, считаются более ранними, чем их аналоги в окончательном выпуске (например, 5.3.0).

... схема именования Apple вероятно рассматривается как предварительная версия, уступающая самой себе, а не равной самой себе.

Таким образом, исправление заключается в перезаписи версии php, что, насколько мне известно, невозможно сделать глобально. Самым простым решением кажется установка другой версии PHP с помощью Homebrew

person Louis Charette    schedule 03.12.2020
comment
вау, это хорошая находка. Очень плохо, что Apple сломала PHP вот так, где его можно было просто упаковать с поддерживаемой версией. - person Tuhin; 08.12.2020
comment
Оказывается, проблема здесь в закрытом знаке в конце строки версии. Когда PHP нормализует номер версии, который заканчивается пустым конечным компонентом, а PHP version_compare имеет ошибку, когда обе строки, имеющие пустой конечный компонент, сравниваются как меньше, чем как равные. - person Anomie; 16.02.2021
comment
Какое нелепое решение со стороны Apple. - person nickdnk; 29.06.2021