cari
Rumahpembangunan bahagian belakangtutorial phpPHP Master | Ujian keadaan ralat dengan phpunit

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";
?>
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>
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";
}
?>
output:

<code>Before exception
In catch block</code>
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
    ...
}
?>
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";
?>

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)

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
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
Apakah beberapa masalah biasa yang boleh menyebabkan sesi PHP gagal?Apakah beberapa masalah biasa yang boleh menyebabkan sesi PHP gagal?Apr 25, 2025 am 12:16 AM

Sebab -sebab kegagalan phpsession termasuk kesilapan konfigurasi, isu cookie, dan tamat tempoh sesi. 1. Ralat Konfigurasi: Semak dan tetapkan session.save_path yang betul. Masalah 2.Cookie: Pastikan kuki ditetapkan dengan betul. 3.Session Expires: Laraskan Nilai Sesi.GC_MAXLifetime untuk melanjutkan masa sesi.

Bagaimanakah anda menyebarkan isu berkaitan sesi dalam PHP?Bagaimanakah anda menyebarkan isu berkaitan sesi dalam PHP?Apr 25, 2025 am 12:12 AM

Kaedah untuk masalah sesi debug dalam PHP termasuk: 1. Periksa sama ada sesi dimulakan dengan betul; 2. Sahkan penghantaran ID sesi; 3. Semak penyimpanan dan bacaan data sesi; 4. Semak konfigurasi pelayan. Dengan mengeluarkan ID dan data sesi, melihat kandungan fail sesi, dan lain-lain, anda boleh mendiagnosis dan menyelesaikan masalah yang berkaitan dengan sesi.

Apa yang berlaku jika session_start () dipanggil beberapa kali?Apa yang berlaku jika session_start () dipanggil beberapa kali?Apr 25, 2025 am 12:06 AM

Pelbagai panggilan ke session_start () akan menghasilkan mesej amaran dan kemungkinan penggantian data. 1) PHP akan mengeluarkan amaran, menyebabkan sesi telah dimulakan. 2) Ia boleh menyebabkan penggantian data sesi yang tidak dijangka. 3) Gunakan session_status () untuk memeriksa status sesi untuk mengelakkan panggilan berulang.

Bagaimana anda mengkonfigurasi seumur hidup sesi di PHP?Bagaimana anda mengkonfigurasi seumur hidup sesi di PHP?Apr 25, 2025 am 12:05 AM

Mengkonfigurasi kitaran hayat sesi dalam PHP boleh dicapai dengan menetapkan sesi.gc_maxlifetime dan session.cookie_lifetime. 1) session.gc_maxlifetime mengawal masa survival data sesi pelayan, 2) session.cookie_lifetime mengawal kitaran hayat kuki klien. Apabila ditetapkan ke 0, kuki tamat apabila penyemak imbas ditutup.

Apakah kelebihan menggunakan pangkalan data untuk menyimpan sesi?Apakah kelebihan menggunakan pangkalan data untuk menyimpan sesi?Apr 24, 2025 am 12:16 AM

Kelebihan utama menggunakan sesi penyimpanan pangkalan data termasuk kegigihan, skalabilitas, dan keselamatan. 1. Kegigihan: Walaupun pelayan dimulakan semula, data sesi tidak dapat berubah. 2. Skalabiliti: Berkenaan dengan sistem yang diedarkan, memastikan data sesi disegerakkan di antara pelbagai pelayan. 3. Keselamatan: Pangkalan data menyediakan storan yang disulitkan untuk melindungi maklumat sensitif.

Bagaimana anda melaksanakan pengendalian sesi tersuai di PHP?Bagaimana anda melaksanakan pengendalian sesi tersuai di PHP?Apr 24, 2025 am 12:16 AM

Melaksanakan pemprosesan sesi tersuai dalam PHP boleh dilakukan dengan melaksanakan antara muka sessionHandlerInterface. Langkah -langkah khusus termasuk: 1) mewujudkan kelas yang melaksanakan sessionHandlerInterface, seperti CustomSessionHandler; 2) kaedah penulisan semula dalam antara muka (seperti terbuka, rapat, membaca, menulis, memusnahkan, gc) untuk menentukan kitaran hayat dan kaedah penyimpanan data sesi; 3) Daftar pemproses sesi tersuai dalam skrip PHP dan mulakan sesi. Ini membolehkan data disimpan dalam media seperti MySQL dan REDIS untuk meningkatkan prestasi, keselamatan dan skalabiliti.

Apakah ID Sesi?Apakah ID Sesi?Apr 24, 2025 am 12:13 AM

SesionID adalah mekanisme yang digunakan dalam aplikasi web untuk mengesan status sesi pengguna. 1. Ia adalah rentetan yang dijana secara rawak yang digunakan untuk mengekalkan maklumat identiti pengguna semasa pelbagai interaksi antara pengguna dan pelayan. 2. Pelayan menjana dan menghantarnya kepada klien melalui kuki atau parameter URL untuk membantu mengenal pasti dan mengaitkan permintaan ini dalam pelbagai permintaan pengguna. 3. Generasi biasanya menggunakan algoritma rawak untuk memastikan keunikan dan ketidakpastian. 4. Dalam pembangunan sebenar, pangkalan data dalam memori seperti REDIS boleh digunakan untuk menyimpan data sesi untuk meningkatkan prestasi dan keselamatan.

Bagaimanakah anda mengendalikan sesi dalam persekitaran tanpa kerakyatan (mis., API)?Bagaimanakah anda mengendalikan sesi dalam persekitaran tanpa kerakyatan (mis., API)?Apr 24, 2025 am 12:12 AM

Menguruskan sesi dalam persekitaran tanpa kerakyatan seperti API boleh dicapai dengan menggunakan JWT atau cookies. 1. JWT sesuai untuk ketiadaan dan skalabilitas, tetapi ia adalah saiz yang besar ketika datang ke data besar. 2.Cookies lebih tradisional dan mudah dilaksanakan, tetapi mereka perlu dikonfigurasikan dengan berhati -hati untuk memastikan keselamatan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa