PHPUnit - 'Aucun test exécuté' lors de l'utilisation du fichier de configuration


89

Le problème

Pour améliorer ma qualité de code, j'ai décidé d'essayer d'apprendre à tester mon code à l'aide de tests unitaires au lieu de mes solutions de test médiocres au mieux.

J'ai décidé d'installer PHPUnit en utilisant composer pour une bibliothèque personnelle qui me permet de réaliser des fonctions de base de données communes. Au début, je n'avais pas de fichier de configuration pour PHPUnit et quand j'exécutais des commandes comme:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Veuillez noter qu'il s'agit d'une commande de terminal, je n'ai donc pas inclus l' .phpextension. Le GeneralStringFunctionsTest mentionné ci-dessus est en fait un GeneralStringFunctionsTest.phpfichier.

La sortie est ce que j'attendais:

Temps: 31 ms, Mémoire: 2.75Mb

OK (1 test, 1 assertion)

J'ai ensuite essayé d'utiliser un fichier de configuration pour charger automatiquement la suite de tests au lieu d'avoir à taper manuellement le fichier à chaque fois. J'ai créé un fichier appelé phpunit.xmldans mon répertoire racine et entré ce qui suit dans le fichier: http://pastebin.com/0j0L4WBD :

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

Maintenant, quand j'exécute la commande:

phpunit

J'obtiens la sortie suivante:

PHPUnit 4.5.0 par Sebastian Bergmann et contributeurs.

Configuration lue depuis /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Temps: 16 ms, Mémoire: 1.50Mb

Aucun test exécuté!

Au cas où cela serait utile, ma structure de répertoires est la suivante:
src -
Tests du répertoire de premier niveau (avec tout mon code source) - Répertoire de niveau supérieur (avec tous mes tests, structuré de la même manière que mon dossier src )
fournisseur - Fichiers tiers du compositeur

J'ai aussi le fichier composer json et lock, ainsi que le fichier xml phpunit au niveau supérieur en tant que fichiers.

Les choses que j'ai essayées

  • Modification du répertoire phpunit.xmlpourtests/GeneralStringFunctions
  • Modification du répertoire phpunit.xmlpour./tests
  • Déplacement du phpunit.xmlfichier vers le testsrépertoire, puis modification du répertoire en lieu et ./place de tests.
  • Ajout d'un attribut de suffixe à la balise d'annuaire phpunit.xmlpour spécifier "Tests" comme suffixe explicite.

Est-ce tests/GeneralStringFunctions/GeneralStringFunctionsTestun dossier ou un nom de fichier?
hek2mgl

@ hek2mgl C'est un nom de fichier, il s'appelle en fait GeneralStringFunctionsTest.php. Dans l'interface de ligne de commande, je n'ai pas entré l' .phpextension car cela fonctionnait sans elle.
Muyiwa Olu

1
OK, alors votre configuration devrait fonctionner. Btw, si vous spécifiez un suffixe, il devrait l'être Test.phpplutôt que Testdans votre cas, mais cependant, vous êtes libre de l'omettre puisque Test.phpc'est la valeur par défaut.
hek2mgl

@ hek2mgl Merci pour la tête! Avez-vous une idée de la raison pour laquelle mon test ne s'exécute pas avec le fichier de configuration phpunit.xml?
Muyiwa Olu

Pourquoi ne nous montrez-vous pas le fichier de configuration?
Jeu

Réponses:


190

Pour ce que ça vaut (être en retard), je suis tombé dessus récemment alors que je faisais un nouveau projet Laravel 5.1 pour un simple site Web. J'ai essayé de le déboguer et j'étais confus quand j'ai essayé:

php artisan make:test homeTest

(qui a un test par défaut qui affirme simplement que vrai est vrai)

et vu la sortie

No tests executed!

Ce que le problème a fini par être pour moi était lié à mon installation PHP - "phpunit" était globalement enregistré et configuré différemment, alors que le phpunit fourni avec l'installation de Laravel était parfaitement configuré et fonctionnait parfaitement.

Ainsi, le correctif exécute le phpunit configuré du fournisseur (à partir du même répertoire racine que app / et tests /):

./vendor/bin/phpunit

J'espère que cela aide quelqu'un d'autre!


4
Je pense que c'est probablement la bonne réponse. Depuis, j'ai supprimé le projet, je n'ai donc aucun moyen de le vérifier, mais pour les projets futurs avec composer, j'ai toujours utilisé à la vendor/bin/phpunitplace du phpunitbinaire global . Je suis même allé jusqu'à supprimer le phpunitbinaire global pour ne plus faire accidentellement la même erreur - et cela n'a pas surgi depuis. Je marquerai ceci comme la réponse acceptée, car c'est probablement la raison.
Muyiwa Olu

3
appeler a ./vendor/bin/phpunitfait l'affaire pour moi sur une nouvelle installation de laravel 5.4
ira

De même, cela m'a aidé tout en travaillant sur un projet Wordpress. Le même problème: "phpunit" peut être globalement enregistré et configuré différemment. Merci pour le partage!
sqsinger

Cela a résolu le problème pour moi, mais y a-t-il un moyen de réparer globalement le phpunit? Ce serait bien si je phpunit
pouvais

2
@Noitidart vous pouvez créer un aliaspour ./vendor/bin/phpunit
Ganesh K

98

Votre fichier XML est très bien tel quel. Cependant, vous devez vous assurer que les fichiers PHP de votre tests/dossier sont nommés comme suit:

tests / Test.php <--- Notez les
tests "T" majuscules / utilisateur Test.php
tests / fooBar Test.php
etc.

Les noms de fichiers doivent se terminer par "Test.php" . C'est ce que PHPUnit recherche dans les répertoires.

De plus, chaque méthode de test doit avoir un nom commençant par "test":

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

J'espère que ça t'as aidé!


4
ou vous pouvez utiliser --test-suffix=anything.phppour remplacer
checksum

pour moi, il était utile de remplacer le chemin relatif du dossier de test par un chemin absolu.
Timur Samkharadze

Comment remplacer cela dans le fichier de configuration?
Jonathan

19

Sous Windows, utilisez la commande suivante sur le terminal

.\vendor\bin\phpunit

c'est si la commande

phpunit

renvoie "Aucun test exécuté!"

sur Mac

./vendor/bin/phpunit

J'espère que cela aide.


Merci beaucoup pour votre réponse, cela aide vraiment.
Goke Obasa

Assurez-vous qu'il n'y a pas phpunitde chemin global (vous pouvez le vérifier en exécutant quelque chose comme phpunit --versionet voir si cela correspond à ce que vous attendez. Xampp installe généralement un phpunit dans le même répertoire bin php. C'était le problème pour moi.
giovannipds

12

J'ai eu le même problème après PHPUnit sur nos machines virtuelles mises à jour vers la version 6. Même --debug et --verbose n'ont rien dit d'utile, juste "Aucun test exécuté". En fin de compte, il s'est avéré que les classes et les espaces de noms avaient été modifiés dans la nouvelle version et qu'il ne voulait tout simplement pas exécuter les fichiers contenant des références à d'anciennes classes. Le correctif pour moi était juste de remplacer dans chaque cas de test ceci:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

avec:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

Ah, oui, même si cela ne semble pas être la réponse à la question initiale, cela a résolu mon problème après la mise à niveau vers 6.x!
Tama

C'était le problème pour moi lors de la mise à niveau de PHPUnit 5.7 vers 8.5 également - merci pour le conseil!
confirmateur le

7

Je me rends compte que c'est super vieux, mais ça m'est arrivé aussi. J'espère que cela aidera quelqu'un.

Mon problème était que j'avais oublié le symbole «@» dans / ** @test * /

FAUX:

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

DROITE:

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

1
plus de 2 ans plus tard, et c'était tout pour moi. il doit vraiment s'agir exactement de ce format pour le commentaire. J'avais un espace manquant là-dedans. il ne l'a pas détecté. ce qui est un peu ennuyeux, dans laravel 6.1, j'ai utilisé la commande artisanale make et cela n'inclut pas ce commentaire
aibarra

1
Cette réponse est utile
Sundar

Je rencontre le problème lorsque je développe un package. Lorsque j'exécute 'php artisan make: test SomeTest' et que je l'ai déplacé dans le répertoire des tests du package, le commentaire de la méthode de base testExample ne contient qu'une description de base @return voidet ne contient pas '@test', raison pour laquelle phpunit n'a pas pu identifier cela comme un test.
DAMIEN JIANG

5

Je me suis tiré les cheveux pendant 10 minutes avant de décider d'utiliser --debug (bon chemin d'ailleurs) pour découvrir le simple fait que le nom de fichier ne respectait pas la convention de dénomination , j'avais un "s" supplémentaire à la fin .

faux

CreateAdminTests

droite

CreateAdminTest

j'espère que cette note pourra aider quelqu'un


Super, j'ai pu faire des tests après ça
WindSaber

4

Vous avez juste besoin de l'appeler à partir du fichier du fournisseur

vendor\bin\phpunit Avis \ Pas /



2

si vous utilisez PHPSTORM, allez dans Paramètres puis allez

  • Test Frameworks

    et cliquez sur + et choisissez

  • PHPUnit Local puis

  • Use Composer Auto Loader puis collez-le comme dans le champ Chemin d'accès au script

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

  • cliquez sur OK

  • HAPPY TESTING


2

Vérifiez le fichier phpunit.xml , regardez à l'intérieur des suites de tests.

Ma version de phpunit (2019) recherche des fichiers se terminant par (suffixe) * Test.php. Donc, assurez-vous que tous les fichiers de test sont nommés correctement (ex.: BookTest.php est correct, BookTests.php ne l'est pas, BookTestCase.php ne l'est pas).


2

Je suis arrivé en retard à la fête, mais cette information peut aider les autres.

Les solutions ci-dessus n'ont pas fonctionné pour moi. Depuis Laravel 7.x, par défaut, PHPUnit n'exécute que les fichiers PHP qui sont suffixés avec "Test.php". Par exemple, si vous créez un test, le nommer CreateUserne fonctionnera pas, tandis que le nommer CreateUserTestfonctionnera.

Pour surmonter la limitation, accédez à phpunit.xmlet modifiez l' suffixattribut des directoryéléments:

...
<testsuite name="Unit">

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

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

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

</testsuite>
...

Cela demandera à PHPUnit d'exécuter tous les fichiers avec l' .phpextension des répertoires. Remarque pour vider le cache de l'application après la mise à jour phpunit.xml:

php artisan config:cache

Des informations supplémentaires sur la configuration XML de PHPUnit sont disponibles ici: https://phpunit.de/manual/6.5/en/appendixes.configuration.html


1

Avez-vous ajouté une suite de tests à votre fichier phpunit.xml?

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

Vous pouvez y ajouter plusieurs répertoires.


Salut, désolé si je ne l'ai pas précisé dans la question, mais j'ai ajouté une suite de tests et le nom correspondant au fichier XML. Une copie peut être trouvée ici: pastebin.com/0j0L4WBD .
Muyiwa Olu

Essayez <directory> ./tests </directory>
Aine

Merci pour la mise à jour, malheureusement, j'ai toujours le même problème avec ./tests que mon répertoire. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu

Malheureusement, le même problème :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Cela fonctionne certainement lorsque je le référence manuellement, cela n'aime tout simplement pas le chargement à partir du fichier de configuration pour une raison quelconque :(
Muyiwa Olu

Dernière estimation. Essayez de déplacer le fichier phpunit.xml dans le répertoire tests /. Dans le fichier, changez le répertoire en <directory> ./ </directory>.
Aine

0

Pour moi, utiliser phpunit --debug m'a montré quel test il n'exécutait pas, à l'intérieur, j'avais

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

et je pense que comme le répertoire était protégé par l'authentification .htaccess, il ne pouvait pas accéder à la page

La solution pour moi était de passer ce test (ou très probablement de supprimer l'authentification .htaccess)


0

C'est très tard mais j'espère que cela aide quelqu'un.

J'ai fait exécuter mes tests en utilisant une référence absolue. structure des dossiers [projet / tests / test.php]

ma ligne de répertoire ressemblait à ceci ./tests/test.php


0

Un peu sur le côté peut-être, mais si vous utilisez (comme moi) Laravel dans Vagrant, assurez-vous que vous exécutez phpunit à l'intérieur de la boîte vagrant et non du "côté windows". :)


0

J'ai eu le problème de ne pas exécuter de tests, même lorsque les choses étaient bien configurées.

La cause était que l'espace de noms n'était pas la première commande du fichier, c'était après quelques commentaires de doc-block.

le retour a fait en sorte que phpunit voit les tests et s'exécute correctement.


0

Le mien était un peu drôle.

Quand j'ai utilisé, php artisan make:testj'ai accidentellement mis .php comme ProductRewardPointController.phpqui a créé ProductRewardPointController.php.phpet phpunit l'a simplement ignoré.

Je viens de supprimer le .php supplémentaire et les choses reviennent à la normale


0

J'ai eu le même problème de Aucun test exécuté! , résolu en gardant le même nom de fichier et le nom de classe .


0

Si vous utilisez des IDE comme JetBrains PHPStorm , veuillez également noter que: dans la Run/Debug Configurationsfenêtre, le Test scopedoit être défini directoryet pointer ce répertoire vers l'emplacement de votre testsdossier.

Il m'a fallu une demi-heure pour comprendre que j'avais oublié de définir le répertoire. Vous pouvez utiliser global phpunit.phartant que vous définissez correctement la portée du test et le répertoire, l'EDI gérera d'autres choses pour vous.


0

Les noms de fonction dans le fichier de test doivent être précédés d'un préfixe testou d'un commentaire doit être ajouté avant la fonction

/** @test */

Assurez-vous que ce n'est pas

/* @test */

parce que cela ne fonctionne pas. il doit y avoir deux astérisques après la barre oblique pas un.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.