PHPUnit - 'Keine Tests ausgeführt' bei Verwendung der Konfigurationsdatei


86

Das Problem

Um meine Codequalität zu verbessern, habe ich beschlossen, zu lernen, wie ich meinen Code mithilfe von Unit-Tests anstelle meiner mittelmäßig besten Testlösungen teste.

Ich habe mich entschieden, PHPUnit mit Composer für eine persönliche Bibliothek zu installieren, mit der ich gemeinsame Datenbankfunktionen erreichen kann. Zuerst hatte ich keine Konfigurationsdatei für PHPUnit und als ich Befehle ausführte wie:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Bitte beachten Sie, dass dies ein Terminalbefehl ist, daher habe ich die .phpErweiterung nicht eingefügt. Der oben erwähnte GeneralStringFunctionsTest ist eigentlich eine GeneralStringFunctionsTest.phpDatei.

Die Ausgabe ist das, was ich erwartet habe:

Zeit: 31 ms, Speicher: 2,75 MB

OK (1 Test, 1 Behauptung)

Ich habe dann versucht, eine Konfigurationsdatei zu verwenden, um die Testsuite automatisch zu laden, anstatt die Datei jedes Mal manuell eingeben zu müssen. Ich habe eine Datei erstellt, die phpunit.xmlin meinem Stammverzeichnis aufgerufen wurde, und Folgendes in die Datei eingegeben: http://pastebin.com/0j0L4WBD :

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

Wenn ich jetzt den Befehl ausführe:

phpunit

Ich erhalte folgende Ausgabe:

PHPUnit 4.5.0 von Sebastian Bergmann und Mitwirkenden.

Konfiguration aus /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml gelesen

Zeit: 16 ms, Speicher: 1,50 MB

Keine Tests ausgeführt!

Falls es hilfreich ist, sieht meine Verzeichnisstruktur wie folgt aus:
src -
Tests des Verzeichnisses der obersten Ebene (mit meinem gesamten Quellcode) - Verzeichnis des Verzeichnisses der obersten Ebene (mit allen meinen Tests, die genauso strukturiert sind wie mein Ordner src )
- Composer-Dateien von Drittanbietern

Ich habe auch die Composer JSON- und Lock-Datei sowie die PHPUNIT-XML-Datei in der obersten Ebene als Dateien.

Dinge, die ich versucht habe

  • Ändern Sie das Verzeichnis in phpunit.xmlzutests/GeneralStringFunctions
  • Ändern Sie das Verzeichnis in phpunit.xmlzu./tests
  • Verschieben Sie die phpunit.xmlDatei in das testsVerzeichnis und ändern Sie dann das Verzeichnis ./anstelle von tests.
  • Hinzufügen eines Suffix-Attributs zum Verzeichnis-Tag in phpunit.xml, um "Tests" als explizites Suffix anzugeben.

Ist tests/GeneralStringFunctions/GeneralStringFunctionsTestein Ordner oder ein Dateiname?
hek2mgl

@ hek2mgl Es ist ein Dateiname, er heißt eigentlich GeneralStringFunctionsTest.php. In der Befehlszeilenschnittstelle habe ich die .phpErweiterung nicht eingegeben, da sie ohne sie funktioniert hat.
Muyiwa Olu

1
OK, dann sollte Ihre Konfiguration funktionieren. Übrigens, wenn Sie ein Suffix angeben, sollte es Test.phpnicht Testin Ihrem Fall sein, aber Sie können dies weglassen, da dies Test.phpder Standardwert ist.
hek2mgl

@ hek2mgl Danke für das Heads Up! Haben Sie eine Idee, warum mein Test nicht mit der Konfigurationsdatei ausgeführt wird phpunit.xml?
Muyiwa Olu

Warum zeigen Sie uns nicht die Konfigurationsdatei?
ThW

Antworten:


189

Für das, was es wert ist (zu spät zu sein), bin ich kürzlich darauf gestoßen, als ich ein neues Laravel 5.1-Projekt für eine einfache Website erstellt habe. Ich habe versucht, es zu debuggen und war verwirrt, als ich versuchte:

php artisan make:test homeTest

(mit einem Standardtest, der nur bestätigt, dass wahr ist, ist wahr)

und sah die Ausgabe

No tests executed!

Was für mich das Problem war, hing mit meiner PHP-Installation zusammen - "phpunit" wurde global registriert und anders konfiguriert, während das mit der Laravel-Installation gelieferte phpunit genau richtig konfiguriert war und perfekt lief.

Das Update führt also die vom Hersteller konfigurierte PHPUNIT aus (aus demselben Stammverzeichnis wie app / und tests /):

./vendor/bin/phpunit

Hoffe das hilft jemand anderem!


4
Ich denke, das ist höchstwahrscheinlich die richtige Antwort. Ich habe das Projekt seitdem entfernt, damit ich es nicht noch einmal überprüfen kann, aber für zukünftige Projekte mit Composer habe ich immer vendor/bin/phpunitanstelle der globalen phpunitBinärdatei verwendet. Ich bin sogar so weit gegangen, die globale phpunitBinärdatei zu entfernen, damit ich nicht versehentlich denselben Fehler erneut mache - und sie ist seitdem nicht mehr aufgetaucht. Ich werde dies als akzeptierte Antwort markieren, da dies höchstwahrscheinlich der Grund ist.
Muyiwa Olu

3
Das Anrufen ./vendor/bin/phpunithat den Trick für mich auf einer neuen Laravel 5.4-Installation gemacht
ira

Ebenso hat mir dies bei der Arbeit an einem Wordpress-Projekt geholfen. Das gleiche Problem: "phpunit" kann global registriert und unterschiedlich konfiguriert werden. Ich danke Ihnen für das Teilen!
sqsinger

Das hat es für mich behoben, aber gibt es eine Möglichkeit, die phpunit global zu reparieren? Es wäre schön, wenn ich nur tippen könntephpunit
Noitidart

2
@ Noitidart können Sie eine aliasfür ./vendor/bin/phpunit
Ganesh K

97

Ihre XML-Datei ist in Ordnung. Sie müssen jedoch sicherstellen, dass die PHP-Dateien in Ihrem tests/Ordner wie folgt benannt sind:

tests / Test.php <--- Beachten Sie die Großbuchstaben "T"
tests / user Test.php
tests / fooBar Test.php
usw.

Die Dateinamen müssen mit "Test.php" enden . Dies ist, was PHPUnit in Verzeichnissen sucht.

Darüber hinaus muss jede Testmethode einen Namen haben, der mit "test" beginnt:

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

Hoffentlich hilft das!


4
oder Sie können verwenden --test-suffix=anything.php, um
Prüfsumme

Für mich war es nützlich, den relativen Pfad zum Testordner durch den absoluten Pfad zu ersetzen.
Timur Samkharadze

Wie überschreibe ich dies in der Konfigurationsdatei?
Jonathan

17

Verwenden Sie unter Windows den folgenden Befehl am Terminal

.\vendor\bin\phpunit

das ist wenn der Befehl

phpunit

gibt "Keine Tests ausgeführt!"

während auf dem Mac

./vendor/bin/phpunit

Ich hoffe es hilft.


Vielen Dank für Ihre Antwort, das hilft wirklich.
Goke Obasa

Stellen Sie sicher, dass sich phpunitauf Ihrem globalen Pfad kein Pfad befindet (Sie können überprüfen, phpunit --versionob er ausgeführt wird, um festzustellen, ob er Ihren Erwartungen entspricht. Xampp installiert normalerweise eine PHPUNIT unter demselben PHP-Bin-Verzeichnis. Das war das Problem für mich.
giovannipds

12

Ich hatte das gleiche Problem, nachdem PHPUnit auf unseren virtuellen Maschinen auf Version 6 aktualisiert wurde. Sogar --debug und --verbose sagten nichts Nützliches, nur "Keine Tests ausgeführt". Am Ende stellte sich heraus, dass Klassen und Namespaces in der neuen Version geändert wurden und die Dateien, die Verweise auf alte Klassen enthielten, einfach nicht ausgeführt werden wollten. Die Lösung für mich bestand darin, in jedem Testfall Folgendes zu ersetzen:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

mit:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}

Ah, ja, obwohl es nicht so aussieht, als wäre dies die Antwort auf die ursprüngliche Frage, hat es mein Problem nach dem Upgrade auf 6.x gelöst!
Tama

Dies war das Problem für mich beim Upgrade von PHPUnit 5.7 auf 8.5 - danke für den Tipp!
Bestätiger

7

Mir ist klar, dass das super alt ist, aber es ist mir auch passiert. Hoffentlich hilft das jemandem.

Mein Problem war, dass ich das '@' Symbol in / ** @test * / vergessen habe.

FALSCH:

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

RICHTIG:

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

1
über 2 Jahre später, und das war es für mich. Es muss wirklich genau das Format für den Kommentar sein. Ich hatte dort einen fehlenden Platz. es hat es nicht erkannt. was ein wenig nervig ist, in laravel 6.1 habe ich den handwerker make befehl verwendet und er enthält diesen kommentar nicht
aibarra

1
Diese Antwort ist nützlich
Sundar

Ich bin auf das Problem gestoßen, als ich ein Paket entwickelt habe. Wenn ich 'php artisan make: test SomeTest' ausführe und es in das Paket testverzeichnis verschiebe, enthält der Kommentar der grundlegenden testExample-Methode nur eine grundlegende Beschreibung und @return voidnicht '@test', weshalb phpunit ihn nicht identifizieren konnte es als Test.
DAMIEN JIANG

5

Ich zog 10 Minuten lang an meinen Haaren, bevor ich mich entschied, --debug (übrigens ein guter Weg) zu verwenden, um die einfache Tatsache zu entdecken, dass der Dateiname die Namenskonvention nicht respektierte. Am Ende hatte ich ein zusätzliches "s" .

falsch

CreateAdminTests

richtig

CreateAdminTest

Ich hoffe, diese Notiz könnte jemandem helfen


Großartig, ich konnte danach einen Test durchführen
WindSaber

4

Sie müssen es nur aus der Lieferantendatei aufrufen

vendor\bin\phpunit Hinweis \ Nicht /



2

Wenn Sie PHPSTORM verwenden, gehen Sie zu Einstellungen und dann zu

  • Test Frameworks

    und klicken Sie auf + und wählen Sie

  • PHPUnit Local dann

  • Use Composer Auto Loader Fügen Sie dies dann wie im Pfad zum Skriptfeld ein

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

  • OK klicken

  • HAPPY TESTING


2

Überprüfen Sie die Datei phpunit.xml und sehen Sie sich die Testsuiten an.

Meine Version von phpunit (2019) sucht nach Dateien, die enden (Suffix) * Test.php. Stellen Sie also sicher, dass alle Testdateien richtig benannt sind (Beispiel: BookTest.php ist korrekt, BookTests.php ist nicht korrekt, BookTestCase.php ist nicht korrekt).


1

Haben Sie Ihrer phpunit.xml-Datei eine Testsuite hinzugefügt?

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

Sie können dort mehrere Verzeichnisse hinzufügen.


Hallo, tut mir leid, wenn ich es in der Frage nicht klargestellt habe, aber ich habe der XML-Datei eine Testsuite und einen entsprechenden Namen hinzugefügt. Eine Kopie finden Sie hier: pastebin.com/0j0L4WBD .
Muyiwa Olu

Versuchen Sie <Verzeichnis> ./Tests </ Verzeichnis>
Aine

Vielen Dank für das Update, leider habe ich immer noch das gleiche Problem mit ./tests wie mein Verzeichnis. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu

Leider das gleiche Problem :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Es funktioniert definitiv, wenn ich es manuell referenziere, es mag es aus irgendeinem Grund nicht, aus der Konfigurationsdatei zu laden :(
Muyiwa Olu

Letzte Vermutung. Versuchen Sie, die Datei phpunit.xml in das Verzeichnis tests / zu verschieben. Ändern Sie in der Datei das Verzeichnis in <Verzeichnis> ./ </ Verzeichnis>.
Aine

0

Die Verwendung von phpunit --debug hat mir gezeigt, welchen Test ich nicht ausgeführt habe

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

und ich denke, da das Verzeichnis mit der .htaccess-Authentifizierung geschützt war, konnte es nicht durchkommen, um die Seite zu besuchen

Die Lösung für mich bestand darin, diesen Test durchzuführen (oder höchstwahrscheinlich die .htaccess-Authentifizierung durchzuführen).


0

Das ist sehr spät, aber ich hoffe, es hilft jemandem.

Ich habe meine Tests unter Verwendung einer absoluten Referenz ausführen lassen. Ordnerstruktur [project / tests / test.php]

Meine Verzeichniszeile sah so aus ./tests/test.php


0

Ein bisschen nebenbei vielleicht, aber wenn Sie (wie ich) Laravel in Vagrant verwenden, stellen Sie sicher, dass Sie phpunit in der Vagrant-Box und nicht auf der "Fensterseite" ausführen. :) :)


0

Ich hatte das Problem, dass keine Tests ausgeführt wurden, selbst wenn die Dinge gut eingerichtet waren.

Die Ursache war, dass der Namespace nicht der erste Befehl der Datei war, sondern nach einigen Kommentaren zum Blockieren von Dokumenten.

Durch das Zurücksetzen wurden die Tests von phpunit angezeigt und ordnungsgemäß ausgeführt.


0

Meins war ein bisschen lustig.

Als ich verwendet habe, habe php artisan make:testich versehentlich .php so gesetzt, wie es ProductRewardPointController.phperstellt wurde, ProductRewardPointController.php.phpund phpunit hat es einfach ignoriert.

Ich lösche einfach die zusätzliche .php und die Dinge wieder normal


0

Ich hatte die gleiche Ausgabe von Keine Tests ausgeführt! , gelöst, indem der Name der Datei und der Klassenname beibehalten werden.


0

Wenn Sie IDEs wie JetBrains PHPStorm verwenden , beachten Sie bitte Folgendes : Im Run/Debug ConfigurationsFenster Test scopemuss directorydas Verzeichnis so eingestellt sein, dass es auf das Verzeichnis verweist , in dem sich Ihr testsOrdner befindet.

Ich habe nur eine halbe Stunde gebraucht, um herauszufinden, dass ich vergessen habe, das Verzeichnis festzulegen. Sie können global verwenden phpunit.phar, solange Sie den Testbereich und das Verzeichnis korrekt eingestellt haben. Die IDE übernimmt andere Aufgaben für Sie.


0

Kam zu spät zur Party, aber diese Informationen können anderen helfen.

Die oben genannten Lösungen haben bei mir nicht funktioniert. Ab Laravel 7.x führt PHPUnit standardmäßig nur PHP-Dateien aus, denen das Suffix "Test.php" angehängt ist. Wenn Sie beispielsweise einen Test erstellen, CreateUserfunktioniert die Benennung nicht, während die Benennung CreateUserTestfunktioniert.

Um die Einschränkung zu überwinden, gehen Sie zu phpunit.xmlund ändern Sie das suffixAttribut von directoryElementen:

...
<testsuite name="Unit">

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

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

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

</testsuite>
...

Dadurch wird PHPUnit angewiesen, alle Dateien mit der .phpErweiterung aus Verzeichnissen auszuführen . Hinweis zum Löschen des App-Cache nach dem Update phpunit.xml:

php artisan config:cache

Weitere Informationen zur PHPUnit XML-Konfiguration finden Sie hier: https://phpunit.de/manual/6.5/en/appendixes.configuration.html


0

Den Funktionsnamen in der Testdatei muss entweder ein Präfix vorangestellt werden, testoder es sollte vor der Funktion ein Kommentar hinzugefügt werden

/** @test */

Stellen Sie sicher, dass dies nicht der Fall ist

/* @test */

weil das nicht funktioniert. Nach dem Schrägstrich müssen zwei Sternchen vorhanden sein, nicht eines.


-2

Die Verwendung der de cmd-Konsole hat dieses Problem behoben, indem der Test für den eingegebenen Pfad bestanden wurde

Ich habe keinen anderen Weg gefunden, es zu tun. Auf diese Weise funktioniert es nicht

Ich hoffe das war hilfreich für jemanden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.