PHPUNIT_Framework_TestCase 运行 单测时未发现
PHPUNIT_Framework_TestCase not found when running single test
我正在尝试通过 Laravel 5.2.10 使用 PHPUnit 测试。我在我的项目中本地安装了 PHPUnit 5.1.4。
当我运行:
phpunit
PHPUnit 运行 完美地在我的 test
目录中进行了所有测试。
然而,当我运行:
phpunit tests/unit/testThatFails.php
我得到:
PHP Fatal error: Class 'PHPUNIT_Framework_TestCase' not found in ...
奇怪的是,当我 运行 phpunit 时,它成功地 运行 测试目录中的每个测试,包括这个 testThatFails.php
就好了。
为什么当我尝试 运行 一次测试时它会崩溃?
更新:
这是我的 phpunit.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">app/</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
</phpunit>
更新:
目前,由于我使用的是 Laravel,我通过扩展 TestCase
而不是 PHPUNIT_Framework_TestCase
来规避 这个问题,并且我的测试能够 运行 符合预期。然而,这只是一种规避,而不是解决方案。 (考虑到 TestCase
本身确实最终从 PHPUNIT_Framework_TestCase
.
延伸出来的事实,这对我来说也很奇怪
PHPUnit 加载配置文件 phpunit.xml
(参见 here),该文件实际上包含有关 bootstrap 文件
的信息
...
bootstrap="tests/bootstrap.php"
...
它是 bootstrap.php
加载 autoloader
从而使所有这些 类 在您的应用程序中可用。
require __DIR__.'/../vendor/autoload.php';
autoload.php
,大概,不在testThatFails.php
。 autoload php
加载 PHPUNIT_Framework_TestCase
以及可能与此案例相关的其他 files/classes(其他一些单元测试 类 等)。恕我直言,除了将其包含在 phpunit.xml
中之外,最好的方法是将 bootstrap 文件作为参数包含在命令
中
phpunit --bootstrap bootstrap/autoload.php testThatFails.php
消息说 PHPUNIT_Framework_TestCase
,但 class 实际上称为 PHPUnit_Framework_TestCase
。现在这是棘手的事情
- Class PHP 中的名称不区分大小写,这就是当您 运行 整个测试套件和 class 已经加载时它起作用的原因。 但是
- 自动加载器区分大小写,因为您的文件系统区分大小写,它无法猜测正确的大小写。
因此,当您 运行 单独测试时, class PHPUNIT_Framework_TestCase
在包含您的测试用例文件之前不会加载,自动加载器将查找文件 PHPUNIT/Framework/TestCase.php
而不是 PHPUnit/Framework/TestCase.php
。此文件不存在,您收到 "class not found" 错误。
解决方案
替换
class TestThatFails extends PHPUNIT_Framework_TestCase
和
class TestThatFails extends PHPUnit_Framework_TestCase
我正在尝试通过 Laravel 5.2.10 使用 PHPUnit 测试。我在我的项目中本地安装了 PHPUnit 5.1.4。
当我运行:
phpunit
PHPUnit 运行 完美地在我的 test
目录中进行了所有测试。
然而,当我运行:
phpunit tests/unit/testThatFails.php
我得到:
PHP Fatal error: Class 'PHPUNIT_Framework_TestCase' not found in ...
奇怪的是,当我 运行 phpunit 时,它成功地 运行 测试目录中的每个测试,包括这个 testThatFails.php
就好了。
为什么当我尝试 运行 一次测试时它会崩溃?
更新:
这是我的 phpunit.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">app/</directory>
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
</php>
</phpunit>
更新:
目前,由于我使用的是 Laravel,我通过扩展 TestCase
而不是 PHPUNIT_Framework_TestCase
来规避 这个问题,并且我的测试能够 运行 符合预期。然而,这只是一种规避,而不是解决方案。 (考虑到 TestCase
本身确实最终从 PHPUNIT_Framework_TestCase
.
PHPUnit 加载配置文件 phpunit.xml
(参见 here),该文件实际上包含有关 bootstrap 文件
...
bootstrap="tests/bootstrap.php"
...
它是 bootstrap.php
加载 autoloader
从而使所有这些 类 在您的应用程序中可用。
require __DIR__.'/../vendor/autoload.php';
autoload.php
,大概,不在testThatFails.php
。 autoload php
加载 PHPUNIT_Framework_TestCase
以及可能与此案例相关的其他 files/classes(其他一些单元测试 类 等)。恕我直言,除了将其包含在 phpunit.xml
中之外,最好的方法是将 bootstrap 文件作为参数包含在命令
phpunit --bootstrap bootstrap/autoload.php testThatFails.php
消息说 PHPUNIT_Framework_TestCase
,但 class 实际上称为 PHPUnit_Framework_TestCase
。现在这是棘手的事情
- Class PHP 中的名称不区分大小写,这就是当您 运行 整个测试套件和 class 已经加载时它起作用的原因。 但是
- 自动加载器区分大小写,因为您的文件系统区分大小写,它无法猜测正确的大小写。
因此,当您 运行 单独测试时, class PHPUNIT_Framework_TestCase
在包含您的测试用例文件之前不会加载,自动加载器将查找文件 PHPUNIT/Framework/TestCase.php
而不是 PHPUnit/Framework/TestCase.php
。此文件不存在,您收到 "class not found" 错误。
解决方案
替换
class TestThatFails extends PHPUNIT_Framework_TestCase
和
class TestThatFails extends PHPUnit_Framework_TestCase