Warum, schwerwiegender Fehler: Klasse 'PHPUnit_Framework_TestCase' nicht gefunden in ...?

127

Warum bekomme ich diesen PHP-Fehler?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Alvin
quelle
9
Sie geben überhaupt keine Informationen an.
Pekka
Führen Sie Ihre Tests über die Befehlszeile von phpunit aus. Es lädt die notwendigen Klassen auf.
Halfstop
Sie können auch die Antwort aus der folgenden Antwort stackoverflow.com/questions/42811164/… verwenden , um Ihren Code mit PHPUnit 6 sowie früheren Versionen kompatibel zu halten.
Robson

Antworten:

73

In der PHPUnit-Dokumentation heißt es, dass PHPUnit / Framework.php wie folgt eingeschlossen / benötigt wird:

require_once ('PHPUnit/Framework/TestCase.php');

AKTUALISIEREN

Ab PHPUnit 3.5 gibt es eine integrierte Autoloader-Klasse, die dies für Sie erledigt:

require_once 'PHPUnit/Autoload.php';

Vielen Dank an Phoenix für diesen Hinweis!

definiert
quelle
14
PHPUnit 3.5 kommt mit einem eigenen Autoloader, der helfen könnte, die Dinge einfach zu halten: require_once 'PHPUnit/Autoload.php'
1
Ich stimme zu, dass require_once ('PHPUnit / Autoload.php') die beste Vorgehensweise ist.
Paul Maidment
1
Ich habe nicht beide PHPUnit/Autoload.phpund PHPUnit/Framework/TestCase.phpmein Ordner ist wiePHPUnit/Framework/MockObject
Sufendy
4
und jetzt habe ich PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
Dennis
1
Siehe @ Shadis Antwort für PHP 6+ stackoverflow.com/a/42561590/2883328
Dennis
236

Für diejenigen, die nach der Aktualisierung von phpunit auf Version 6 oder höher, die am 03.02.2017 veröffentlicht wurde (z. B. mit Composer), hier ankommen , wird möglicherweise dieser Fehler angezeigt, da der phpunit-Code jetzt einen Namespace hat (siehe Änderungsprotokoll ).

Sie müssen Dinge Refactoring wie \PHPUnit_Framework_TestCasezu\PHPUnit\Framework\TestCase

Shadi
quelle
4
Vielen Dank, ich hatte dieses Problem, weil Travis CI die neueste PHPUnit-Version in ihren PHP 7-Builds verwendet hat. Mein Fix bestand darin, ein altes Phar manuell herunterzuladen und stattdessen zu verwenden.
DisgruntledGoat
2
github.com/sebastianbergmann/phpunit/wiki/… es steht oben in den
Versionshinweisen
Vielen Dank, guter Herr. Ich
komme
Ich war wirklich verärgert, dass meine Tests plötzlich nicht mehr funktionierten. Ich habe ein Composer-Update durchgeführt und mein PHPunit auf 6.1 aktualisiert. Danke.
Jed Lynch
38

Für eine höhere Version von phpunit wie 6.4 müssen Sie den Namespace PHPUnit \ Framework \ TestCase verwenden

Verwenden Sie stattdessen TestCase PHPUnit_Framework_TestCase

// use the following namespace
use PHPUnit\Framework\TestCase;

// extend using TestCase instead PHPUnit_Framework_TestCase
class SampleTest extends TestCase {

}
Jijesh Cherrai
quelle
Ausgezeichnet, das hat bei mir funktioniert, da ich einem alten Tutorial
Sie haben gerade Shadis Antwort kopiert
Adam
@ Adam wer ist Shadi?
Jijesh Cherrai
Ich weiß so etwas nicht. Ich habe den gleichen Fehler, dann
erkunde
13

Möglicherweise wird dieser Fehler angezeigt, weil Sie die Datei mit einem Namespace versehen haben. In diesem Fall müssen Sie angeben, dass sich PHPUnit_Framework_TestCase im globalen Namespace befindet, indem Sie einen Backslash voranstellen:

namespace AcmeInc\MyApplication\Tests
class StackTest extends \PHPUnit_Framework_TestCase {}

Ich reichte eine grobe PR ein , um ein Gespräch zur Korrektur der Dokumentation zu beginnen .

Bevan
quelle
1
Ja, wenn Sie dies getan haben: class YourNiceTest extends PHPUnit_Framework_TestCaseFügen Sie einfach das \ vor der erweiterten Klasse hinzu, wie in class YourNiceTest extends \PHPUnit_Framework_TestCase- Dies hat bei mir funktioniert, indem Sie Symfony 2.8die phpunitals lokale Abhängigkeit heruntergeladene Composer-Datei mit"phpunit/phpunit": "^4.8"
Xavi Montero vom
12

Ich habe PHPUnit-Tests auf PHP5 ausgeführt und musste dann auch PHP7 unterstützen. Das habe ich getan:

In composer.json:

"phpunit/phpunit": "~4.8|~5.7"

In meiner PHPUnit-Bootstrap-Datei (in meinem Fall /tests/bootstrap.php):

// PHPUnit 6 introduced a breaking change that
// removed PHPUnit_Framework_TestCase as a base class,
// and replaced it with \PHPUnit\Framework\TestCase
if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Framework\TestCase'))
    class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');

Mit anderen Worten, dies funktioniert für Tests, die ursprünglich für PHPUnit 4 oder 5 geschrieben wurden, dann aber auch für PHPUnit 6 benötigt werden.

Nino Škopac
quelle
1
Diese Lösung ist wichtig, wenn Sie den Civi \ Test-Code nicht berühren möchten, aber mit dem neuesten namespace-basierten PHP-Unit-Test kompatibel sein möchten
Shahadat Hossain Khan
6

