Pourquoi, erreur fatale: la classe 'PHPUnit_Framework_TestCase' n'a pas été trouvée dans…?

127

Pourquoi j'obtiens cette erreur PHP?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Alvin
la source
9
Vous ne fournissez aucune information du tout.
Pekka
Exécutez vos tests via la ligne de commande phpunit. Il charge les classes nécessaires.
Demi
Vous pouvez également utiliser la réponse de la réponse suivante stackoverflow.com/questions/42811164/… pour garder votre code compatible avec PHPUnit 6 ainsi que les versions antérieures.
Robson

Réponses:

73

La documentation PHPUnit dit utilisé pour inclure / exiger PHPUnit / Framework.php, comme suit:

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

METTRE À JOUR

Depuis PHPUnit 3.5, il existe une classe de chargeur automatique intégrée qui gérera cela pour vous:

require_once 'PHPUnit/Autoload.php';

Merci à Phoenix pour l'avoir signalé!

définit
la source
14
PHPUnit 3.5 est livré avec son propre chargeur automatique qui pourrait aider à garder les choses simples: require_once 'PHPUnit/Autoload.php'
1
Je suis d'accord que require_once ('PHPUnit / Autoload.php') est la meilleure pratique.
Paul Maidment
1
Je n'ai pas les deux PHPUnit/Autoload.phpet PHPUnit/Framework/TestCase.phpmon dossier est un peu commePHPUnit/Framework/MockObject
Sufendy
4
et maintenant j'ai PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
Dennis
1
voir la réponse de @ shadi pour PHP 6+ stackoverflow.com/a/42561590/2883328
Dennis
237

Pour ceux qui arrivent ici après la mise à jour phpunit à la version 6 ou plus publiée le 03/02/2017 (par exemple avec le compositeur), vous pouvez obtenir cette erreur parce que le code de PHPUnit est maintenant un espace de noms (chèque changelog ).

Vous aurez besoin de factoriser des choses comme \PHPUnit_Framework_TestCaseà\PHPUnit\Framework\TestCase

shadi
la source
4
Merci, j'ai eu ce problème à cause de Travis CI utilisant la version la plus récente de PHPUnit sur leurs versions PHP 7. Ma solution consistait à télécharger manuellement un ancien phar et à l'utiliser à la place.
Chèvre mécontente
2
github.com/sebastianbergmann/phpunit/wiki/... c'est en haut des notes de version, mais je l'ai manqué
Qchmqs
Merci beaucoup, bon monsieur. J'arrive en effet ici après la mise à niveau vers la version 6.
h4ckNinja
J'étais vraiment ennuyé que mes tests aient soudainement cessé de fonctionner. J'ai fait une mise à jour du compositeur et il a mis à jour mon PHPunit à 6.1. Merci.
Jed Lynch
38

Pour une version supérieure de phpunit telle que 6.4, vous devez utiliser l'espace de noms PHPUnit \ Framework \ TestCase

utilisez TestCase à la place de PHPUnit_Framework_TestCase

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

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

}
Jijesh Cherrai
la source
Excellent cela a fonctionné pour moi car je
vous venez de copier la réponse de shadi
Adam
@Adam qui est shadi?
Jijesh Cherrai
Je ne sais pas une chose pareille. J'ai eu la même erreur alors
j'explore
13

Vous pouvez obtenir cette erreur car vous avez placé le fichier dans un espace de noms. Si c'est le cas, vous devrez spécifier que PHPUnit_Framework_TestCase se trouve dans l'espace de noms global en le précédant d'une barre oblique inverse:

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

J'ai soumis un PR brut pour démarrer la conversation pour corriger la documentation .

Bevan
la source
1
Oui, si vous avez fait cela: class YourNiceTest extends PHPUnit_Framework_TestCaseajoutez simplement le \ devant la classe étendue, comme dans class YourNiceTest extends \PHPUnit_Framework_TestCase- Cela a fonctionné pour moi, en utilisant Symfony 2.8et en incluant le phpunitfichier dans le composeur téléchargé en tant que dépendance locale avec"phpunit/phpunit": "^4.8"
Xavi Montero
12

J'exécutais des tests PHPUnit sur PHP5, puis je devais également prendre en charge PHP7. C'est ce que j'ai fait:

Dans composer.json:

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

Dans mon fichier d'amorçage PHPUnit (dans mon cas, /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');

En d'autres termes, cela fonctionnera pour les tests écrits à l'origine pour PHPUnit 4 ou 5, mais nécessaires pour fonctionner également sur PHPUnit 6.

Nino Škopac
la source
1
cette solution est importante si vous ne voulez pas toucher le code Civi \ Test mais devez être compatible avec le dernier test unitaire php basé sur un espace de noms
Shahadat Hossain Khan
6

