国产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)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系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脫衣機(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集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

PHP變量范圍解釋了 PHP變量范圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見(jiàn)問(wèn)題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪問(wèn)全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過(guò)濾;4.匿名函數(shù)需通過(guò)use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯(cuò)誤并提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來(lái)源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來(lái)源通過(guò)token防止CSRF并通過(guò)finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問(wèn)上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫(xiě)PHP評(píng)論的提示 撰寫(xiě)PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫(xiě)好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋?xiě)?yīng)解釋“為什么”而非“做了什么”,避免冗余或過(guò)于簡(jiǎn)單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

如何通過(guò)php中的索引訪問(wèn)字符串中的字符 如何通過(guò)php中的索引訪問(wèn)字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開(kāi)始,超出范圍訪問(wèn)返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問(wèn)前應(yīng)檢查字符串長(zhǎng)度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語(yǔ)言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles