PHPUnit - „Nie wykonano testów” podczas korzystania z pliku konfiguracyjnego


89

Problem

Aby poprawić jakość kodu, postanowiłem spróbować nauczyć się testować mój kod przy użyciu testów jednostkowych zamiast moich miernych w najlepszym rozwiązaniach testowych.

Zdecydowałem się zainstalować PHPUnit przy użyciu kompozytora dla osobistej biblioteki, która pozwala mi na osiągnięcie wspólnych funkcji bazy danych. Na początku nie miałem pliku konfiguracyjnego dla PHPUnit i kiedy uruchamiałem polecenia takie jak:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Należy pamiętać, że jest to polecenie terminala, więc nie dołączyłem .phprozszerzenia. GeneralStringFunctionsTest, o którym mowa powyżej, jest w rzeczywistości GeneralStringFunctionsTest.phpplikiem.

Wynik jest taki, jakiego się spodziewałem:

Czas: 31 ms, pamięć: 2,75 Mb

OK (1 test, 1 asercja)

Następnie próbowałem użyć pliku konfiguracyjnego, aby automatycznie załadować zestaw testów, zamiast za każdym razem ręcznie wpisywać plik. Utworzyłem plik o nazwie phpunit.xmlw moim katalogu głównym i wprowadziłem do pliku: http://pastebin.com/0j0L4WBD :

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

Teraz, kiedy uruchomię polecenie:

phpunit

Otrzymuję następujący wynik:

PHPUnit 4.5.0 autorstwa Sebastiana Bergmanna i współpracowników.

Konfiguracja odczytana z /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Czas: 16 ms, pamięć: 1,50 Mb

Nie wykonano żadnych testów!

Na wypadek, gdyby było to pomocne, moja struktura katalogów jest następująca:
src - katalog najwyższego poziomu (z całym moim kodem źródłowym)
testy - katalog najwyższego poziomu (ze wszystkimi moimi testami, ma taką samą strukturę jak mój folder src )
dostawca - pliki stron trzecich Composer

Mam również plik Composer json i plik blokady, a także plik phpunit xml na najwyższym poziomie jako pliki.

Rzeczy, których próbowałem

  • Zmiana katalogu phpunit.xmlnatests/GeneralStringFunctions
  • Zmiana katalogu phpunit.xmlna./tests
  • Przeniesienie phpunit.xmlpliku do testskatalogu, a następnie zmiana katalogu na ./zamiast tests.
  • Dodanie atrybutu sufiksu do znacznika katalogu w programie w phpunit.xmlcelu określenia „Testy” jako jawnego przyrostka.

Czy tests/GeneralStringFunctions/GeneralStringFunctionsTestjest to nazwa folderu czy pliku?
hek2mgl

@ hek2mgl To nazwa pliku, tak naprawdę nazywa się GeneralStringFunctionsTest.php. W interfejsie wiersza poleceń nie wpisałem .phprozszerzenia, ponieważ działało bez niego.
Muyiwa Olu

1
OK, twoja konfiguracja powinna działać. Przy okazji, jeśli określisz sufiks, powinien on być Test.phpraczej niż Testw twoim przypadku, ale możesz go pominąć, ponieważ Test.phpjest to wartość domyślna.
hek2mgl

@ hek2mgl Dzięki za ostrzeżenie! Czy masz pojęcie, dlaczego mój test nie działa z plikiem konfiguracyjnym phpunit.xml?
Muyiwa Olu

Dlaczego nie pokażesz nam pliku konfiguracyjnego?
czwartek,

Odpowiedzi:


191

Jeśli chodzi o to, co jest warte (spóźnienie), natknąłem się na to niedawno, kiedy tworzyłem nowy projekt Laravel 5.1 dla prostej strony internetowej. Próbowałem go debugować i byłem zdezorientowany, gdy próbowałem:

php artisan make:test homeTest

(który ma domyślny test, który po prostu stwierdza, że ​​prawda jest prawdą)

i zobaczyłem wyjście

No tests executed!

To, co ostatecznie spowodowało problem, było związane z moją instalacją PHP - „phpunit” został globalnie zarejestrowany i skonfigurowany w inny sposób, podczas gdy phpunit dostarczony z instalacją Laravel został skonfigurowany prawidłowo i działał doskonale.

Tak więc poprawka polega na uruchomieniu skonfigurowanego phpunita dostawcy (z tego samego katalogu głównego, co app / i tests /):

./vendor/bin/phpunit

Mam nadzieję, że to pomoże komuś innemu!


4
Myślę, że to najprawdopodobniej poprawna odpowiedź. Od tego czasu usunąłem projekt, więc nie mam możliwości podwójnego sprawdzenia, ale w przyszłych projektach z kompozytorem zawsze używałem vendor/bin/phpunitzamiast globalnego phpunitpliku binarnego. Posunąłem się nawet do usunięcia globalnego phpunitpliku binarnego, więc nie popełnię ponownie przypadkowo tego samego błędu - i od tamtej pory nie pojawił się. Oznaczę to jako zaakceptowaną odpowiedź, ponieważ najprawdopodobniej jest to powód.
Muyiwa Olu

