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.
Muyiwa Olu
źródło
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!

RoboBear
źródło
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!

Lionel
źródło
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.

Ndong Akwo
źródło
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 {...}
igors
źródło
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()
{
    ...
}
Brad Ahrens
źródło
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

chebaby
źródło
Świetnie, mogłem potem przeprowadzić test
WindSaber
4

Musisz tylko zadzwonić z pliku dostawcy

vendor\bin\phpunit Uwaga \ Nie /

Hamza Zymawy
źródło
3

Zamiast uruchamiać phpunit

posługiwać się

sprzedawca \ bin \ phpunit

Arun Ganesan
źródło
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

Tahseen Alaa
źródło
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).

Jan Polzer
źródło
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

user8555937
źródło
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.

Aine
źródło
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)

relipse
źródło
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

Codebender
źródło
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". :)

martinetyl
źródło
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.

pgee70
źródło
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

Apit John Ismail
źródło
0

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

Jak gdyby
źródło
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.

Zhwt
źródło
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.

Mubashar Abbas
źródło