mata teras
trigger_error()
trigger_error()
. 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"; ?>
<code>Before warning PHP Warning: Danger Will Robinson! in /home/matt/error_handler.php on line 4 After warning</code>
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"; } ?>
<code>Before exception In catch block</code>
<?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 ... } ?>
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"; ?>
output:
<code>Before warning PHP Warning: Danger Will Robinson! in /home/matt/error_handler.php on line 4 After warning</code>
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"; } ?>
(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)
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 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 arahan ini. Ini membolehkan anda menyembunyikan beberapa jenis kesilapan, atau kesilapan log dan bukannya memaparkannya.
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.
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.
PHPUnit menyediakan beberapa pilihan untuk ujian debugging. Pilihan menyediakan output yang lebih terperinci, termasuk sebarang kesilapan atau pengecualian yang ditangkap semasa ujian. Pilihan dan PHPUnit menyediakan beberapa cara untuk menguji keadaan ralat. Kaedah Q9: Bagaimana menangani amaran di phpunit? PHPUNIT menyediakan satu set pernyataan yang khusus digunakan untuk mengendalikan amaran. Yang paling biasa digunakan ialah 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 --debug
semasa menjalankan ujian. Ini akan memberikan output yang lebih terperinci, termasuk sebarang kesilapan atau pengecualian yang ditangkap semasa ujian. 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 error_reporting()
display_errors
Q4: Bagaimana untuk menguji pengecualian di PHPUNIT? assertEquals()
Q6: Bagaimana menangani kesilapan dalam phpunit? expectError()
Q7: Bagaimana cara debug ujian dalam phpunit? --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? 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. 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. @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!