Почему, фатальная ошибка: класс «PHPUnit_Framework_TestCase» не найден в…?

127

Почему я получаю эту ошибку PHP?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Alvin
источник
9
Вы вообще не предоставляете никакой информации.
Пекка
Запустите свои тесты через командную строку phpunit. Загружает необходимые классы.
Halfstop
Вы также можете использовать ответ из следующего ответа stackoverflow.com/questions/42811164/…, чтобы ваш код был совместим с PHPUnit 6, а также с более ранними версиями.
Робсон

Ответы:

73

В документации PHPUnit говорится, что раньше говорилось, что нужно включать / требовать PHPUnit / Framework.php, как показано ниже:

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

ОБНОВИТЬ

Начиная с PHPUnit 3.5, есть встроенный класс автозагрузчика, который сделает это за вас:

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.phpи того PHPUnit/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
Деннис
237

Для тех, кто прибыл сюда после обновления phpunit до версии 6 или выше, выпущенной 03.02.2017 (например, с помощью composer), вы можете получить эту ошибку, потому что код phpunit теперь находится в пространстве имен (проверьте журнал изменений ).

Вам нужно будет реорганизовать вещи , как \PHPUnit_Framework_TestCaseк\PHPUnit\Framework\TestCase

Шади
источник
4
Спасибо, у меня возникла эта проблема из-за того, что Travis CI использовал самую последнюю версию PHPUnit в своих сборках PHP 7. Мое решение заключалось в том, чтобы вручную загрузить старый 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 {

}
Джиджеш Черрай
источник
Отлично, это сработало для меня, так как я следовал старому руководству
вы только что скопировали ответ Шади
Адам
@ Адам, кто такой Шади?
Jijesh Cherrai
Я такого не знаю. У меня
такая
13

Вы можете получить эту ошибку, потому что вы разместили файл в пространстве имен. В таком случае вам нужно будет указать, что PHPUnit_Framework_TestCase находится в глобальном пространстве имен, поставив перед ним обратную косую черту:

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

Я отправил грубый пиар, чтобы начать разговор об исправлении документации .

Беван
источник
1
Да, если вы сделали это: class YourNiceTest extends PHPUnit_Framework_TestCaseпросто добавьте \ перед расширенным классом, как в class YourNiceTest extends \PHPUnit_Framework_TestCase- Это сработало для меня, используя Symfony 2.8и включая phpunitв файл композитора, загруженный как локальную зависимость с"phpunit/phpunit": "^4.8"
Xavi Montero
12

Я запускал тесты PHPUnit на PHP5, а потом мне также понадобилась поддержка 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 на основе пространства имен
Шахадат Хоссейн Хан
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
radeklos
источник
3
Это больше не работает, потому что последняя версия PHPUnit больше не поддерживает старые имена классов, такие как PHPUnit_Framework_TestCase. Вы действительно должны использовать... extends PHPUnit\Framework\TestCase
Микко Ранталайнен 01
Просто говорю, что я должен был сначала, 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, если только вы не хотите запускать в консоли. Например, запуск тестов в браузере.

SVIRK
источник
1

Я использую ZF2 и работаю на меня, когда заменил PHPUnit_Framework_TestCase на \ PHPUnit \ Framework \ TestCase

Алиссон Викунья де Оливейра
источник
0

Если у вас есть Centos или другой дистрибутив Linux, вам необходимо установить пакет phpunit, я сделал это с помощью yum install phpunit, и он сработал. Возможно, вам придется добавить репозиторий, но я думаю, что он должен работать гладко с репозиториями по умолчанию (у меня CentOS 7)

Рикардо Эрреро
источник
0

Вполне возможно, что вы запускаете основные тесты WordPress и недавно обновили свой PhpUnit до версии 6. Если это так, то недавнее изменение пространств имен в PhpUnit нарушит ваш код.

К счастью, на https://core.trac.wordpress.org/changeset/40547 есть патч для основных тестов, который поможет обойти проблему. Он также включает изменения в travis.yml, которых может не быть в вашей настройке; в этом случае вам необходимо отредактировать файл .diff, чтобы игнорировать патч Travis.

  1. Загрузите патч "Unified Diff" снизу https://core.trac.wordpress.org/changeset/40547.
  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 

После этого мои тесты снова прошли правильно.

piersb
источник
0

ВНИМАНИЕ: Команда php bin/console generate:doctrine:crudтакже создает TestControllerв, src/Testsпоэтому она может выдать ошибку при попытке запустить сервер, если у вас ее нет UnitTests. Удалите файл, исправьте!

MorganFreeFarm
источник
0

Для меня это было потому, что я бежал

$ phpunit .

вместо того

$ phpunit

когда у меня уже был настроенный phpunit.xmlфайл в рабочем каталоге.

Cyberbit
источник
0

Я использую php 5.6 в окне 10 с версией zend 1.12 для добавления

require_once 'PHPUnit / Autoload.php';

перед

абстрактный класс Zend_Test_PHPUnit_ControllerTestCase расширяет PHPUnit_Framework_TestCase

работал. Нам нужно добавить этот оператор в файл ControllerTestCase.php.

Шанкар
источник