Sie können PHPUnit einfach installieren, um Befehle auszuführen ( https://github.com/sebastianbergmann/phpunit/#php-archive-phar ):

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

Führen Sie einen einzelnen Test durch

Führen Sie dann den PHPunit-Test aus:

phpunit test.php

Der Inhalt der Testdatei lautet wie folgt:

<?php

class StackTest extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testSave()
    {

    }
}

Führen Sie die Testsuite aus

Konfiguration der Testsuite: demosuite.xml. demoist ein Verzeichnis, das alle Tests enthält. Testdateien müssen als *_test.php( suffix) benannt werden.

<testsuites>
    <testsuite name="DemoTestSuite">
        <directory suffix="test.php">demo</directory>
    </testsuite>
</testsuites>

Die Testsuite wird mit folgenden Befehlen ausgeführt:

phpunit -c demosuite.xml --testsuite DemoTestSuite
Radeklos
quelle
3
Dies funktioniert nicht mehr, da die neuesten PHPUnit alte Klassennamen wie z PHPUnit_Framework_TestCase. Sie müssen wirklich verwenden... extends PHPUnit\Framework\TestCase
Mikko Rantalainen
Ich sagte nur, dass ich zuerst mv phpunit /usr/local/bin/phpunitund dann musste sudo chmod +x /usr/local/bin/phpunit. Das Festlegen der Datei als ausführbare Datei vor dem Verschieben hat unter Vagrant Ubuntu nie funktioniert. Keine Ahnung warum ... Aber falls jemand damit zu kämpfen hat, hoffe ich, dass dies hilft.
George Mylonas
4

Annahme:

Phpunit (3.7) ist in der Konsolenumgebung verfügbar.

Aktion:

Geben Sie den folgenden Befehl in die Konsole ein:

SHELL> phpunit "{{PATH TO THE FILE}}"

Bemerkungen:

Sie müssen nichts in die neuen Versionen von PHPUnit aufnehmen, es sei denn, Sie möchten nicht in der Konsole ausgeführt werden. Zum Beispiel Tests im Browser ausführen.

svirk
quelle
1

Ich benutze ZF2 und arbeite für mich, wenn 'PHPUnit_Framework_TestCase' durch '\ PHPUnit \ Framework \ TestCase' ersetzt wird.

Alysson Vicuña de Oliveira
quelle
0

Wenn Sie Centos oder eine andere Linux-Distribution haben, müssen Sie das phpunit-Paket installieren. Ich habe das mit yum install phpunit gemacht und es hat funktioniert. Möglicherweise müssen Sie ein Repository hinzufügen, aber ich denke, es muss reibungslos mit den Standard-Repository funktionieren (ich habe CentOS 7).

Ricardo Herrero
quelle
0

Es kann durchaus sein, dass Sie WordPress-Kerntests ausführen und kürzlich Ihre PhpUnit auf Version 6 aktualisiert haben. Wenn dies der Fall ist, hat die kürzlich vorgenommene Änderung des Namespaces in PhpUnit Ihren Code beschädigt.

Glücklicherweise gibt es unter https://core.trac.wordpress.org/changeset/40547 einen Patch für die Kerntests, der das Problem umgeht. Es enthält auch Änderungen an travis.yml, die Sie möglicherweise nicht in Ihrem Setup haben. Wenn dies der Fall ist, müssen Sie die DIFF-Datei bearbeiten, um den Travis-Patch zu ignorieren.

  1. Laden Sie den Patch "Unified Diff" unten unter https://core.trac.wordpress.org/changeset/40547 herunter
  2. Bearbeiten Sie die Patch-Datei, um den Travis-Teil des Patches zu entfernen, wenn Sie dies nicht benötigen. Löschen Sie vom Anfang der Datei bis knapp über diese Zeile:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
  3. Speichern Sie den Unterschied im Verzeichnis über Ihrem Verzeichnis / include / - in meinem Fall war dies das Wordpress-Verzeichnis selbst

  4. Verwenden Sie das Unix-Patch-Tool, um die Dateien zu patchen. Sie müssen auch die ersten Schrägstriche entfernen, um von einer absoluten zu einer relativen Verzeichnisstruktur zu wechseln. Wie Sie unter Punkt 3 oben sehen können, befinden sich vor dem Include-Verzeichnis fünf Schrägstriche, die durch ein -p5-Flag für Sie entfernt werden.

    $ cd [WORDPRESS DIRECTORY]
    $ patch -p5 < changeset_40547.diff 

Danach liefen meine Tests wieder korrekt.

piersb
quelle
0

HINWEIS: Der Befehl php bin/console generate:doctrine:crudcreate TestControllerin wird ebenfalls erstellt, src/Testssodass beim Versuch, den Server zu starten, ein Fehler ausgelöst werden kann, wenn dies nicht der Fall ist UnitTests. Entfernen Sie die Datei reparieren Sie es!

MorganFreeFarm
quelle
0

Für mich war es, weil ich rannte

$ phpunit .

anstatt

$ phpunit

als ich bereits eine konfigurierte phpunit.xmlDatei im Arbeitsverzeichnis hatte.

Cyberbit
quelle
0

Ich benutze PHP 5.6 unter Windows 10 mit Zend 1.12 Version für mich

require_once 'PHPUnit / Autoload.php';

Vor

Die abstrakte Klasse Zend_Test_PHPUnit_ControllerTestCase erweitert PHPUnit_Framework_TestCase

hat funktioniert. Wir müssen diese obige Anweisung in die Datei ControllerTestCase.php einfügen

Shankar
quelle