PHPUnit - 'Тесты не выполняются' при использовании файла конфигурации

89

Проблема

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

Я решил установить PHPUnit, используя composer для личной библиотеки, которая позволяет мне выполнять общие функции базы данных. Сначала у меня не было файла конфигурации для PHPUnit, и когда я запускал такие команды, как:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Обратите внимание, что это команда терминала, поэтому я не включил .phpрасширение. Упомянутый выше GeneralStringFunctionsTest на самом деле является GeneralStringFunctionsTest.phpфайлом.

Результат - то, что я ожидал:

Время: 31 мс, Память: 2.75Мб

ОК (1 тест, 1 утверждение)

Затем я попытался использовать файл конфигурации для автоматической загрузки набора тестов вместо того, чтобы каждый раз вручную вводить файл. Я создал файл с именем phpunit.xmlв моем корневом каталоге и ввел в него следующее: http://pastebin.com/0j0L4WBD :

<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
    <testsuites>
        <testsuite name="Tests">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Теперь, когда я запускаю команду:

phpunit

Получаю следующий результат:

PHPUnit 4.5.0 от Себастьяна Бергманна и соавторов.

Конфигурация, прочитанная из /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Время: 16 мс, память: 1,50 МБ

Никаких тестов не проводилось!

Если это полезно, моя структура каталогов выглядит следующим образом:
src - каталог верхнего уровня (со всем моим исходным кодом),
тесты - каталог верхнего уровня (со всеми моими тестами, структурированными так же, как моя папка src )
поставщик - сторонние файлы Composer

У меня также есть json-файл composer и файл блокировки, а также файл phpunit xml на верхнем уровне в виде файлов.

Вещи, которые я пробовал

  • Изменение каталога phpunit.xmlнаtests/GeneralStringFunctions
  • Изменение каталога phpunit.xmlна./tests
  • Перемещение phpunit.xmlфайла в testsкаталог, а затем изменение каталога ./вместо tests.
  • Добавление атрибута суффикса к тегу каталога, phpunit.xmlчтобы указать "Тесты" в качестве явного суффикса.
Муйива Олу
источник
Это tests/GeneralStringFunctions/GeneralStringFunctionsTestпапка или имя файла?
hek2mgl
@ hek2mgl Это имя файла, оно на самом деле называется GeneralStringFunctionsTest.php. В интерфейсе командной строки я не ввел .phpрасширение, потому что оно работало без него.
Muyiwa Olu
1
ОК, тогда ваша конфигурация должна работать. Кстати, если вы укажете суффикс, он должен быть, Test.phpа не Testв вашем случае, но, тем не менее, вы можете опустить его, поскольку Test.phpэто значение по умолчанию.
hek2mgl
@ hek2mgl Спасибо за внимание! Вы хоть представляете, почему мой тест не работает с файлом конфигурации phpunit.xml?
Muyiwa Olu
Почему бы вам не показать нам файл конфигурации?
ThW,

Ответы:

191

Как бы то ни было (опоздание), я столкнулся с этим недавно, когда делал новый проект Laravel 5.1 для простого веб-сайта. Я попытался отладить его и был сбит с толку, когда попробовал:

php artisan make:test homeTest

(который имеет тест по умолчанию, который просто утверждает, что истина истинна)

и увидел выход

No tests executed!

Проблема в том, что для меня проблема была связана с моей установкой PHP - «phpunit» был глобально зарегистрирован и настроен по-другому, тогда как phpunit, поставляемый с установкой Laravel, был настроен правильно и отлично работал.

Итак, исправление запускает настроенный производителем phpunit (из того же корневого каталога, что и app / и tests /):

./vendor/bin/phpunit

Надеюсь, это поможет кому-то другому!

РобоМедведь
источник
4
Думаю, это, скорее всего, правильный ответ. С тех пор я удалил проект, поэтому у меня нет возможности дважды проверить, но для будущих проектов с композитором я всегда использовал vendor/bin/phpunitвместо глобального phpunitдвоичного файла. Я даже удалил глобальный phpunitдвоичный файл, чтобы случайно не повторить ту же ошибку снова - и с тех пор он не появлялся. Отмечу это как принятый ответ, так как это, скорее всего, причина.
Muyiwa Olu
3
звонок ./vendor/bin/phpunitпомог мне на свежей установке laravel 5.4
ira
Точно так же это помогло мне при работе над проектом Wordpress. Та же проблема: "phpunit" можно глобально зарегистрировать и настроить по-разному. Спасибо, что поделились!
sqsinger
Это исправило это для меня, но есть ли способ глобально исправить phpunit? Было бы хорошо, если бы я мог просто набратьphpunit
Noitidart
2
@Noitidart, вы можете создать aliasдля ./vendor/bin/phpunit
Ganesh K
98

