Rumah > pembangunan bahagian belakang > tutorial php > PHP Master | Ujian keadaan ralat dengan phpunit

PHP Master | Ujian keadaan ralat dengan phpunit

Lisa Kudrow
Lepaskan: 2025-02-25 11:06:10
asal
818 orang telah melayarinya

PHP Master | Error Condition Testing with PHPUnit

mata teras

    PHPUnit menukarkan pengendalian ralat asli PHP ke dalam pengecualian, yang mungkin mengubah aliran pelaksanaan kod semasa ujian. Ini boleh menyebabkan masalah apabila menguji kod menggunakan
  • fungsi. trigger_error()
  • PHPUnit menukarkan kesilapan kepada pengecualian, yang menyebabkan kod itu berkelakuan berbeza dalam pembangunan dan ujian daripada dalam persekitaran pengeluaran. Ini kerana proses pelaksanaan berubah apabila ralat ditemui.
  • untuk menguji secara tepat kod menggunakan
  • , anda boleh menggunakan pengendali ralat tersuai untuk menangkap maklumat ralat untuk analisis kemudian menggunakan pernyataan. Ini membolehkan kod untuk meneruskan pelaksanaan sementara masih membenarkan memeriksa keadaan ralat yang dibangkitkan. trigger_error()
  • Tingkah laku lalai unit adalah penting untuk ujian yang tepat. Sekiranya logik pasca pemicu, menambah fungsi PHPUnit dapat memudahkan ujian yang tepat sebagai dekat dengan persekitaran pengeluaran yang mungkin.
Katakan anda mengekalkan kod yang merekodkan mesej ralat menggunakan fungsi PHP Native

. Sementara itu, anda menulis ujian unit untuk kod tersebut menggunakan phpUnit. Jika anda merujuk kepada Manual PHPUNIT, terdapat seksyen yang didedikasikan untuk cara menguji keadaan ralat. Ia menerangkan bagaimana PHPUnit melaksanakan pengendali kesilapannya sendiri yang menukarkan kesilapan, amaran, dan pemberitahuan ke dalam pengecualian, dan menangkap pengecualian ini adalah bagaimana anda harus mengendalikan ujian ralat tersebut. Walau bagaimanapun, bergantung kepada penampilan kod anda, anda mungkin mempunyai masalah dengan pendekatan ini dengan PHPUNIT. Artikel ini akan menerangkan secara terperinci apa masalah ini, bagaimana ia mempengaruhi keupayaan anda untuk menguji kod anda, dan bagaimana menyelesaikannya. trigger_error()

Apakah masalahnya?

kesilapan dan pengecualian berkelakuan dengan cara yang berbeza. Khususnya, yang berkaitan dengan artikel ini, jika pemalar tahap ralat yang diluluskan kepadanya tidak menunjukkan ralat maut, pelaksanaan kod boleh diteruskan dengan segera selepas

. Apabila pengecualian dilemparkan, pelaksanaan akan diteruskan pada permulaan blok trigger_error() yang sepadan dengan kelas pengecualian itu, yang mungkin atau tidak mungkin berlaku sebaik sahaja titik di mana pengecualian dilemparkan. Mari kita lihat beberapa contoh tingkah laku ini. Pertama sekali, ia adalah kesilapan. catch

<?php
error_reporting(E_ALL | E_STRICT);
echo "Before warning\n";
trigger_error("Danger Will Robinson!", E_USER_WARNING);
echo "After warning\n";
?>
Salin selepas log masuk
Salin selepas log masuk
Jika anda menjalankan kod di atas, anda akan mendapat output berikut:

<code>Before warning
PHP Warning:  Danger Will Robinson! in /home/matt/error_handler.php on line 4
After warning</code>
Salin selepas log masuk
Salin selepas log masuk
dari ini kita dapat melihat bahawa pernyataan

selepas trigger_error() dilaksanakan. Sekarang, pengecualian. echo

<?php
try {
    echo "Before exception\n";
    throw new Exception("Danger Will Robinson!");
    echo "After exception\n";
}
catch (Exception $e) {
    echo "In catch block\n";
}
?>
Salin selepas log masuk
Salin selepas log masuk
output:

<code>Before exception
In catch block</code>
Salin selepas log masuk
Berbeza dengan contoh ralat, kod selepas pengecualian dilemparkan tidak dilaksanakan. Kerana PHPUnit menukarkan ralat kepada pengecualian, ralat bertindak sama seperti pengecualian dalam ujian unit. Semasa ujian, sebarang kod yang dilaksanakan selepas ralat dicetuskan tidak akan dilaksanakan. Beri contoh lain:

<?php
function foo($param) {
    if (is_string($param)) {
        trigger_error(__FUNCTION__ . " no longer supports strings, pass an array", E_USER_NOTICE);
    }
    // do useful stuff with $param
    ...
}
?>
Salin selepas log masuk
Dengan penukaran kesilapan-ke-pengecualian, adalah mustahil untuk menguji sama ada

dikendalikan dengan berguna kerana apabila ralat ditukar kepada pengecualian, kod itu tidak akan dilaksanakan. $param

Kesan sampingan tingkah laku phpunit

Penukaran kesilapan-ke-pengecualian ini akan menyebabkan kod itu berkelakuan berbeza dalam pembangunan dan ujian daripada dalam persekitaran pengeluaran. Berikut adalah contoh:

<?php
error_reporting(E_ALL | E_STRICT);
echo "Before warning\n";
trigger_error("Danger Will Robinson!", E_USER_WARNING);
echo "After warning\n";
?>
Salin selepas log masuk
Salin selepas log masuk

output:

<code>Before warning
PHP Warning:  Danger Will Robinson! in /home/matt/error_handler.php on line 4
After warning</code>
Salin selepas log masuk
Salin selepas log masuk

Panggilan pertama var_dump() (pada masa ini, pengendali ralat tersuai yang menukarkan ralat kepada pengecualian berkuatkuasa) output NULL. Panggilan kedua var_dump() (di mana pengendali ralat lalai PHP berkuatkuasa) mengeluarkan maklumat mengenai ralat yang dicetuskan. Ambil perhatian bahawa ini bukan kerana null output panggilan pertama disebabkan oleh penggunaan pengendali ralat tersuai, tetapi kerana pengendali ralat melemparkan pengecualian. Jika pengendali ralat yang ditunjukkan dalam contoh ini tidak melakukan ini, output panggilan var_dump() pertama akan sama dengan yang kedua. var_dump()

Penyelesaian

Kami memerlukan penyelesaian yang membolehkan terus melaksanakan kod yang diuji sementara masih membenarkan kami memeriksa sama ada keadaan ralat dibangkitkan. Seperti yang ditunjukkan dalam contoh di atas, membenarkan pelaksanaan kod untuk meneruskan boleh dilakukan dengan menggunakan pengendali ralat tersuai yang tidak menukar kesilapan kepada pengecualian. Apa yang perlu dilakukan oleh pengendali ralat ini ialah menangkap mesej ralat supaya dapat dianalisis kemudian menggunakan pernyataan. Inilah yang kelihatan seperti:

<?php
try {
    echo "Before exception\n";
    throw new Exception("Danger Will Robinson!");
    echo "After exception\n";
}
catch (Exception $e) {
    echo "In catch block\n";
}
?>
Salin selepas log masuk
Salin selepas log masuk

(jalan sebelum setiap kaedah ujian) mengendalikan menubuhkan pengendali ralat, yang merupakan kaedah lain dalam kelas yang sama yang menyimpan maklumat mengenai setiap ralat dalam array. Kaedah lain (seperti setUp()) kemudian digunakan oleh kaedah ujian (seperti assertError()) untuk melakukan pernyataan pada mesej ralat ini dan output maklumat debug yang relevan, seperti apa ralat yang dicetuskan berbanding dengan ralat yang diharapkan. Jenis penegasan berguna lain termasuk penyongsangan logik (iaitu, pernyataan tidak mencetuskan ralat tertentu), kesilapan yang menyemak mesej sepadan dengan ungkapan biasa, atau bilangan kesilapan yang dicetuskan. testDoStuff()

Kesimpulan

Jika anda tidak peduli jika logik di sebalik ujian yang mencetuskan ralat masih dilaksanakan, tingkah laku lalai phpunit sangat sesuai untuk keperluan anda. Walau bagaimanapun, adalah penting untuk anda memahami maksud tingkah laku. Sekiranya anda mengambil berat tentang pelaksanaan logik tersebut, juga penting bahawa anda tahu bagaimana untuk melengkapkan keupayaan PHPUNIT untuk memudahkan ujian yang tepat mengenai kod anda sebagai dekat dengan persekitaran pengeluaran yang mungkin.

Gambar dari Fotolia

(berikut adalah FAQ, format dan ungkapan telah diselaraskan mengikut kandungan asal, dan beberapa isu telah digabungkan atau dipermudahkan)

FAQs (FAQ) menggunakan phpunit untuk menguji keadaan ralat

Q1: Mengapa phpunit tidak menunjukkan sebarang kesilapan dalam konsol?

PHPUnit direka dengan cara yang membolehkan ujian kesilapan dan pengecualian yang berkesan. Jika anda tidak melihat sebarang kesilapan dalam konsol, PHPUnit mungkin menangkap mereka dan merawatnya sebagai ujian yang gagal. Untuk melihat butiran kesilapan ini, anda boleh menggunakan pilihan --debug semasa menjalankan ujian. Ini akan memberikan output yang lebih terperinci, termasuk sebarang kesilapan atau pengecualian yang ditangkap semasa ujian.

Q2: Bagaimana untuk menegaskan bahawa pengecualian dilemparkan dalam phpunit?

PHPUnit menyediakan satu set pernyataan yang digunakan khusus untuk mengendalikan pengecualian. Yang paling biasa digunakan ialah expectException(), yang boleh anda gunakan untuk menentukan jenis pengecualian yang anda harapkan untuk dibuang. Jika pengecualian yang ditentukan dibuang semasa ujian, ujian akan lulus. Jika tidak, ujian akan gagal. Ini membolehkan anda menulis ujian yang secara khusus memeriksa pengendalian keadaan ralat yang betul.

Q3: Bagaimanakah pelaporan ralat berfungsi dalam PHP? Ciri pelaporan ralat PHP membolehkan anda mengawal kesilapan yang dilaporkan dan bagaimana menangani mereka. Secara lalai, semua kesilapan dilaporkan dan dipaparkan. Walau bagaimanapun, anda boleh menukar tetapan ini menggunakan fungsi

dan

arahan ini. Ini membolehkan anda menyembunyikan beberapa jenis kesilapan, atau kesilapan log dan bukannya memaparkannya. error_reporting() display_errors Q4: Bagaimana untuk menguji pengecualian di PHPUNIT?

Sama seperti Q2.

Q5: Bagaimana menulis ujian untuk phpunit?

Menulis ujian untuk phpunit melibatkan mewujudkan kelas kes ujian baru yang memanjangkan kelas phpunitframeworktestcase. Setiap ujian adalah kaedah awam dalam kelas ini, bermula dengan perkataan "ujian". Dalam setiap kaedah ujian, anda boleh menggunakan pernyataan PHPUNIT untuk memeriksa sama ada kod anda berjalan seperti yang diharapkan. Sebagai contoh, anda boleh menggunakan kaedah untuk memeriksa sama ada fungsi mengembalikan hasil yang diharapkan.

assertEquals() Q6: Bagaimana menangani kesilapan dalam phpunit?

PHPUnit menyediakan satu set pernyataan yang khusus digunakan untuk mengendalikan kesilapan. Yang paling biasa digunakan ialah , yang boleh anda gunakan untuk menentukan jenis ralat yang anda harapkan untuk mencetuskan. Jika ralat yang ditentukan dicetuskan semasa ujian, ujian berlalu. Jika tidak, ujian akan gagal. Ini membolehkan anda menulis ujian yang secara khusus memeriksa pengendalian keadaan ralat yang betul.

expectError() Q7: Bagaimana cara debug ujian dalam phpunit?

PHPUnit menyediakan beberapa pilihan untuk ujian debugging. Pilihan menyediakan output yang lebih terperinci, termasuk sebarang kesilapan atau pengecualian yang ditangkap semasa ujian. Pilihan

,

dan --debug boleh digunakan untuk menghentikan ujian berjalan apabila kesilapan beberapa jenis ditemui. Ini boleh menjadikannya lebih mudah untuk mengenal pasti dan menyelesaikan masalah. --stop-on-error --stop-on-failure --stop-on-risky Q8: Bagaimana untuk menguji keadaan ralat di phpunit?

PHPUnit menyediakan beberapa cara untuk menguji keadaan ralat. Kaedah expectError() membolehkan anda menentukan jenis ralat yang anda harapkan untuk mencetuskan. Kaedah expectWarning() membolehkan anda menentukan jenis amaran yang anda harapkan untuk mencetuskan. Jika ralat atau amaran yang ditentukan dicetuskan semasa ujian, ujian akan lulus. Jika tidak, ujian akan gagal.

Q9: Bagaimana menangani amaran di phpunit?

PHPUNIT menyediakan satu set pernyataan yang khusus digunakan untuk mengendalikan amaran. Yang paling biasa digunakan ialah expectWarning(), yang boleh anda gunakan untuk menentukan jenis amaran yang anda harapkan untuk mencetuskan. Sekiranya amaran yang ditentukan dicetuskan semasa ujian, ujian berlalu. Jika tidak, ujian akan gagal. Ini membolehkan anda menulis ujian yang secara khusus memeriksa pengendalian keadaan amaran yang betul.

Q10: Bagaimana menggunakan penyedia data dalam phpunit?

Pembekal data adalah ciri kuat PHPUnit yang membolehkan anda menjalankan ujian beberapa kali dengan dataset yang berbeza. Untuk menggunakan pembekal data, anda boleh membuat kaedah yang mengembalikan pelbagai tatasusunan. Setiap array dalaman adalah satu set parameter untuk ujian. Anda kemudian mengulas kaedah ujian anda menggunakan @dataProvider diikuti dengan nama kaedah penyedia data anda. PHPUnit kemudian akan menjalankan ujian sekali untuk setiap set parameter dan lulus parameter ke kaedah ujian.

Atas ialah kandungan terperinci PHP Master | Ujian keadaan ralat dengan phpunit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan