Why, Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...?
Asked Answered
K

15

144

Why I'm getting this PHP error?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Kaikaia answered 19/5, 2011 at 22:53 Comment(3)
You are not providing any information at all.Shedd
Run your tests via the phpunit command-line. It loads up the necessary classes.Ambrosia
You can also use the answer from the following answer #42811664 to keep your code compatible with PHPUnit 6 as well as earlier versions.Blanks
A
74

The PHPUnit documentation says used to say to include/require PHPUnit/Framework.php, as follows:

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

UPDATE

As of PHPUnit 3.5, there is a built-in autoloader class that will handle this for you:

require_once 'PHPUnit/Autoload.php';

Thanks to Phoenix for pointing this out!

Amora answered 19/5, 2011 at 22:58 Comment(8)
PHPUnit 3.5 comes with its own autoloader that might help keep things simple: require_once 'PHPUnit/Autoload.php'Dressage
+1 Phoenix, I also recommend reading up on autoloading in PHP it can be fairly useful to write one's own autoloader script.Amora
I concur that require_once('PHPUnit/Autoload.php') is the best practice.Safety
I don't have both PHPUnit/Autoload.php and PHPUnit/Framework/TestCase.php, my folder is kind of like PHPUnit/Framework/MockObjectConstitution
Looks like the documentation has changed since I posted this answer. Sorry I can't really offer more insight, I haven't recently used PHPUnit - I just Googled the answer for this one ;)Amora
From where it will load the PHPUnit/Autoload.php and PHPUnit/Framework/TestCase.php as my folder only contains GShoppingContent.php as I want to use google base to upload items automaticallyBlau
and now I have PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'Ashwin
see @shadi's answer for PHP 6+ https://mcmap.net/q/158648/-why-fatal-error-class-39-phpunit_framework_testcase-39-not-found-inAshwin
S
283

For those arriving here after updating phpunit to version 6 or greater released on 2017-02-03 (e.g. with composer), you may be getting this error because phpunit code is now namespaced (check changelog changelog ).

You will need to refactor things like \PHPUnit_Framework_TestCase to \PHPUnit\Framework\TestCase

Update 2023-03-30: updated changelog link based on comment

Synchroflash answered 2/3, 2017 at 17:5 Comment(5)
Thanks, I had this problem due to Travis CI using the most recent PHPUnit version on their PHP 7 builds. My fix was to manually download an old phar and use that instead.Evelineevelinn
github.com/sebastianbergmann/phpunit/wiki/… it's on the top of the release notes, yet I missed itSha
Thank ye kindly, good sir. I am indeed arriving here after upgrading to version 6.Atomicity
I was getting really annoyed that my tests suddenly stopped working. I did a composer update and it updated my PHPunit to 6.1. Thank You.Islamism
Here is an update link as linked file is gone in phpunit repository: (check changelog)Lithic
A
74

The PHPUnit documentation says used to say to include/require PHPUnit/Framework.php, as follows:

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

UPDATE

As of PHPUnit 3.5, there is a built-in autoloader class that will handle this for you:

require_once 'PHPUnit/Autoload.php';

Thanks to Phoenix for pointing this out!

Amora answered 19/5, 2011 at 22:58 Comment(8)
PHPUnit 3.5 comes with its own autoloader that might help keep things simple: require_once 'PHPUnit/Autoload.php'Dressage
+1 Phoenix, I also recommend reading up on autoloading in PHP it can be fairly useful to write one's own autoloader script.Amora
I concur that require_once('PHPUnit/Autoload.php') is the best practice.Safety
I don't have both PHPUnit/Autoload.php and PHPUnit/Framework/TestCase.php, my folder is kind of like PHPUnit/Framework/MockObjectConstitution
Looks like the documentation has changed since I posted this answer. Sorry I can't really offer more insight, I haven't recently used PHPUnit - I just Googled the answer for this one ;)Amora
From where it will load the PHPUnit/Autoload.php and PHPUnit/Framework/TestCase.php as my folder only contains GShoppingContent.php as I want to use google base to upload items automaticallyBlau
and now I have PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'Ashwin
see @shadi's answer for PHP 6+ https://mcmap.net/q/158648/-why-fatal-error-class-39-phpunit_framework_testcase-39-not-found-inAshwin
A
53

For higher version of phpunit such as 6.4 You must use the namespace PHPUnit\Framework\TestCase

use TestCase instead PHPUnit_Framework_TestCase

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

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

}
Algiers answered 20/11, 2017 at 13:49 Comment(4)
Excellent this worked for me as I was following an old tutorialFrances
you just copied shadi's answerPapuan
@Papuan who is shadi?Algiers
I don't know such a thing. I got same error then I explore answer by cracking the packageAlgiers
Y
16

I was running PHPUnit tests on PHP5, and then, I needed to support PHP7 as well. This is what I did:

In composer.json:

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

In my PHPUnit bootstrap file (in my case, /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');

In other words, this will work for tests written originally for PHPUnit 4 or 5, but then needed to work on PHPUnit 6 as well.

Yoo answered 30/7, 2017 at 3:59 Comment(1)
this solution important if you want to not touch Civi\Test code but need compatible with latest namespace based php unit testCuriel
S
13

You may get this error because you namespaced the file. If so you will need to specify that PHPUnit_Framework_TestCase is in the global namespace by preceding it with a backslash:

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

I submitted a crude PR to start conversation for correcting the documentation.

Sewell answered 18/12, 2014 at 3:14 Comment(1)
Yes, if you did this: class YourNiceTest extends PHPUnit_Framework_TestCase just add the \ in front of the extended class, like in class YourNiceTest extends \PHPUnit_Framework_TestCase - This worked for me, using Symfony 2.8 and including the phpunit in the composer file downloaded as a local dependency with "phpunit/phpunit": "^4.8"Valorize
O
6

You can simply install PHPUnit to run commands (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

Run single test

And then run PHPunit test:

phpunit test.php

Content of test file is following:

<?php

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

    public function testSave()
    {

    }
}

Run test suite

Configuration of test suite: demosuite.xml. demo is directory containing all tests. Test files must be named as *_test.php (suffix).

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

Test suite runs with following commands:

phpunit -c demosuite.xml --testsuite DemoTestSuite
Orenorenburg answered 18/10, 2013 at 10:38 Comment(2)
This no longer works because latests PHPUnit no longer supports old class names such as PHPUnit_Framework_TestCase. You really have to use ... extends PHPUnit\Framework\TestCaseBriggs
Just saying that I had to first mv phpunit /usr/local/bin/phpunit and then sudo chmod +x /usr/local/bin/phpunit. Setting file as executable before moving it never worked on Vagrant Ubuntu. No idea why... But in case someone is struggling with this, I hope this will help.Sales
M
4

Assumption:

Phpunit (3.7) is available in the console environment.

Action:

Enter the following command in the console:

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

Comments:

You do not need to include anything in the new versions of PHPUnit unless you do not want to run in the console. For example, running tests in the browser.

Midway answered 22/3, 2013 at 15:20 Comment(0)
B
1

I use ZF2 and work for me when replaced 'PHPUnit_Framework_TestCase' to '\PHPUnit\Framework\TestCase'

Barrelchested answered 29/9, 2018 at 18:5 Comment(0)
I
1

I got it working with

include("vendor/autoload.php");

at the top of my test function.

Indetermination answered 11/6, 2021 at 20:3 Comment(0)
A
0

If you have Centos or other Linux distribution you have to install phpunit package, I did that with yum install phpunit and it worked. Maybe you can have to add a repository, but I think it has to work smooth with the default ones (I have CentOS 7)

Avellaneda answered 26/3, 2016 at 14:5 Comment(0)
H
0

It may well be that you're running WordPress core tests, and have recently upgraded your PhpUnit to version 6. If that's the case, then the recent change to namespacing in PhpUnit will have broken your code.

Fortunately, there's a patch to the core tests at https://core.trac.wordpress.org/changeset/40547 which will work around the problem. It also includes changes to travis.yml, which you may not have in your setup; if that's the case then you'll need to edit the .diff file to ignore the Travis patch.

  1. Download the "Unified Diff" patch from the bottom of https://core.trac.wordpress.org/changeset/40547
  2. Edit the patch file to remove the Travis part of the patch if you don't need that. Delete from the top of the file to just above this line:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
    
  3. Save the diff in the directory above your /includes/ directory - in my case this was the Wordpress directory itself

  4. Use the Unix patch tool to patch the files. You'll also need to strip the first few slashes to move from an absolute to a relative directory structure. As you can see from point 3 above, there are five slashes before the include directory, which a -p5 flag will get rid of for you.

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

After I did this my tests ran correctly again.

Housewife answered 18/5, 2017 at 14:52 Comment(0)
H
0

NOTICE: Command php bin/console generate:doctrine:crud also create TestController in src/Tests so it can throw error when you tried to start server if you don't have UnitTests. Remove the file fix it!

Hampden answered 16/1, 2019 at 10:6 Comment(0)
C
0

For me, it was because I ran

$ phpunit .

instead of

$ phpunit

when I already had a configured phpunit.xml file in the working directory.

Crandell answered 11/2, 2019 at 19:44 Comment(0)
S
0

I am using php 5.6 on window 10 with zend 1.12 version for me adding

require_once 'PHPUnit/Autoload.php';

before

abstract class Zend_Test_PHPUnit_ControllerTestCase extends PHPUnit_Framework_TestCase

worked. We need to add this above statement in ControllerTestCase.php file

Serve answered 10/9, 2019 at 14:21 Comment(0)
P
0

PHPUnit With Composer Autoloader

I am using composer and found myself battling through this issue. Neither the old style (PHPUnit_Framekwork_TestCase) or the new style (\PHPUnit\Framework\TestCase) worked for me. After reading through all the answers here and elsewhere, I found it to be quite trivial.

NOTE: PHP namespaces are case insensitive, however composer is case-sensitive...

// WRONG
class TestChild extends \PhpUnit\Framework\TestCase {

// RIGHT
class TestChild extends \PHPUnit\Framework\TestCase {

In the above example, note the change from \PhpUnit\... to \PHPUnit\....
This makes all the difference with the composer autoloader.

Package answered 21/3 at 16:54 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.