132

为什么我收到这个 PHP 错误?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
4

14 回答 14

261

对于那些在将 phpunit 更新到 2017 年2 月 3 日发布的版本 6 或更高版本(例如使用 composer)后到达这里的人,您可能会收到此错误,因为 phpunit 代码现在已命名空间(检查changelog)。

\PHPUnit_Framework_TestCase您将需要重构诸如\PHPUnit\Framework\TestCase

于 2017-03-02T17:05:06.913 回答
74

PHPUnit文档 以前说 include/require PHPUnit/Framework.php,如下:

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

更新

从 PHPUnit 3.5 开始,有一个内置的自动加载器类可以为您处理这个问题:

require_once 'PHPUnit/Autoload.php';

感谢凤凰指出这一点!

于 2011-05-19T22:58:58.150 回答
49

对于更高版本的 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 {

}
于 2017-11-20T13:49:15.120 回答
15

我在 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 上工作。

于 2017-07-30T03:59:24.400 回答
13

您可能会收到此错误,因为您对文件进行了命名空间。如果是这样,您需要指定 PHPUnit_Framework_TestCase 在全局命名空间中,方法是在它前面加上一个反斜杠:

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

我提交了一份粗略的 PR以开始讨论以更正文档

于 2014-12-18T03:14:30.683 回答
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.php( suffix)。

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

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

phpunit -c demosuite.xml --testsuite DemoTestSuite
于 2013-10-18T10:38:16.393 回答
4

假设:

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

行动:

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

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

注释:

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

于 2013-03-22T15:20:03.203 回答
1

我使用 ZF2 并在将 'PHPUnit_Framework_TestCase' 替换为 '\PHPUnit\Framework\TestCase' 时为我工作

于 2018-09-29T18:05:17.597 回答
0

注意:命令php bin/console generate:doctrine:crud也会创建TestControllersrc/Tests因此当您尝试启动服务器时,如果您没有UnitTests. 删除文件修复它!

于 2019-01-16T10:06:26.823 回答
0

我得到了它的工作

include("vendor/autoload.php");

在我的测试功能的顶部。

于 2021-06-11T20:03:09.627 回答
0

如果你有 Centos 或其他 Linux 发行版,你必须安装 phpunit 包,我用 yum install phpunit 安装它并且它工作。也许您必须添加一个存储库,但我认为它必须与默认存储库一起工作(我有 CentOS 7)

于 2016-03-26T14:05:07.640 回答
0

对我来说,那是因为我跑了

$ phpunit .

代替

$ phpunit

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

于 2019-02-11T19:44:46.693 回答
0

很可能您正在运行 WordPress 核心测试,并且最近已将您的 PhpUnit 升级到版本 6。如果是这种情况,那么最近对 PhpUnit 中命名空间的更改将破坏您的代码。

幸运的是,在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 点可以看出,包含目录之前有五个斜杠,-p5 标志将为您删除。

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

在我这样做之后,我的测试再次正确运行。

于 2017-05-18T14:52:45.867 回答
0

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

require_once 'PHPUnit/Autoload.php';

抽象类 Zend_Test_PHPUnit_ControllerTestCase 扩展 PHPUnit_Framework_TestCase

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

于 2019-09-10T14:21:25.190 回答