PHPUnit - "Nessun test eseguito" quando si utilizza il file di configurazione


89

Il problema

Per migliorare la mia qualità del codice, ho deciso di provare a imparare a testare il mio codice utilizzando Unit Testing invece delle mie soluzioni di test mediocri.

Ho deciso di installare PHPUnit utilizzando il compositore per una libreria personale che mi permette di ottenere funzioni di database comuni. All'inizio non avevo un file di configurazione per PHPUnit e quando ho eseguito comandi come:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Tieni presente che questo è un comando da terminale, quindi non ho incluso l' .phpestensione. Il GeneralStringFunctionsTest di cui sopra è in realtà un GeneralStringFunctionsTest.phpfile.

L'output è quello che mi aspettavo:

Tempo: 31 ms, Memoria: 2.75Mb

OK (1 test, 1 affermazione)

Ho quindi provato a utilizzare un file di configurazione per caricare automaticamente la suite di test invece di dover digitare manualmente il file ogni volta. Ho creato un file chiamato phpunit.xmlnella mia directory principale e ho inserito quanto segue nel file: http://pastebin.com/0j0L4WBD :

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

Ora, quando eseguo il comando:

phpunit

Ottengo il seguente output:

PHPUnit 4.5.0 di Sebastian Bergmann e collaboratori.

Configurazione letta da /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Tempo: 16 ms, Memoria: 1.50Mb

Nessun test eseguito!

Nel caso sia utile, la struttura della mia directory è la seguente:
src - Directory di primo livello (con tutto il mio codice sorgente)
test - Directory di primo livello (con tutti i miei test, strutturata come la mia cartella src )
fornitore - Compositore file di terze parti

Ho anche il json del compositore e il file di blocco, nonché il file xml phpunit nel livello superiore come file.

Cose che ho provato

  • Modifica della directory in phpunit.xml atests/GeneralStringFunctions
  • Modifica della directory in phpunit.xml a./tests
  • Spostare il phpunit.xmlfile nella testsdirectory e quindi modificare la directory in modo che sia ./invece ditests .
  • Aggiunta di un attributo suffisso al tag di directory in phpunit.xmlper specificare "Test" come suffisso esplicito.

È tests/GeneralStringFunctions/GeneralStringFunctionsTestuna cartella o un nome di file?
hek2mgl

@ hek2mgl È un nome di file, in realtà si chiama GeneralStringFunctionsTest.php. Nell'interfaccia della riga di comando, non ho inserito l' .phpestensione perché funzionava senza di essa.
Muyiwa Olu

1
OK, allora la tua configurazione dovrebbe funzionare. A proposito, se specifichi un suffisso dovrebbe essere Test.phppiuttosto che Testnel tuo caso, ma tuttavia, sei libero di ometterlo poiché Test.phpè il valore predefinito.
hek2mgl

@ hek2mgl Grazie per l'avvertimento! Hai idea del motivo per cui il mio test non viene eseguito con il file di configurazione phpunit.xml?
Muyiwa Olu

Perché non ci mostri il file di configurazione?
gio

Risposte:


190

Per quello che vale (essendo in ritardo), mi sono imbattuto in questo di recente mentre stavo realizzando un nuovo progetto Laravel 5.1 per un semplice sito web. Ho provato a eseguire il debug e sono rimasto confuso quando ho provato:

php artisan make:test homeTest

(che ha un test predefinito che afferma solo che è vero)

e ho visto l'uscita

No tests executed!

Il problema alla fine per me era correlato alla mia installazione di PHP: "phpunit" era registrato globalmente e configurato in modo diverso, mentre phpunit fornito con l'installazione di Laravel era configurato correttamente e funzionava perfettamente.

Quindi la correzione sta eseguendo phpunit configurata dal fornitore (dalla stessa directory principale di app / e test /):

./vendor/bin/phpunit

Spero che aiuti qualcun altro!


4
Penso che questa sia molto probabilmente la risposta corretta. Da allora ho rimosso il progetto quindi non ho modo di ricontrollare, ma per progetti futuri con composer, ho sempre usato al vendor/bin/phpunitposto del phpunitbinario globale . Sono persino arrivato al punto di rimuovere il phpunitbinario globale, quindi non commetto di nuovo accidentalmente lo stesso errore - e da allora non è più saltato fuori. La contrassegnerò come la risposta accettata, poiché molto probabilmente è la ragione.
Muyiwa Olu

3
chiamando ha ./vendor/bin/phpunitfatto il trucco per me su una nuova installazione di laravel 5.4
ira

Allo stesso modo, questo mi ha aiutato mentre lavoravo a un progetto Wordpress. Lo stesso problema: "phpunit" può essere registrato globalmente e configurato in modo diverso. Grazie per aver condiviso!
sqsinger

Questo ha risolto il problema per me, ma esiste un modo per correggere globalmente l'unità php? Sarebbe bello se phpunit
potessi

2
@Noitidart puoi creare un aliasper ./vendor/bin/phpunit
Ganesh K

98

Il tuo file XML va bene così com'è. Tuttavia, devi assicurarti che i file PHP nel tuotests/ cartella siano denominati come segue:

tests / Test.php <--- Nota la "T" maiuscola
test / utente Test.php
tests / fooBar Test.php
ecc.

I nomi dei file devono terminare con "Test.php" . Questo è ciò che PHPUnit sta cercando nelle directory.

Inoltre, ogni metodo di test deve avere un nome che inizi con "test":

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

Spero che aiuti!


4
oppure puoi utilizzare --test-suffix=anything.phpper eseguire l'override
checksum

per me è stato utile sostituire il percorso relativo alla cartella di test con il percorso assoluto.
Timur Samkharadze

Come faccio a sovrascriverlo nel file di configurazione?
Jonathan

19

Su Windows usa il seguente comando sul terminale

.\vendor\bin\phpunit

questo è se il comando

phpunit

restituisce "Nessun test eseguito!"

mentre su Mac

./vendor/bin/phpunit

Spero che sia d'aiuto.


Grazie mille per la tua risposta, questo aiuta davvero.
Goke Obasa

Assicurati che non ci siano phpunitnel tuo percorso globale (puoi controllare che sia in esecuzione qualcosa di simile phpunit --versione vedere se corrisponde a ciò che ti aspetti. Xampp di solito installa un'unità php nella stessa directory bin php. Questo era il problema per me.
giovannipds

12

Ho avuto lo stesso problema dopo PHPUnit sulle nostre macchine virtuali aggiornato alla versione 6. Anche --debug e --verbose non dicevano nulla di utile, solo "Nessun test eseguito". Alla fine si è scoperto che le classi e gli spazi dei nomi erano stati modificati nella nuova versione e semplicemente non voleva eseguire i file che contenevano riferimenti a vecchie classi. La soluzione per me era solo sostituire in ogni caso di test questo:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

con:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

Ah, sì, anche se non sembra che questa fosse la risposta alla domanda originale, ha risolto il mio problema dopo l'aggiornamento a 6.x!
Tama

Questo è stato il problema per me anche durante l'aggiornamento da PHPUnit 5.7 a 8.5 - grazie per il suggerimento!
confermatore

7

Mi rendo conto che è super vecchio, ma è successo anche a me. Si spera che questo aiuti qualcuno.

Il mio problema era che avevo dimenticato il simbolo "@" in / ** @test * /

SBAGLIATO:

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

GIUSTO:

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

1
più di 2 anni dopo, e questo era tutto per me. deve essere esattamente quel formato per il commento. avevo uno spazio mancante lì dentro. non l'ha rilevato. ciò che è un po 'fastidioso, in laravel 6.1 ho usato il comando artisan make e non include quel commento
aibarra

1
Questa risposta è utile
domenica

Mi sono imbattuto nel problema durante lo sviluppo di un pacchetto. Quando eseguo "php artisan make: test SomeTest" e lo sposto nella directory tests del pacchetto, il commento del metodo testExample di base contiene solo una descrizione di base @return voide non contiene "@test", che è il motivo per cui phpunit non è riuscito a identificare come prova.
DAMIEN JIANG

5

Mi sono tirato i capelli per 10 minuti prima di decidere di usare --debug (un buon modo per andare a proposito) per scoprire il semplice fatto che il nome del file non rispettava la convenzione di denominazione , avevo una "s" in più alla fine .

sbagliato

CreateAdminTests

giusto

CreateAdminTest

spero che questa nota possa aiutare qualcuno


Fantastico, sono stato in grado di eseguire il test dopo
WindSaber

4

Hai solo bisogno di chiamarlo dal file del fornitore

vendor\bin\phpunit Avviso \ Non /



2

se stai usando PHPSTORM vai su Impostazioni poi vai a

  • Test Frameworks

    e fai clic su + e scegli

  • PHPUnit Local poi

  • Use Composer Auto Loader quindi incolla questo come nel percorso del campo dello script

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

  • fare clic su OK

  • HAPPY TESTING


2

Controlla il file phpunit.xml , guarda all'interno di testsuites.

La mia versione di phpunit (2019) sta cercando file che terminano (suffisso) * Test.php. Quindi, assicurati che tutti i file di prova siano denominati correttamente (es .: BookTest.php è corretto, BookTests.php non lo è, BookTestCase.php non lo è).


2

È arrivato tardi alla festa, ma queste informazioni potrebbero aiutare gli altri.

Le soluzioni di cui sopra non hanno funzionato per me. A partire da Laravel 7.x, per impostazione predefinita, PHPUnit esegue solo file PHP con suffisso "Test.php". Ad esempio, se crei un test, nominarlo CreateUsernon funzionerà, mentre nominarlo CreateUserTestfunzionerà.

Per superare la limitazione, vai a phpunit.xmle modifica l' suffixattributo dagli directoryelementi:

...
<testsuite name="Unit">

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

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

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

</testsuite>
...

Questo indicherà a PHPUnit di eseguire tutti i file con .phpestensione dalle directory. Nota per cancellare la cache dell'app dopo l'aggiornamento phpunit.xml:

php artisan config:cache

Ulteriori informazioni sulla configurazione XML di PHPUnit possono essere trovate qui: https://phpunit.de/manual/6.5/en/appendixes.configuration.html


1

Hai aggiunto una suite di test al tuo file phpunit.xml?

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

Puoi aggiungere più directory lì.


Ciao, scusa se non ho chiarito nella domanda, ma ho aggiunto una suite di test e il nome corrispondente al file XML. Una copia può essere trovata qui: pastebin.com/0j0L4WBD .
Muyiwa Olu

Prova <directory> ./tests </directory>
Aine

Grazie per l'aggiornamento, purtroppo ricevo ancora lo stesso problema con ./tests della mia directory. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu

Sfortunatamente lo stesso problema :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Funziona sicuramente quando lo faccio riferimento manualmente, semplicemente non gli piace caricarlo dal file di configurazione per qualche motivo :(
Muyiwa Olu

Ultima ipotesi. Prova a spostare il file phpunit.xml nella directory tests /. Nel file, cambia la directory in <directory> ./ </directory>.
Aine

0

Per me, usando phpunit --debug mi ha mostrato quale test non era in esecuzione, all'interno, che avevo

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

e penso che poiché la directory era protetta con l'autenticazione .htaccess, non poteva passare per visitare la pagina

La soluzione per me era eseguire questo test (o molto probabilmente eliminare l'autenticazione .htaccess)


0

È molto tardi, ma spero che aiuti qualcuno.

Ho fatto eseguire i miei test utilizzando un riferimento assoluto. struttura delle cartelle [progetto / test / test.php]

la mia linea di directory assomigliava a questo ./tests/test.php


0

Un po 'sul lato forse, ma se stai (come me) usando Laravel in Vagrant, assicurati di eseguire phpunit all'interno della scatola vagabonda e non sul "lato di Windows". :)


0

Ho avuto il problema di non eseguire test, anche quando le cose erano impostate correttamente.

La causa era che lo spazio dei nomi non era il primo comando del file, ma dopo alcuni commenti sul blocco dei documenti.

il ripristino ha fatto sì che phpunit vedesse i test e funzionasse correttamente.


0

Il mio era un po 'divertente.

Quando l'ho usato php artisan make:testho accidentalmente inserito .php come quello ProductRewardPointController.phpcreato ProductRewardPointController.php.phpe phpunit lo ha semplicemente ignorato.

Ho solo eliminato il .php extra e le cose tornano alla normalità


0

Ho avuto lo stesso problema di Nessun test eseguito! , risolto mantenendo lo stesso nome del file e il nome della classe .


0

Se stai usando IDE come JetBrains PHPStorm , tieni presente anche che: nella Run/Debug Configurationsfinestra, Test scopedeve essere impostato directorye puntare a quella directory dove il tuotests trova la cartella.

Mi ci è voluta solo mezz'ora per capire che avevo dimenticato di impostare la directory. Puoi usare global phpunit.pharfintanto che imposti correttamente l'ambito del test e la directory, l'IDE gestirà altre cose per te.


0

I nomi delle funzioni nel file di test devono essere preceduti da un prefisso testoppure dovrebbe essere aggiunto un commento prima della funzione

/** @test */

Assicurati che non lo sia

/* @test */

perché non funziona. ci devono essere due asterischi dopo la barra non uno.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.