Vous pouvez simplement installer PHPUnit pour exécuter des commandes ( 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

Exécuter un seul test

Et puis exécutez le test PHPunit:

phpunit test.php

Le contenu du fichier de test est le suivant:

<?php

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

    public function testSave()
    {

    }
}

Exécuter la suite de tests

Configuration de la suite de tests: demosuite.xml. demoest un répertoire contenant tous les tests. Les fichiers de test doivent être nommés par *_test.php( suffix).

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

La suite de tests s'exécute avec les commandes suivantes:

phpunit -c demosuite.xml --testsuite DemoTestSuite
radeklos
la source
3
Cela ne fonctionne plus car PHPUnit les plus récents ne prend plus en charge les anciens noms de classe tels que PHPUnit_Framework_TestCase. Vous devez vraiment utiliser... extends PHPUnit\Framework\TestCase
Mikko Rantalainen
Juste en disant que je devais d'abord mv phpunit /usr/local/bin/phpunit et ensuite sudo chmod +x /usr/local/bin/phpunit. Définir le fichier comme exécutable avant de le déplacer n'a jamais fonctionné sur Vagrant Ubuntu. Je ne sais pas pourquoi ... Mais au cas où quelqu'un aurait du mal avec ça, j'espère que cela aidera.
George Mylonas
4

Supposition:

Phpunit (3.7) est disponible dans l'environnement console.

Action:

Entrez la commande suivante dans la console:

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

Commentaires:

Vous n'avez pas besoin d'inclure quoi que ce soit dans les nouvelles versions de PHPUnit, sauf si vous ne souhaitez pas exécuter dans la console. Par exemple, exécuter des tests dans le navigateur.

svirk
la source
1

J'utilise ZF2 et je travaille pour moi lorsque je remplace 'PHPUnit_Framework_TestCase' par '\ PHPUnit \ Framework \ TestCase'

Alysson Vicuña de Oliveira
la source
0

Si vous avez Centos ou une autre distribution Linux, vous devez installer le package phpunit, je l'ai fait avec yum install phpunit et cela a fonctionné. Peut-être que vous pouvez avoir à ajouter un référentiel, mais je pense que cela doit fonctionner correctement avec ceux par défaut (j'ai CentOS 7)

Ricardo Herrero
la source
0

Il se peut que vous exécutiez des tests de base de WordPress et que vous ayez récemment mis à jour votre PhpUnit vers la version 6. Si tel est le cas, alors la récente modification de l'espace de noms dans PhpUnit aura cassé votre code.

Heureusement, il existe un correctif pour les tests de base sur https://core.trac.wordpress.org/changeset/40547 qui contournera le problème. Il inclut également les modifications apportées à travis.yml, que vous n'avez peut-être pas dans votre configuration; si tel est le cas, vous devrez modifier le fichier .diff pour ignorer le patch Travis.

  1. Téléchargez le patch "Unified Diff" en bas de https://core.trac.wordpress.org/changeset/40547
  2. Modifiez le fichier de patch pour supprimer la partie Travis du patch si vous n'en avez pas besoin. Supprimer du haut du fichier juste au-dessus de cette ligne:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
  3. Enregistrez le diff dans le répertoire au-dessus de votre répertoire / includes / - dans mon cas, il s'agissait du répertoire Wordpress lui-même

  4. Utilisez l'outil de patch Unix pour patcher les fichiers. Vous devrez également supprimer les premières barres obliques pour passer d'une structure de répertoire absolue à une structure de répertoire relative. Comme vous pouvez le voir au point 3 ci-dessus, il y a cinq barres obliques avant le répertoire d'inclusion, dont un indicateur -p5 se débarrassera pour vous.

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

Après avoir fait cela, mes tests se sont à nouveau déroulés correctement.

piersb
la source
0

REMARQUER: commande php bin/console generate:doctrine:crudcrée également TestControllerdans src/Testsafin qu'elle puisse générer une erreur lorsque vous essayez de démarrer le serveur si vous ne l'avez pas UnitTests. Supprimez le fichier corrigez-le!

MorganFreeFerme
la source
0

Pour moi, c'est parce que j'ai couru

$ phpunit .

au lieu de

$ phpunit

quand j'avais déjà un phpunit.xmlfichier configuré dans le répertoire de travail.

cyberbit
la source
0

J'utilise php 5.6 sur la fenêtre 10 avec la version zend 1.12 pour moi en ajoutant

require_once 'PHPUnit / Autoload.php';

avant

la classe abstraite Zend_Test_PHPUnit_ControllerTestCase étend PHPUnit_Framework_TestCase

travaillé. Nous devons ajouter cette déclaration ci-dessus dans le fichier ControllerTestCase.php

Shankar
la source