Phpunit mengharapkan pengecualian dan melanjutkan

[ad_1]

phpunit menegaskan melanjutkan

public function testDemo()
{
    $failures = [];
    try {
        $this->assertTrue(false);
    } catch(PHPUnit_Framework_ExpectationFailedException $e) {
        $failures[] = $e->getMessage();
    }
    try {
        $this->assertTrue(false);
    } catch(PHPUnit_Framework_ExpectationFailedException $e) {
        $failures[] = $e->getMessage();
    }
    if(!empty($failures))
    {
        throw new PHPUnit_Framework_ExpectationFailedException (
            count($failures)." assertions failed:\n\t".implode("\n\t", $failures)
        );
    }
}

[ad_2]

Phpunit mengharapkan pengecualian dan melanjutkan

Tolong bagikan

Menguji pengecualian di PHPUnit cukup mudah, dan Anda bisa sespesifik yang Anda butuhkan dengan menguji detail pengecualian yang dilemparkan

Tetapi bagaimana jika Anda perlu menguji bahwa pengecualian tidak terjadi?

Masalah Pengecualian

Ada banyak pendukung kode bersih yang akan memberi tahu Anda bahwa menguji pengecualian yang tidak dilemparkan adalah tanda bahwa kode Anda melakukan sesuatu yang salah, dan bahwa kode tersebut harus difaktorkan ulang sehingga pengujian untuk yang negatif tidak diperlukan.

Salah satu argumen utama yang menentang penggunaan pengecualian untuk mengontrol aliran aplikasi adalah bahwa mereka secara efektif menjadi tidak lebih dari pernyataan GOTO yang mewah, yang dapat membuat kode lebih sulit dibaca

Itu tidak berarti kita harus menghindari penggunaan pengecualian sama sekali dalam upaya kita untuk menulis kode yang bersih, tetapi mungkin kita dapat menulis kode sedemikian rupa sehingga kita tidak akan terjebak dengan masalah pengujian ini sama sekali.

Namun terkadang saat menulis tes, kami tidak selalu memiliki kemewahan untuk mengubah kode yang ada, jadi kami mungkin tidak punya pilihan selain mencoba dan menguji pengecualian yang tidak dilemparkan

Penggunaan Pengecualian yang Valid

Jadi apa kasus penggunaan yang valid yang masih perlu kita uji?

  1. Situasi yang terjadi di bagian program di mana tidak ada cukup konteks untuk melanjutkan, seperti penyisipan database yang gagal. Meneruskan kontrol cadangan rantai ke tingkat yang dapat menangani ini adalah opsi terbaik
  2. Kesalahan serius di mana alternatif untuk pengecualian yang dilemparkan mungkin merusak data, seperti mencoba memasukkan data pada titik tertentu dalam file yang telah diperbarui antara aplikasi yang menemukan titik penyisipan itu dan menulis data baru (penguncian file yang buruk)

Menguji Negatif

Cara mengujinya cukup sederhana

