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


89

Проблема

Щоб покращити свою якість коду, я вирішив спробувати навчитися тестувати свій код за допомогою Unit Testing замість моїх посередніх у кращому варіанті тестування рішень.

Я вирішив встановити PHPUnit за допомогою композитора для особистої бібліотеки, що дозволяє мені досягти загальних функцій бази даних. Спочатку у мене не було файлу конфігурації для 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 і lock, а також файл 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

Чому б вам не показати нам файл конфігурації?
Чт,

Відповіді:


191

Для чого варто (запізнюватися), я зіткнувся з цим нещодавно, коли створював новий проект Laravel 5.1 для простого веб-сайту. Я спробував налагодити його, і збентежився, коли спробував:

php artisan make:test homeTest

(який має тест за замовчуванням, який просто стверджує, що істина - істина)

і побачив результат

No tests executed!

Проблема, якою виявилася для мене, пов'язана з моєю установкою PHP - "phpunit" був зареєстрований у всьому світі та налаштований по-різному, тоді як phpunit, який постачався з установкою Laravel, був налаштований правильно і працював ідеально.

Отже, виправлення запускає налаштований продавцем phpunit (з того самого кореневого каталогу, що і app / and 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"
тести / user Test.php
tests / fooBar Test.php
тощо.

Імена файлів повинні закінчуватися на "Test.php" . Це те, що PHPUnit шукає в каталогах.

Крім того, кожен метод тесту повинен мати назву, яка починається з "тест":

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

Сподіваюся, це допоможе!


4
або ви можете використати --test-suffix=anything.phpдля перевизначення
контрольну суму

для мене було корисно замінити відносний шлях до тестової папки абсолютним шляхом.
Тимур Самхарадзе

Як змінити це у файлі конфігурації?
Джонатан

19

У Windows використовуйте наступну команду на терміналі

.\vendor\bin\phpunit

це якщо команда

phpunit

повертає "Тестів не виконано!"

на Mac

./vendor/bin/phpunit

Сподіваюся, це допоможе.


Велике спасибі за вашу відповідь, це справді допомагає.
Гоке Обаса,

Переконайтеся, що 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!
Тама

Це була проблема для мене під час оновлення з 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

6

Я витягнув волосся 10 хвилин, перш ніж вирішив скористатися --debug (непоганим способом), щоб виявити той простий факт, що ім'я файлу не відповідало умовам іменування , у мене було зайве "s" в кінці .

неправильно

CreateAdminTests

правильно

CreateAdminTest

сподіваюся, ця нотатка може комусь допомогти



4

Вам потрібно просто зателефонувати йому з файлу постачальника

vendor\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

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


1

Ви додали тестовий пакет до свого файлу phpunit.xml?

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

Ви можете додати там кілька каталогів.


Привіт, вибачте, якщо я не пояснив у питанні, але додав набір тестів та відповідне ім’я до файлу 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!. Це, безумовно, працює, коли я вручну
посилаюся на

Остання здогадка. Спробуйте перемістити файл phpunit.xml у каталог tests /. У файлі змініть каталог на <directory> ./ </directory>.
Aine

0

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

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

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

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


0

Це дуже пізно, але я сподіваюся, це допоможе комусь.

Я отримав свої тести для запуску, використовуючи абсолютне посилання. структура папок [project / tests / test.php]

мій рядок каталогу виглядав так ./tests/test.php


0

Можливо, трохи збоку, але якщо ви (як я) використовуєте Laravel у Vagrant, переконайтеся, що ви запускаєте phpunit всередині бродячого вікна, а не на "боці вікон". :)


0

У мене було питання про тестування, яке не проводилось, навіть коли все було налаштовано нормально.

Причиною було те, що простір імен було не першою командою файлу, це було після деяких коментарів до блоку документів.

повернення призвело до того, що phpunit бачив тести та працював правильно.


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розташована ваша папка.

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


0

Імена функцій у тестовому файлі повинні мати префікс, testабо перед функцією повинен бути доданий коментар

/** @test */

Переконайтеся, що це не так

/* @test */

тому що це не працює. після косої риски має бути дві зірочки, а не одна.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.