Mengapa, Kesalahan fatal: Kelas 'PHPUnit_Framework_TestCase' tidak ditemukan di ...?

127

Kenapa saya mendapatkan kesalahan PHP ini?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Alvin
sumber
9
Anda sama sekali tidak memberikan informasi apa pun.
Pekka
Jalankan tes Anda melalui baris perintah phpunit. Itu memuat kelas yang diperlukan.
Halfstop
Anda juga dapat menggunakan jawaban dari jawaban berikut stackoverflow.com/questions/42811164/... untuk menjaga kode Anda kompatibel dengan PHPUnit 6 serta versi sebelumnya.
Robson

Jawaban:

73

The dokumentasi PHPUnit mengatakan digunakan untuk mengatakan untuk menyertakan / membutuhkan PHPUnit / Framework.php, sebagai berikut:

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

MEMPERBARUI

Pada PHPUnit 3.5, ada kelas autoloader bawaan yang akan menangani ini untuk Anda:

require_once 'PHPUnit/Autoload.php';

Terima kasih kepada Phoenix karena telah menunjukkan ini!

mendefinisikan
sumber
14
PHPUnit 3.5 hadir dengan autoloadernya sendiri yang mungkin membantu menyederhanakannya: require_once 'PHPUnit/Autoload.php'
1
Saya setuju bahwa require_once ('PHPUnit / Autoload.php') adalah praktik terbaik.
Paul Maidment
1
Saya tidak memiliki keduanya PHPUnit/Autoload.phpdan PHPUnit/Framework/TestCase.php, folder saya sepertiPHPUnit/Framework/MockObject
Sufendy
4
dan sekarang saya punya PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
Dennis
1
lihat jawaban @ shadi untuk PHP 6+ stackoverflow.com/a/42561590/2883328
Dennis
237

Bagi mereka yang tiba di sini setelah memperbarui phpunit ke versi 6 atau lebih besar dirilis pada 2017-02-03 (mis. Dengan komposer), Anda mungkin mendapatkan kesalahan ini karena kode phpunit sekarang namespaced (periksa changelog ).

Anda akan perlu untuk refactor hal-hal seperti \PHPUnit_Framework_TestCaseuntuk\PHPUnit\Framework\TestCase

shadi
sumber
4
Terima kasih, saya mengalami masalah ini karena Travis CI menggunakan versi PHPUnit terbaru pada versi PHP 7 mereka. Perbaikan saya adalah secara manual mengunduh phar lama dan menggunakannya sebagai gantinya.
DisgruntledGoat
2
github.com/sebastianbergmann/phpunit/wiki/… itu ada di bagian atas catatan rilis, namun saya melewatkannya
Qchmqs
Terima kasih, tuan. Saya memang tiba di sini setelah meningkatkan ke versi 6.
h4ckNinja
Saya menjadi sangat kesal karena tes saya tiba-tiba berhenti bekerja. Saya melakukan pembaruan komposer dan memutakhirkan PHPunit saya ke 6.1. Terima kasih.
Jed Lynch
38

Untuk versi phpunit yang lebih tinggi seperti 6.4 Anda harus menggunakan namespace PHPUnit \ Framework \ TestCase

gunakan TestCase sebagai gantinya PHPUnit_Framework_TestCase

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

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

}
Jijesh Cherrai
sumber
Sangat baik ini bekerja untuk saya karena saya mengikuti tutorial lama
Anda baru saja menyalin jawaban shadi
Adam
@ Adam siapa yang shadi?
Jijesh Cherrai
Saya tidak tahu hal seperti itu. Saya mendapat kesalahan yang sama kemudian saya mencari jawabannya dengan memecahkan paket
Jijesh Cherrai
13

Anda mungkin mendapatkan kesalahan ini karena Anda menempatkan file di tempat. Jika demikian, Anda harus menentukan bahwa PHPUnit_Framework_TestCase ada di namespace global dengan mendahului dengan backslash:

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

Saya mengirimkan PR kasar untuk memulai percakapan untuk memperbaiki dokumentasi .

Bevan
sumber
1
Ya, jika Anda melakukan ini: class YourNiceTest extends PHPUnit_Framework_TestCasetambahkan saja \ di depan kelas yang diperluas, seperti di class YourNiceTest extends \PHPUnit_Framework_TestCase- Ini berfungsi untuk saya, menggunakan Symfony 2.8dan termasuk phpunitdalam file komposer yang diunduh sebagai ketergantungan lokal dengan"phpunit/phpunit": "^4.8"
Xavi Montero
12

Saya menjalankan tes PHPUnit di PHP5, dan kemudian, saya perlu mendukung PHP7 juga. Inilah yang saya lakukan:

Dalam composer.json:

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

Dalam file bootstrap PHPUnit saya (dalam kasus saya, /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');

Dengan kata lain, ini akan berfungsi untuk tes yang awalnya ditulis untuk PHPUnit 4 atau 5, tetapi kemudian harus bekerja pada PHPUnit 6 juga.

Nino Škopac
sumber
1
solusi ini penting jika Anda ingin tidak menyentuh Civi \ Test code tetapi harus kompatibel dengan tes unit php berbasis namespace terbaru
Shahadat Hossain Khan
6

Anda cukup menginstal PHPUnit untuk menjalankan perintah ( 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

Jalankan tes tunggal

Dan kemudian jalankan uji PHPunit:

phpunit test.php

Isi file uji adalah sebagai berikut:

<?php

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

    public function testSave()
    {

    }
}

Jalankan test suite

Konfigurasi suite tes: demosuite.xml. demoadalah direktori yang berisi semua tes. File uji harus dinamai sebagai *_test.php( suffix).

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

Test suite dijalankan dengan perintah berikut:

phpunit -c demosuite.xml --testsuite DemoTestSuite
radeklos
sumber
3
Ini tidak lagi berfungsi karena PHPUnit terbaru tidak lagi mendukung nama kelas lama seperti PHPUnit_Framework_TestCase. Anda benar-benar harus menggunakan... extends PHPUnit\Framework\TestCase
Mikko Rantalainen
Hanya mengatakan bahwa saya harus pertama mv phpunit /usr/local/bin/phpunitdan kemudian sudo chmod +x /usr/local/bin/phpunit. Mengatur file sebagai executable sebelum memindahkannya tidak pernah bekerja di Vagrant Ubuntu. Tidak tahu kenapa ... Tapi kalau-kalau ada yang berjuang dengan ini, saya harap ini akan membantu.
George Mylonas
4

Anggapan:

Phpunit (3.7) tersedia di lingkungan konsol.

Tindakan:

Masukkan perintah berikut di konsol:

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

Komentar:

Anda tidak perlu memasukkan apa pun dalam versi baru PHPUnit kecuali Anda tidak ingin menjalankannya di konsol. Misalnya, menjalankan tes di browser.

svirk
sumber
1

Saya menggunakan ZF2 dan berfungsi untuk saya ketika mengganti 'PHPUnit_Framework_TestCase' menjadi '\ PHPUnit \ Framework \ TestCase'

Alysson Vicuña de Oliveira
sumber
0

Jika Anda memiliki Centos atau distribusi Linux lain Anda harus menginstal paket phpunit, saya melakukannya dengan yum instal phpunit dan itu berhasil. Mungkin Anda harus menambahkan repositori, tetapi saya pikir itu harus bekerja dengan lancar dengan yang standar (Saya punya CentOS 7)

Ricardo Herrero
sumber
0

Mungkin Anda menjalankan tes inti WordPress, dan baru-baru ini memutakhirkan PhpUnit Anda ke versi 6. Jika itu masalahnya, maka perubahan baru-baru ini untuk namespacing di PhpUnit akan merusak kode Anda.

Untungnya, ada tambalan ke tes inti di https://core.trac.wordpress.org/changeset/40547 yang akan mengatasi masalah tersebut. Ini juga termasuk perubahan pada travis.yml, yang mungkin tidak Anda miliki dalam pengaturan Anda; jika itu masalahnya maka Anda harus mengedit file .diff untuk mengabaikan tambalan Travis.

  1. Unduh tambalan "Unified Diff" dari bagian bawah https://core.trac.wordpress.org/changeset/40547
  2. Edit file tambalan untuk menghapus bagian Travis dari tambalan jika Anda tidak membutuhkannya. Hapus dari atas file hingga tepat di atas baris ini:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
  3. Simpan diff di direktori di atas direktori / include / Anda - dalam kasus saya ini adalah direktori Wordpress itu sendiri

  4. Gunakan alat tambalan Unix untuk menambal file. Anda juga harus menghapus beberapa garis miring pertama untuk berpindah dari absolut ke struktur direktori relatif. Seperti yang Anda lihat dari poin 3 di atas, ada lima garis miring sebelum direktori include, yang mana flag -p5 akan dihapuskan untuk Anda.

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

Setelah saya melakukan ini, tes saya berjalan dengan benar lagi.

piersb
sumber
0

PEMBERITAHUAN: Command php bin/console generate:doctrine:crudjuga membuat TestControllerdi src/Testssehingga dapat melempar kesalahan saat Anda mencoba untuk memulai server jika Anda tidak memiliki UnitTests. Hapus file perbaiki!

MorganFreeFarm
sumber
0

Bagi saya, itu karena saya berlari

$ phpunit .

dari pada

$ phpunit

ketika saya sudah memiliki phpunit.xmlfile yang dikonfigurasi di direktori kerja.

cyberbit
sumber
0

Saya menggunakan php 5.6 di jendela 10 dengan versi zend 1.12 untuk saya tambahkan

require_once 'PHPUnit / Autoload.php';

sebelum

kelas abstrak Zend_Test_PHPUnit_ControllerTestCase meluas PHPUnit_Framework_TestCase

bekerja. Kita perlu menambahkan pernyataan di atas dalam file ControllerTestCase.php

Shankar
sumber