国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) php教程 PHP主|使用Phpunit測試錯誤條件

PHP主|使用Phpunit測試錯誤條件

Feb 25, 2025 am 11:06 AM

PHP Master | Error Condition Testing with PHPUnit

核心要點(diǎn)

  • PHPUnit 將 PHP 原生的錯誤處理轉(zhuǎn)換為異常,這可能會改變測試期間代碼執(zhí)行的流程。這在測試使用 trigger_error() 函數(shù)的代碼時可能會導(dǎo)致問題。
  • PHPUnit 將錯誤轉(zhuǎn)換為異常,這會導(dǎo)致代碼在開發(fā)和測試中的行為與生產(chǎn)環(huán)境中的行為有所不同。這是因?yàn)橛龅藉e誤時執(zhí)行流程發(fā)生了變化。
  • 為了準(zhǔn)確測試使用 trigger_error() 的代碼,可以使用自定義錯誤處理程序來捕獲錯誤信息,以便稍后使用斷言進(jìn)行分析。這允許代碼繼續(xù)執(zhí)行,同時仍然允許檢查引發(fā)的錯誤條件。
  • 了解 PHPUnit 的默認(rèn)行為對于準(zhǔn)確測試至關(guān)重要。在需要執(zhí)行觸發(fā)錯誤后邏輯的情況下,補(bǔ)充 PHPUnit 的功能可以促進(jìn)在盡可能接近生產(chǎn)環(huán)境的條件下進(jìn)行準(zhǔn)確測試。

假設(shè)您正在維護(hù)使用 PHP 原生 trigger_error() 函數(shù)記錄錯誤信息的代碼。同時,您正在使用 PHPUnit 為該代碼編寫單元測試。如果您參考 PHPUnit 手冊,有一節(jié)內(nèi)容專門介紹如何測試錯誤條件。它描述了 PHPUnit 如何實(shí)現(xiàn)自己的錯誤處理程序,該處理程序?qū)㈠e誤、警告和通知轉(zhuǎn)換為異常,并且捕獲這些異常是您應(yīng)該如何處理此類錯誤測試的方法。但是,根據(jù)您的代碼外觀,您可能會遇到 PHPUnit 的這種方法的問題。本文將詳細(xì)說明這個問題是什么,它如何影響您測試代碼的能力,以及如何解決它。

問題是什么?

錯誤和異常的行為方式根本不同。與本文特別相關(guān)的是,如果傳遞給它的錯誤級別常量不表示致命錯誤,則代碼執(zhí)行可以在 trigger_error() 之后立即繼續(xù)。當(dāng)拋出異常時,執(zhí)行將在找到與該異常類對應(yīng)的 catch 塊的開頭繼續(xù),這可能在拋出異常的點(diǎn)之后立即發(fā)生,也可能不會。讓我們來看一些這些行為的示例。首先是錯誤。

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

如果您運(yùn)行上述代碼,您將獲得以下輸出:

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

由此可見,trigger_error() 調(diào)用后的 echo 語句已執(zhí)行。現(xiàn)在,異常。

<?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>

與錯誤示例相反,拋出異常后的代碼未執(zhí)行。因?yàn)?PHPUnit 將錯誤轉(zhuǎn)換為異常,所以錯誤在單元測試中的行為與異常相同。在測試期間,任何在觸發(fā)錯誤后執(zhí)行的代碼都不會執(zhí)行。再舉一個例子:

<?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
    ...
}
?>

通過錯誤到異常的轉(zhuǎn)換,無法測試是否對 $param 進(jìn)行了有用的處理,因?yàn)楫?dāng)錯誤轉(zhuǎn)換為異常時,該代碼將永遠(yuǎn)不會執(zhí)行。

PHPUnit 行為的副作用

這種錯誤到異常的轉(zhuǎn)換會導(dǎo)致代碼在開發(fā)和測試中的行為與在生產(chǎn)環(huán)境中的行為有所不同。這是一個例子:

<?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>

第一個 var_dump() 調(diào)用(在此期間,將錯誤轉(zhuǎn)換為異常的自定義錯誤處理程序正在生效)輸出 NULL。第二個 var_dump() 調(diào)用(在此期間,PHP 的默認(rèn)錯誤處理程序正在生效)輸出有關(guān)已觸發(fā)錯誤的信息。請注意,這不是因?yàn)槭褂昧俗远x錯誤處理程序而導(dǎo)致第一個 var_dump() 調(diào)用輸出 NULL,而是因?yàn)樵撳e誤處理程序拋出了異常。如果此示例中顯示的錯誤處理程序沒有這樣做,則第一個 var_dump() 調(diào)用的輸出將與第二個相同。

解決方案

我們需要一個解決方案,該解決方案允許繼續(xù)執(zhí)行正在測試的代碼,同時仍然允許我們檢查是否引發(fā)了錯誤條件。如上面的示例所示,允許代碼執(zhí)行繼續(xù)可以使用不將錯誤轉(zhuǎn)換為異常的自定義錯誤處理程序來完成。此錯誤處理程序應(yīng)該做的是捕獲錯誤信息,以便稍后使用斷言進(jìn)行分析。這就是它的樣子:

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

setUp()(在每個測試方法之前運(yùn)行)處理設(shè)置錯誤處理程序,該處理程序只是同一類中的另一個方法,該方法將有關(guān)每個錯誤的信息存儲在一個數(shù)組中。然后,其他方法(如 assertError())由測試方法(如 testDoStuff())使用,以對該錯誤信息執(zhí)行斷言并輸出相關(guān)的調(diào)試信息,例如與預(yù)期錯誤相比觸發(fā)的錯誤是什么。其他有用的斷言類型包括邏輯反轉(zhuǎn)(即斷言未觸發(fā)特定錯誤)、檢查消息與正則表達(dá)式匹配的錯誤或檢查觸發(fā)的錯誤數(shù)量。

結(jié)論

如果您不關(guān)心測試觸發(fā)錯誤后的邏輯是否仍在執(zhí)行,則 PHPUnit 的默認(rèn)行為完全適合您的需求。但是,重要的是您要了解該行為的含義。如果您確實(shí)關(guān)心此類邏輯的執(zhí)行,同樣重要的是您要知道如何補(bǔ)充 PHPUnit 的功能,以便在盡可能接近生產(chǎn)環(huán)境的條件下促進(jìn)對代碼的準(zhǔn)確測試。

圖片來自 Fotolia

(以下為FAQ,已根據(jù)原文內(nèi)容調(diào)整格式和表達(dá),并對部分問題進(jìn)行了合并或簡化)

關(guān)于使用 PHPUnit 測試錯誤條件的常見問題解答 (FAQ)

Q1: 為什么 PHPUnit 在控制臺中沒有顯示任何錯誤?

PHPUnit 的設(shè)計(jì)方式允許有效測試錯誤和異常。如果您在控制臺中沒有看到任何錯誤,則 PHPUnit 可能正在捕獲它們并將它們視為失敗的測試。要查看這些錯誤的詳細(xì)信息,可以在運(yùn)行測試時使用 --debug 選項(xiàng)。這將提供更詳細(xì)的輸出,包括在測試期間捕獲的任何錯誤或異常。

Q2: 如何斷言 PHPUnit 中拋出了異常?

PHPUnit 提供了一組專門用于處理異常的斷言。最常用的是 expectException(),您可以使用它來指定您期望拋出的異常類型。如果在測試期間拋出了指定的異常,則測試將通過。如果沒有,則測試將失敗。這允許您編寫專門檢查錯誤條件的正確處理的測試。

Q3: PHP 中的錯誤報(bào)告是如何工作的?

PHP 的錯誤報(bào)告功能允許您控制報(bào)告哪些錯誤以及如何處理它們。默認(rèn)情況下,所有錯誤都會被報(bào)告并顯示。但是,您可以使用 error_reporting() 函數(shù)和 display_errors ini 指令更改這些設(shè)置。這允許您隱藏某些類型的錯誤,或記錄錯誤而不是顯示它們。

Q4: 如何在 PHPUnit 中測試異常?

與Q2相同。

Q5: 如何為 PHPUnit 編寫測試?

為 PHPUnit 編寫測試涉及創(chuàng)建一個新的測試用例類,該類擴(kuò)展 PHPUnitFrameworkTestCase 類。每個測試都是此類中的一個公共方法,以單詞“test”開頭。在每個測試方法內(nèi)部,您可以使用 PHPUnit 的斷言來檢查您的代碼是否按預(yù)期運(yùn)行。例如,您可以使用 assertEquals() 方法來檢查函數(shù)是否返回預(yù)期的結(jié)果。

Q6: 如何在 PHPUnit 中處理錯誤?

PHPUnit 提供了一組專門用于處理錯誤的斷言。最常用的是 expectError(),您可以使用它來指定您期望觸發(fā)的錯誤類型。如果在測試期間觸發(fā)了指定的錯誤,則測試將通過。如果沒有,則測試將失敗。這允許您編寫專門檢查錯誤條件的正確處理的測試。

Q7: 如何調(diào)試 PHPUnit 中的測試?

PHPUnit 提供了幾個調(diào)試測試的選項(xiàng)。--debug 選項(xiàng)提供更詳細(xì)的輸出,包括在測試期間捕獲的任何錯誤或異常。--stop-on-error、--stop-on-failure--stop-on-risky 選項(xiàng)可用于在遇到某種類型的錯誤時停止測試運(yùn)行。這可以使識別和修復(fù)問題更容易。

Q8: 如何在 PHPUnit 中測試錯誤條件?

PHPUnit 提供了幾種測試錯誤條件的方法。expectError() 方法允許您指定您期望觸發(fā)的錯誤類型。expectWarning() 方法允許您指定您期望觸發(fā)的警告類型。如果在測試期間觸發(fā)了指定的錯誤或警告,則測試將通過。如果沒有,則測試將失敗。

Q9: 如何在 PHPUnit 中處理警告?

PHPUnit 提供了一組專門用于處理警告的斷言。最常用的是 expectWarning(),您可以使用它來指定您期望觸發(fā)的警告類型。如果在測試期間觸發(fā)了指定的警告,則測試將通過。如果沒有,則測試將失敗。這允許您編寫專門檢查警告條件的正確處理的測試。

Q10: 如何在 PHPUnit 中使用數(shù)據(jù)提供程序?

數(shù)據(jù)提供程序是 PHPUnit 的一個強(qiáng)大功能,允許您使用不同的數(shù)據(jù)集多次運(yùn)行測試。要使用數(shù)據(jù)提供程序,您可以創(chuàng)建一個返回?cái)?shù)組的數(shù)組的方法。每個內(nèi)部數(shù)組都是測試的一組參數(shù)。然后,您使用 @dataProvider 注釋您的測試方法,后跟您的數(shù)據(jù)提供程序方法的名稱。然后,PHPUnit 將為每一組參數(shù)運(yùn)行一次測試,并將參數(shù)傳遞給測試方法。

以上是PHP主|使用Phpunit測試錯誤條件的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗(yàn)證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴(yán)格程度。==在比較前會進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運(yùn)算的方法如下:1.加法用 號,支持整數(shù)和浮點(diǎn)數(shù),也可用于變量,字符串?dāng)?shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點(diǎn)數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負(fù)數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運(yùn)算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴(kuò)展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實(shí)例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles