运行单个测试时找不到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_Framework_TestCase,但该类实际上称为PHPUnit_Framework_TestCase。现在这是棘手的事情

  • PHP 中的类名不区分大小写,这就是为什么当您运行整个测试套件并且类已经加载时它起作用的原因。
  • 自动加载器区分大小写,
  • 因为您的文件系统区分大小写,并且无法猜测正确的大小写。

因此,当您单独运行测试时,在包含测试用例文件之前不会加载类PHPUNIT_Framework_TestCase,自动加载器将查找文件PHPUNIT/Framework/TestCase.php而不是PHPUnit/Framework/TestCase.php。此文件不存在,您会收到"找不到类"错误。

溶液

取代

class TestThatFails extends PHPUNIT_Framework_TestCase

class TestThatFails extends PHPUnit_Framework_TestCase

PHPUnit 加载配置文件phpunit.xml(见这里),该文件实际上保存有关引导程序文件的信息

...
bootstrap="tests/bootstrap.php"
...

加载autoloaderbootstrap.php使所有这些类在应用中可用。

require __DIR__.'/../vendor/autoload.php';

autoload.php可能不包括在testThatFails.php中。autoload php加载PHPUNIT_Framework_TestCase以及可能与此情况相关的其他文件/类(其他一些单元测试类等)。恕我直言,除了将其包含在phpunit.xml中之外,最好的方法是将引导程序文件作为参数包含在命令中

phpunit --bootstrap bootstrap/autoload.php testThatFails.php