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

首頁(yè) 後端開(kāi)發(fā) php教程 PHP主|使用Phpunit測(cè)試錯(cuò)誤條件

PHP主|使用Phpunit測(cè)試錯(cuò)誤條件

Feb 25, 2025 am 11:06 AM

PHP Master | Error Condition Testing with PHPUnit

核心要點(diǎn)

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

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

問(wèn)題是什麼?

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

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

由此可見(jiàn),trigger_error() 調(diào)用後的 echo 語(yǔ)句已執(zhí)行?,F(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>

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

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

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

PHPUnit 行為的副作用

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

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

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

解決方案

我們需要一個(gè)解決方案,該解決方案允許繼續(xù)執(zhí)行正在測(cè)試的代碼,同時(shí)仍然允許我們檢查是否引發(fā)了錯(cuò)誤條件。如上面的示例所示,允許代碼執(zhí)行繼續(xù)可以使用不將錯(cuò)誤轉(zhuǎn)換為異常的自定義錯(cuò)誤處理程序來(lái)完成。此錯(cuò)誤處理程序應(yīng)該做的是捕獲錯(cuò)誤信息,以便稍後使用斷言進(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()(在每個(gè)測(cè)試方法之前運(yùn)行)處理設(shè)置錯(cuò)誤處理程序,該處理程序只是同一類中的另一個(gè)方法,該方法將有關(guān)每個(gè)錯(cuò)誤的信息存儲(chǔ)在一個(gè)數(shù)組中。然後,其他方法(如 assertError())由測(cè)試方法(如 testDoStuff())使用,以對(duì)該錯(cuò)誤信息執(zhí)行斷言並輸出相關(guān)的調(diào)試信息,例如與預(yù)期錯(cuò)誤相比觸發(fā)的錯(cuò)誤是什麼。其他有用的斷言類型包括邏輯反轉(zhuǎn)(即斷言未觸發(fā)特定錯(cuò)誤)、檢查消息與正則表達(dá)式匹配的錯(cuò)誤或檢查觸發(fā)的錯(cuò)誤數(shù)量。

結(jié)論

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

圖片來(lái)自 Fotolia

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

關(guān)於使用 PHPUnit 測(cè)試錯(cuò)誤條件的常見(jiàn)問(wèn)題解答 (FAQ)

Q1: 為什麼 PHPUnit 在控制臺(tái)中沒(méi)有顯示任何錯(cuò)誤?

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

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

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

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

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

Q4: 如何在 PHPUnit 中測(cè)試異常?

與Q2相同。

Q5: 如何為 PHPUnit 編寫(xiě)測(cè)試?

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

Q6: 如何在 PHPUnit 中處理錯(cuò)誤?

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

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

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

Q8: 如何在 PHPUnit 中測(cè)試錯(cuò)誤條件?

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

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

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

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

如何在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ī)文件名,存儲(chǔ)至非Web根目錄;3.通過(guò)php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過(guò)程安全可靠。

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

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

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

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

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

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

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

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

什麼是PHP,為什麼它用於Web開(kāi)發(fā)? 什麼是PHP,為什麼它用於Web開(kāi)發(fā)? Jun 23, 2025 am 12:55 AM

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

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(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