为什么,致命错误:在…中找不到类“ PHPUnit_Framework_TestCase”?


Answers:


73

PHPUnit文档 过去常说,包括/需要的PHPUnit / Framework.php,如下所示:

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

更新

从PHPUnit 3.5开始,有一个内置的autoloader类将为您处理此问题:

require_once 'PHPUnit/Autoload.php';

感谢Phoenix指出这一点!


14
PHPUnit 3.5带有自己的自动加载器,该自动加载器可能有助于简化操作: require_once 'PHPUnit/Autoload.php'

1
我同意require_once('PHPUnit / Autoload.php')是最佳做法。
Paul Maidment,

1
我没有这两个PHPUnit/Autoload.phpPHPUnit/Framework/TestCase.php我的文件夹是一种像PHPUnit/Framework/MockObject
Sufendy

4
现在我有 PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
丹尼斯

1
参见@shadi对于PHP 6+的答案stackoverflow.com/a/42561590/2883328
Dennis,

237

对于那些将phpunit更新到2017-02-03上发布的版本6或更高版本(例如,使用作曲家)之后到达此处的用户,可能会收到此错误,因为phpunit代码现在已命名(请检查changelog)。

您将需要重构之类的东西\PHPUnit_Framework_TestCase\PHPUnit\Framework\TestCase


4
谢谢,由于Travis CI在其PHP 7构建中使用了最新的PHPUnit版本,因此出现了这个问题。我的解决方法是手动下载旧的Phar,然后改用它。
DisgruntledGoat

2
github.com/sebastianbergmann/phpunit/wiki/…在发行说明的顶部,但我错过了它
Qchmqs

谢谢你,先生。升级到版本6后,我确实到达了这里
。– h4ckNinja

我真的很生气,我的测试突然停止了工作。我做了一个作曲家更新,并将PHPunit更新为6.1。谢谢。
杰德·林奇

38

对于更高版本的phpunit(例如6.4), 必须使用命名空间PHPUnit \ Framework \ TestCase

使用TestCase代替PHPUnit_Framework_TestCase

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

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

}


您刚刚复制了沙迪的答案
亚当

@Adam是谁?
Jijesh Cherrai

我不知道这样的事。我遇到了同样的错误,然后通过破解软件包来探索答案
Jijesh Cherrai

13

您可能会收到此错误,因为您为文件命名空间。如果是这样,您需要通过在其前面加上反斜杠来指定PHPUnit_Framework_TestCase在全局名称空间中:

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

我提交了一个粗略的PR,开始进行对话以更正文档


1
是的,如果你这样做:class YourNiceTest extends PHPUnit_Framework_TestCase只需添加\在扩展类的面前,就像在class YourNiceTest extends \PHPUnit_Framework_TestCase-这为我工作,使用Symfony 2.8以及包括phpunit在下载为本地依赖性与作曲家文件"phpunit/phpunit": "^4.8"
哈维蒙特罗

12

我在PHP5上运行PHPUnit测试,然后,我也需要支持PHP7。这是我所做的:

在composer.json中:

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

在我的PHPUnit引导程序文件中(以我为例/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');

换句话说,这将适用于最初为PHPUnit 4或5编写的测试,但随后也需要在PHPUnit 6上工作。


1
如果您不想触摸Civi \ Test代码,但需要与最新的基于命名空间的php单元测试兼容,则此解决方案很重要
Shahadat Hossain Khan

6

您可以简单地安装PHPUnit来运行命令(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

运行单项测试

然后运行PHPunit测试:

phpunit test.php

测试文件的内容如下:

<?php

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

    public function testSave()
    {

    }
}

运行测试套件

测试套件的配置:demosuite.xml。demo是包含所有测试的目录。测试文件必须命名为*_test.phpsuffix)。

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

测试套件使用以下命令运行:

phpunit -c demosuite.xml --testsuite DemoTestSuite

3
这不再起作用,因为最新的PHPUnit不再支持旧的类名,例如PHPUnit_Framework_TestCase。您真的必须使用... extends PHPUnit\Framework\TestCase
Mikko Rantalainen

只是说我必须先mv phpunit /usr/local/bin/phpunit然后sudo chmod +x /usr/local/bin/phpunit。在移动文件之前将文件设置为可执行文件在Vagrant Ubuntu上无法使用。不知道为什么...但是如果有人为此而苦苦挣扎,我希望这会有所帮助。
乔治·米洛纳斯

4

假设:

Phpunit(3.7)在控制台环境中可用。

行动:

在控制台中输入以下命令:

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

注释:

除非您不想在控制台中运行,否则不需要在新版本的PHPUnit中包含任何内容。例如,在浏览器中运行测试。



0

如果您具有Centos或其他Linux发行版,则必须安装phpunit软件包,而我使用yum install phpunit做到了这一点,并且可以正常工作。也许您可能必须添加一个存储库,但是我认为它必须与默认存储库一起流畅运行(我有CentOS 7)


0

很有可能是您正在运行WordPress核心测试,并且最近已将您的PhpUnit升级到了版本6。

幸运的是,https: //core.trac.wordpress.org/changeset/40547上有一个针对核心测试的补丁,可以解决该问题。它还包括对travis.yml的更改,您可能没有在设置中进行更改;如果真是这样,那么您需要编辑.diff文件以忽略Travis补丁。

  1. https://core.trac.wordpress.org/changeset/40547的底部下载“ Unified Diff”补丁。
  2. 如果不需要,请编辑补丁文件以删除补丁的Travis部分。从文件顶部删除到此行的上方:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
  3. 将差异保存在/ includes /目录上方的目录中-在我的情况下,这是Wordpress目录本身

  4. 使用Unix修补程序工具修补文件。您还需要去除前几个斜杠,以从绝对目录结构转换为相对目录结构。从上面的第3点可以看出,include目录前有五个斜杠,-p5标志将为您消除。

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

完成此操作后,我的测试将再次正确运行。


0

注意:命令php bin/console generate:doctrine:crud也会TestController在in中创建,src/Tests因此如果您没有启动命令,则在尝试启动服务器时会引发错误UnitTests。删除文件修复吧!


0

对我来说,是因为我跑了

$ phpunit .

代替

$ phpunit

当我phpunit.xml在工作目录中已经有一个配置文件时。


0

我正在使用zend 1.12版本的窗口10上使用php 5.6为我添加

require_once'PHPUnit / Autoload.php';

之前

抽象类Zend_Test_PHPUnit_ControllerTestCase扩展了PHPUnit_Framework_TestCase

工作。我们需要在ControllerTestCase.php文件中添加以上语句

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.