3
wywołanie ./vendor/bin/phpunitzałatwiło sprawę na nowej instalacji laravel 5.4
ira

Podobnie pomogło mi to podczas pracy nad projektem Wordpress. Ten sam problem: „phpunit” można zarejestrować globalnie i inaczej skonfigurować. Dziękuję za udostępnienie!
sqsinger,

To rozwiązało problem, ale czy istnieje sposób na globalne rozwiązanie problemu z phpunitem? Byłoby miło, gdybym mógł po prostu wpisaćphpunit
Noitidart

2
@Noitidart możesz utworzyć aliasfor ./vendor/bin/phpunit
Ganesh K

98

Twój plik XML jest w porządku. Musisz jednak upewnić się, że pliki PHP w twoim tests/folderze mają następujące nazwy:

testy / Test.php <--- Zanotuj wielkie litery „T”
testy / użytkownik Test.php
testy / fooBar Test.php
itd.

Nazwy plików muszą kończyć się na „Test.php” . Tego właśnie szuka PHPUnit w katalogach.

Ponadto każda metoda testowa musi mieć nazwę zaczynającą się od „test”:

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

Mam nadzieję, że to pomoże!


4
lub możesz użyć --test-suffix=anything.phpdo nadpisania
suma kontrolna

dla mnie przydatne było zastąpienie względnej ścieżki do folderu testowego ścieżką bezwzględną.
Timur Samkharadze

Jak mogę to zmienić w pliku konfiguracyjnym?
Jonathan

19

W systemie Windows użyj następującego polecenia na terminalu

.\vendor\bin\phpunit

to jeśli polecenie

phpunit

zwraca "Nie wykonano testów!"

podczas korzystania z komputera Mac

./vendor/bin/phpunit

Mam nadzieję, że to pomoże.


Dziękuję bardzo za odpowiedź, to naprawdę pomaga.
Goke Obasa