public function testTheThing { // set up test-specific stuff here try { $classInstance->methodUnderTest(); $this->assertTrue(true); } catch (\Exception $exception) { $this->fail("Exception thrown testing thing"); } }

Jika pengecualian dilemparkan, pengujian PHPUnit Anda gagal, yang pada akhirnya memperingatkan Anda bahwa beberapa logika metode Anda mengalami kegagalan. Anda mungkin bertanya-tanya mengapa ada kebutuhan untuk ________3______ tambahan di sini. Saya menggunakan ini untuk memastikan bahwa ketika tes lulus, setidaknya masih ada satu pernyataan yang valid di dalamnya, karena PHPUnit dapat menampilkan peringatan "tes berisiko" di konsol jika tes tidak mengandung pernyataan tergantung pada konfigurasi pengujian Anda

Kandang dinosaurus terlihat bagus. Hanya ada satu masalah kecil. orang terus secara tidak sengaja menempatkan dinosaurus pemakan sayuran yang baik dan lembut ke dalam kandang yang sama dengan karnivora pemakan daging. Hasilnya adalah. dengan baik. mahal, dan ada banyak pembersihan juga

Kita perlu mencegah pemakan daging dan pemakan sayuran bercampur di dalam kandang yang sama. Dengan kata lain, jika seseorang mencoba melakukan ini, kita perlu memberikan pengecualian

Ini opsional, tetapi mari buat kelas pengecualian khusus untuk ini. NotABuffetException_. Saya bahkan akan memberikan ini pesan default. orang perlu memahami betapa mengerikannya hal ini

baris 1 - 2namespace AppBundle\Exception;. baris 4class NotABuffetException extends \Exception{protected $message = 'Tolong jangan mencampur dinosaurus karnivora dan non-karnivora. Ini akan menjadi pembantaian. ';}

Memastikan bahwa pengecualian ini dilakukan pada waktu yang tepat sangat penting untuk bisnis. Jadi mari kita menulis tes. testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores

Di dalam metodenya, ciptakan situasi yang menakutkan ini. $enclosure = new Enclosure() dan $enclosure->addDinosaur(new Dinosaur()). Secara default, dinosaurus adalah non-karnivora. Jadi sekarang, mari tambahkan predator. new Dinosaur('Velociraptor') dan true untuk argumen isCarnivorous

baris 1 - 9class EnclosureTest memperluas TestCase{. baris 12 - 28public function testItDoesNotAllowCarnivorousDinosToMixWithHerbivores(){$enclosure = new Enclosure();$enclosure->addDinosaur(new Dinosaur());. baris 34 - 36$enclosure->addDinosaur(Dinosaurus baru('Velociraptor', benar));}}

Pada titik ini, pengecualian harus dilemparkan. Jadi. bagaimana kita bisa mengujinya? . dengan baik. $this->expectException() dan kemudian kelas pengecualian. NotABuffetException::class. Pastikan Anda menambahkan ini sebelum memanggil kode terakhir

baris 1 - 9class EnclosureTest memperluas TestCase{. baris 12 - 28public function testItDoesNotAllowCarnivorousDinosToMixWithHerbivores(){. baris 31 - 34$this->expectException(NotABuffetException. kelas);. baris 36 - 37}}

Jika kita telah melakukan pekerjaan kita dengan benar, ini akan gagal. Coba tes

Ya. Gagal menyatakan bahwa pengecualian tipe NotABuffetException dilemparkan

Luar biasa. Mari kita buang pengecualian itu. Di dalam testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores_0, di bagian bawah, tambahkan testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores1 baru bernama testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores2 dengan argumen testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores3. Ini akan mengembalikan testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores_4

baris 1 - 13class Enclosure{. baris 16 - 40fungsi pribadi canAddDinosaur(Dinosaurus $dinosaur). bool{. baris 43 - 44}}

Inilah beberapa logika sederhana. testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores5. Jadi, jika kandangnya kosong, maka tidak apa-apa untuk menambahkan dinosaurus. Atau, periksa untuk melihat apakah testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores6. Jika mereka cocok, kami baik-baik saja

baris 1 - 13class Enclosure{. baris 16 - 40fungsi pribadi canAddDinosaur(Dinosaurus $dinosaur). bool{jumlah pengembalian($ini->dinosaurus) === 0. $this->dinosaurs->first()->Carnivorous() === $dinosaurs->is Carnivorous();}}

Kembali ke testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores_7, jika bukan testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores8. Buang pengecualian. Oh tunggu. pastikan kelas meluas testItDoesNotAllowCarnivorousDinosaursToMixWithHerbivores_9. Salahku

baris 1 - 4class NotABuffetException meluas \Exception{. baris 7}

Sekarang buang pengecualian itu

baris 1 - 13class Enclosure{. baris 16 - 31 fungsi publik add Dinosaur(Dinosaur $dinosaur){if (. $this->canAddDinosaur($dinosaur)) {throw new NotABuffetException();}. baris 37 - 38}. baris 40 - 45}

Periksa tes

Merayu. Kami mengerti

Ada satu cara lain untuk menguji pengecualian. Ini benar-benar sama, tetapi terlihat lebih mewah. Salin metode pengujian dan ganti namanya sehingga kami dapat menguji kondisi sebaliknya. $enclosure = new Enclosure()_0. Wah panjang sekali namanya

baris 1 - 9class EnclosureTest memperluas TestCase{. baris 12 - 42public function testItDoesNotAllowToAddNonCarnivorousDinosaurusToCarnivorousEnclosure(){. baris 45 - 48}}

Tambahkan Velociraptor terlebih dahulu lalu hapus $enclosure = new Enclosure()1. Sebagai gantinya, tambahkan anotasi. $enclosure = new Enclosure()_2 diikuti oleh kelas penuh. PhpStorm menempatkan nama pendek. jadi salin pernyataan penggunaan dan taruh di sini

Tip

Sebenarnya, anotasi $enclosure = new Enclosure()2, $enclosure = new Enclosure()4, $enclosure = new Enclosure()5, dan $enclosure = new Enclosure()6 tidak digunakan lagi dan akan dihapus di PHPUnit 9. Lanjutkan menggunakan $enclosure = new Enclosure()_1, $enclosure = new Enclosure()8, $enclosure = new Enclosure()9, dan $enclosure->addDinosaur(new Dinosaur())0 metode yang sesuai dalam kode PHP Anda

Cobalah

baris 1 - 9class EnclosureTest memperluas TestCase{. baris 12 - 39public function testItDoesNotAllowToAddNonCarnivorousDinosaurusToCarnivorousEnclosure(){$enclosure = new Enclosure();$enclosure->addDinosaurus(new Dinosaur('Velociraptor', true));$enclosure->addDinosaur(new Dinosaur());}}

Ya. Satu lagi tes lulus

Saya ingin membahas satu contoh lagi selanjutnya. dan juga menambahkan beberapa keamanan ke lampiran. Tamu-tamu kita sudah cukup diteror

Bagaimana cara menegaskan pengecualian di JUnit?

Saat menggunakan JUnit 4, kita cukup menggunakan atribut yang diharapkan dari anotasi @Test untuk menyatakan bahwa kita mengharapkan pengecualian untuk dilemparkan di mana saja dalam metode pengujian yang dianotasi. In this example, we've declared that we're expecting our test code to result in a NullPointerException.

Bagaimana cara menjalankan tes PHPUnit tunggal?

Cara Menjalankan Pengujian di PHPUnit. Anda dapat menjalankan semua tes dalam direktori menggunakan biner PHPUnit yang terinstal di folder vendor Anda. Anda juga dapat menjalankan pengujian tunggal dengan menyediakan jalur ke file pengujian . Anda menggunakan flag --verbose untuk mendapatkan informasi lebih lanjut tentang status pengujian.

Apa tujuan dari PHPUnit?

PHPUnit menyediakan kerangka kerja sederhana untuk membuat rangkaian pengujian guna mengotomatiskan pengujian fungsi dan kelas . PHPUnit terinspirasi oleh JUnit yang dibuat oleh Kent Beck dan Erich Gamma sebagai alat untuk Pemrograman eXtreme.

Apa yang ditegaskan di PHPUnit?

PHPUnit assertSame() Fungsi . Penegasan ini akan mengembalikan nilai benar jika nilai yang diharapkan sama dengan nilai sebenarnya jika tidak mengembalikan nilai salah. used to assert whether the actually obtained value is the same as the expected value or not. This assertion will return true in the case if the expected value is the same as the actual value else returns false.