Ваш XML-файл и так в порядке. Однако вы должны убедиться, что файлы PHP в вашей tests/папке имеют следующие имена:

tests / Test.php <--- Обратите внимание на заглавные буквы "T"
tests / user Test.php
tests / fooBar Test.php
и т. д.

Имена файлов должны заканчиваться на «Test.php» . Это то, что PHPUnit ищет в каталогах.

Кроме того, каждый метод тестирования должен иметь имя, начинающееся с «test»:

public function testFooBar()
{
    // Your test code
}

Надеюсь, это поможет!

Лайонел
источник
4
или вы можете использовать --test-suffix=anything.phpдля переопределения
контрольная сумма
для меня было полезно заменить относительный путь к тестовой папке абсолютным путем.
Тимур Самхарадзе
Как мне изменить это в файле конфигурации?
Джонатан
19

В Windows используйте следующую команду на терминале

.\vendor\bin\phpunit

это если команда

phpunit

возвращает "Тесты не выполнялись!"

пока на Mac

./vendor/bin/phpunit

Надеюсь, это поможет.

Ндонг Акво
источник
Большое спасибо за ваш ответ, это действительно помогает.
Goke Obasa
Убедитесь, что phpunitна вашем глобальном пути нет (вы можете проверить, что он работает, phpunit --versionи посмотреть, соответствует ли он тому, что вы ожидаете. Xampp обычно устанавливает phpunit в том же каталоге php bin. Это было проблемой для меня.
giovannipds
12

У меня была такая же проблема после того, как PHPUnit на наших виртуальных машинах обновился до версии 6. Даже --debug и --verbose не сказали ничего полезного, просто «Тесты не выполнялись». В конце концов оказалось, что классы и пространства имен были изменены в новой версии, и она просто не хотела выполнять файлы, содержащие ссылки на старые классы. Для меня исправление заключалось в том, чтобы заменить в каждом тестовом примере это:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

с участием:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}
игорь
источник
Ах, да, хотя это не похоже, что это был ответ на исходный вопрос, он решил мою проблему после обновления до 6.x!
Tama
Это было проблемой для меня при обновлении с PHPUnit 5.7 до 8.5 - спасибо за совет!
подтверждающий
7

Я понимаю, что это очень старо, но со мной такое тоже случилось. Надеюсь, это кому-то поможет.

Моя проблема заключалась в том, что я забыл символ '@' в / ** @test * /

НЕПРАВИЛЬНО:

/** test */
function a_thread_can_be_deleted()
{
    ...
}

ВЕРНО:

/** @test */
function a_thread_can_be_deleted()
{
    ...
}
Брэд Аренс
источник
1
более 2 лет спустя, и это было для меня. это действительно должен быть именно такой формат комментария. У меня там не хватало места. он его не обнаружил. что немного раздражает, в laravel 6.1 я использовал команду artisan make, и она не включает этот комментарий
aibarra
1
Этот ответ полезен
Сундар
Я столкнулся с проблемой при разработке пакета. Когда я запускаю php artisan make: test SomeTest и перемещаю его в каталог тестов пакета, комментарий базового метода testExample содержит только базовое описание и @return voidне содержит '@test', что является причиной того, что phpunit не может идентифицировать это как тест.
DAMIEN JIANG
5

Я тянул за волосы 10 минут, прежде чем решил использовать --debug (кстати, хороший способ пойти), чтобы обнаружить тот простой факт, что имя файла не соответствует соглашению об именовании , у меня в конце была дополнительная буква «s» .

неправильно

CreateAdminTests

верно

CreateAdminTest

надеюсь, что эта заметка может кому-то помочь

Chebaby
источник
Отлично, после этого я смог запустить тест
WindSaber
4

Вам нужно просто позвонить из файла поставщика

vendor\bin\phpunit Уведомление \ Not /

Хамза Зимавы
источник
3

Вместо запуска phpunit

использовать

поставщик \ bin \ phpunit

Арун Ганесан
источник
2

если вы используете PHPSTORM, перейдите в Настройки, затем перейдите к

  • Test Frameworks

    и нажмите + и выберите

  • PHPUnit Local тогда

  • Use Composer Auto Loader затем вставьте это, как в путь к полю сценария

  • C:\{YOUR PROJECT NAME}\vendor\autoload.php

  • нажмите ОК

  • HAPPY TESTING

Тахсин Алаа
источник
2

Проверьте файл phpunit.xml , загляните в тесты.

Моя версия phpunit (2019) ищет файлы с расширением (суффикс) * Test.php. Итак, убедитесь, что все тестовые файлы названы правильно (например: BookTest.php правильный, BookTests.php - нет, BookTestCase.php - нет).

Ян Пользер
источник
2

Пришел поздно на вечеринку, но эта информация может помочь другим.

Вышеупомянутые решения не помогли мне. Начиная с Laravel 7.x, по умолчанию PHPUnit выполняет только файлы PHP с суффиксом «Test.php». Например, если вы создаете тест, присвоение ему имени CreateUserне сработает, тогда как присвоение имени CreateUserTestбудет работать.

Чтобы преодолеть ограничение, перейдите phpunit.xmlи измените suffixатрибут из directoryэлементов:

...
<testsuite name="Unit">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Unit</directory>

</testsuite>
<testsuite name="Feature">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Feature</directory>

</testsuite>
...

Это даст указание PHPUnit запускать все файлы с .phpрасширениями из каталогов. Примечание по очистке кеша приложения после обновления phpunit.xml:

php artisan config:cache

Дополнительную информацию о конфигурации XML PHPUnit можно найти здесь: https://phpunit.de/manual/6.5/en/appendixes.configuration.html

user8555937
источник
1

Вы добавили набор тестов в файл phpunit.xml?

<phpunit>
    <testsuite name="app1" >
        <directory>./</directory>
    </testsuite>
</phpunit>

Вы можете добавить туда несколько каталогов.

Aine
источник
Привет, извините, если я не уточнил в вопросе, но я добавил тестовый набор и соответствующее имя в XML-файл. Копию можно найти здесь: pastebin.com/0j0L4WBD .
Muyiwa Olu,
Попробуйте <directory> ./tests </directory>
Aine,
Спасибо за обновление, к сожалению, у меня все еще та же проблема с ./tests в качестве моего каталога. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu
К сожалению, та же проблема :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Он определенно работает, когда я вручную ссылаюсь на него, ему просто не нравится загрузка из файла конфигурации по какой-то причине :(
Muyiwa Olu
Последнее предположение. Попробуйте переместить файл phpunit.xml в каталог tests /. В файле измените каталог на <directory> ./ </directory>.
Aine
0

Для меня использование phpunit --debug показало мне, какой тест он не выполнял, внутри у меня было

$this->visit('/')
         ->see('Laravel');

и я думаю, поскольку каталог был защищен аутентификацией .htaccess, он не мог пройти, чтобы посетить страницу

Решением для меня было пройти этот тест (или, скорее всего, отключить аутентификацию .htaccess).

повторение
источник
0

Это очень поздно, но я надеюсь, что это кому-то поможет.

Я запустил свои тесты, используя абсолютную ссылку. структура папок [проект / тесты / test.php]

моя строка каталога выглядела так ./tests/test.php

Codebender
источник
0

Возможно, немного сбоку, но если вы (как и я) используете Laravel в Vagrant, убедитесь, что вы запускаете phpunit внутри бродячего окна, а не на «стороне окна». :)

мартинэтил
источник
0

У меня была проблема с тем, что тесты не выполнялись, даже когда все было настроено нормально.

Причина заключалась в том, что пространство имен было не первой командой файла, а после некоторых комментариев блока документации.

возврат заставил phpunit увидеть тесты и работать правильно.

pgee70
источник
0

Мой был немного забавным.

Когда я использовал php artisan make:testя случайно поставил .php как ProductRewardPointController.phpсоздавшие ProductRewardPointController.php.phpи PHPUnit просто игнорировала его.

Я просто удаляю лишний .php и все возвращается в норму

Апит Джон Исмаил
источник
0

У меня была такая же проблема : Тесты не выполнялись! , решается сохранением того же имени файла и имени класса .

Будто
источник
0

Если вы используете IDE, такие как JetBrains PHPStorm , обратите внимание, что: в Run/Debug Configurationsокне Test scopeнеобходимо указать directoryи указать в этом каталоге, где testsнаходится ваша папка.

Мне потребовалось полчаса, чтобы понять, что я забыл установить каталог. Вы можете использовать global, phpunit.pharесли вы правильно настроили область тестирования и каталог, IDE будет обрабатывать другие вещи за вас.

ЖВТ
источник
0

Имена функций в тестовом файле должны иметь префикс testили комментарий перед функцией.

/** @test */

Убедитесь, что это не

/* @test */

потому что это не работает. после косой черты должно быть две звездочки, а не одна.

Мубашар Аббас
источник
-2

с помощью консоли de cmd эта проблема была решена, пройдя полный тест пути.

Я не нашел другого способа сделать это Так не работает

Надеюсь, это было кому-то полезно

mcrsftDev
источник