Upewnij się, że nie ma phpunitna Twojej ścieżce globalnej (możesz sprawdzić, czy działa coś takiego jak phpunit --versioni zobaczyć, czy pasuje do tego, czego się spodziewasz. Xampp zwykle instaluje phpunit w tym samym katalogu php bin. To był problem dla mnie.
giovannipds

12

Miałem ten sam problem po zaktualizowaniu PHPUnit na naszych maszynach wirtualnych do wersji 6. Nawet opcje --debug i --verbose nie powiedziały nic przydatnego, tylko „Nie wykonano żadnych testów”. Ostatecznie okazało się, że w nowej wersji zmieniono klasy i przestrzenie nazw i po prostu nie chciał uruchamiać plików, które zawierały odniesienia do starych klas. Rozwiązaniem dla mnie było po prostu zastąpienie w każdym przypadku testowym tego:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

z:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

Ach, tak, chociaż nie wygląda na to, że była to odpowiedź na pierwotne pytanie, rozwiązało mój problem po aktualizacji do 6.x!
Tama

To był problem podczas aktualizacji z PHPUnit 5.7 do 8.5 - dziękuję za wskazówkę!
potwierdzający

7

Zdaję sobie sprawę, że to bardzo stare, ale mi się to po prostu przydarzyło. Mam nadzieję, że to komuś pomoże.

Mój problem polegał na tym, że zapomniałem symbolu „@” w / ** @test * /

ŹLE:

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

DOBRZE:

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

1
ponad 2 lata później i to było dla mnie to. naprawdę musi to być format komentarza. Brakowało mi tam miejsca. nie wykrył tego. co jest trochę denerwujące, w laravel 6.1 użyłem polecenia artisan make i nie zawiera tego komentarza
aibarra

1
Ta odpowiedź jest przydatna
Sundar

Mam problem, kiedy tworzyłem pakiet. Kiedy uruchamiam „php artisan make: test SomeTest” i przenoszę go do katalogu testów pakietu, komentarz podstawowej metody testExample zawiera tylko podstawowy opis i @return voidnie zawiera „@test”, co jest powodem, dla którego phpunit nie mógł zidentyfikować to jako test.
DAMIEN JIANG

5

Ciągnąłem za włosy przez 10 minut, zanim zdecydowałem się użyć --debug (przy okazji), aby odkryć prosty fakt, że nazwa pliku nie jest zgodna z konwencją nazewnictwa , na końcu miałem dodatkowe „s” .

źle

CreateAdminTests

dobrze

CreateAdminTest

mam nadzieję, że ta notatka może komuś pomóc


Świetnie, mogłem potem przeprowadzić test
WindSaber



2

jeśli używasz PHPSTORM, przejdź do Ustawień i gotowe

  • Test Frameworks

    i kliknij + i wybierz

  • PHPUnit Local następnie

  • Use Composer Auto Loader następnie wklej to jak w ścieżce do pola skryptu

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

  • Kliknij OK

  • HAPPY TESTING


2

Sprawdź plik phpunit.xml , zajrzyj do zestawów testowych .

Moja wersja phpunit (2019) szuka plików z końcówką (sufiks) * Test.php. Dlatego upewnij się, że wszystkie pliki testowe mają prawidłowe nazwy (np .: BookTest.php jest poprawny, BookTests.php nie, BookTestCase.php nie).


2

Spóźniłem się na imprezę, ale ta informacja może pomóc innym.

Powyższe rozwiązania u mnie nie działają. Od Laravel 7.x, PHPUnit domyślnie wykonuje tylko pliki PHP z przyrostkiem „Test.php”. Na przykład, jeśli utworzysz test, nazwanie go CreateUsernie zadziała, podczas gdy nadanie mu nazwy CreateUserTestzadziała.

Aby pokonać to ograniczenie, przejdź do phpunit.xmli zmodyfikuj suffixatrybut z directoryelementów:

...
<testsuite name="Unit">

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

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

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

</testsuite>
...

To poinstruuje PHPUnit, aby uruchamiał wszystkie pliki z .phprozszerzeniami z katalogów. Uwaga dotycząca czyszczenia pamięci podręcznej aplikacji po aktualizacji phpunit.xml:

php artisan config:cache

Dodatkowe informacje o konfiguracji PHPUnit XML można znaleźć tutaj: https://phpunit.de/manual/6.5/en/appendixes.configuration.html


1

Czy dodałeś zestaw testów do pliku phpunit.xml?

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

Możesz tam dodać wiele katalogów.


Cześć, przepraszam, jeśli nie wyjaśniłem tego w pytaniu, ale dodałem zestaw testów i odpowiednią nazwę do pliku XML. Kopię można znaleźć tutaj: pastebin.com/0j0L4WBD .
Muyiwa Olu

Wypróbuj <directory> ./tests </directory>
Aine

Dzięki za aktualizację, niestety nadal mam ten sam problem z ./tests jak w moim katalogu. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu

Niestety ten sam problem :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Zdecydowanie działa, gdy ręcznie odwołuję się do niego, po prostu nie lubi ładowania z pliku konfiguracyjnego z jakiegoś powodu :(
Muyiwa Olu

Ostatnie przypuszczenie. Spróbuj przenieść plik phpunit.xml do katalogu tests /. W pliku zmień katalog na <directory> ./ </directory>.
Aine

0

Dla mnie użycie phpunit --debug pokazało mi, którego testu nie wykonywał, w środku

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

i myślę, że ponieważ katalog był chroniony przez uwierzytelnianie .htaccess, nie mógł przejść do odwiedzenia strony

Rozwiązaniem dla mnie było wykonanie tego testu (lub najprawdopodobniej wykupienie uwierzytelnienia .htaccess)


0

Jest już bardzo późno, ale mam nadzieję, że komuś to pomoże.

Moje testy mam do uruchomienia przy użyciu bezwzględnego odniesienia. struktura folderów [projekt / testy / test.php]

moja linia katalogu wyglądała tak ./tests/test.php


0

Może trochę z boku, ale jeśli (tak jak ja) używasz Laravel w Vagrant, upewnij się, że uruchamiasz phpunit w pudełku vagrant, a nie po stronie "okna". :)


0

Miałem problem z brakiem wykonywania testów, nawet gdy wszystko było dobrze skonfigurowane.

Przyczyną było to, że przestrzeń nazw nie była pierwszym poleceniem pliku, lecz po kilku komentarzach w bloku dokumentów.

przywracanie spowodowało, że phpunit zobaczył testy i działał poprawnie.


0

Mój był trochę zabawny.

Kiedy użyłem php artisan make:test, przypadkowo wstawiłem .php jak ProductRewardPointController.phpktóry utworzył, ProductRewardPointController.php.phpa phpunit po prostu go zignorował.

Po prostu usunąłem dodatkowy plik .php i wszystko wróciło do normy


0

Miałem ten sam problem Nie wykonano testów! , rozwiązany przez zachowanie tej samej nazwy pliku i nazwy klasy .


0

Jeśli używasz IDE, takich jak JetBrains PHPStorm , zwróć także uwagę, że: w Run/Debug Configurationsoknie, Test scopenależy ustawić directoryi wskazać ten katalog, gdzie znajduje się twój testsfolder.

Pół godziny zajęło mi zorientowanie się, że zapomniałem ustawić katalog. Możesz używać global, phpunit.pharo ile poprawnie ustawisz zakres testowy i katalog, IDE zajmie się innymi rzeczami za Ciebie.


0

Nazwy funkcji w pliku testowym muszą być poprzedzone prefiksem testlub przed funkcją należy dodać komentarz

/** @test */

Upewnij się, że tak nie jest

/* @test */

ponieważ to nie działa. po ukośniku muszą być dwie gwiazdki, a nie jedna.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.