濮阳杆衣贸易有限公司

主頁 > 知識庫 > 淺談如何提高PHP代碼質(zhì)量之單元測試

淺談如何提高PHP代碼質(zhì)量之單元測試

熱門標(biāo)簽:凱立德地鐵站地圖標(biāo)注 天津電銷外呼系統(tǒng)違法嗎 合肥ai電銷機(jī)器人費(fèi)用 溫州外呼系統(tǒng)招商 上海400客服電話怎么申請 400電話個人能不能辦理 滄州電銷外呼系統(tǒng)價格 手機(jī)外呼系統(tǒng)什么原理 銀行信貸電話機(jī)器人

1、單元測試

通過實(shí)現(xiàn)單一責(zé)任原則(我們的代碼應(yīng)該只關(guān)注功能的單個部分),我們將確保在測試期間,我們只會同時關(guān)注項(xiàng)目的一小部分

通過使用 Liskov 替換原則和依賴倒置原則,我們的代碼不會關(guān)心我們是否注入模擬依賴關(guān)系,只要它們實(shí)現(xiàn)了適當(dāng)?shù)慕涌?/p>

在單元測試中,我們確實(shí)希望用模擬對象替換所有依賴的服務(wù),因此我們一次只測試一個類。但模擬是什么?它們是實(shí)現(xiàn)與其他對象相同的接口的對象,但它們的行為是受控的。例如,假設(shè)我們在創(chuàng)建一個價格比較服務(wù),我們利用另一個服務(wù)來獲取當(dāng)前的匯率。在測試我們的比較器時,我們可以使用一個模擬對象來為特定的貨幣返回特定的匯率,因此我們的測試既不依賴也不調(diào)用真正的服務(wù)。

2、應(yīng)該使用哪個框架?

有幾個好的框架可以達(dá)到這個目的。最常見的可能是 PHPUnit。在我的工作中,我發(fā)現(xiàn)使用行為方法來編寫測試會帶來更好的結(jié)果,并使我更急切地編寫測試。對于我們的項(xiàng)目,我們選擇 phpspec。

安裝過程相當(dāng)簡單 - 只需使用:

$ php composer.phar require --dev phpspec/phpspec

然后,如果你在本文的第一部分中配置了 PHing,那么你可以在 build.xml 中添加構(gòu)建目標(biāo):

target name="phpspec">
	exec executable="bin/phpspec" passthru="true" checkreturn="true">
		arg line="run --format=pretty" />
	/exec>
/target>...
target name="run" depends="phpcs,phpcpd,phan,phpspec" />

然后,你必須為你想要測試的每個服務(wù)類創(chuàng)建一個測試類。讓 PHPSpec 非常容易使用的是模型創(chuàng)建。你只需使用嚴(yán)格的輸入,就可以將模擬對象聲明為測試函數(shù)的參數(shù)。PHPSpec 會自動為你創(chuàng)建模擬。讓我們看一下代碼示例:

//spec/Domain/PriceComparatorSpec.php
?php
namespace spec\Domain;
use Domain\Price;use Domain\PriceConverter;
use PhpSpec\ObjectBehavior;
class PriceComparatorSpec extends ObjectBehavior{
	public function let(PriceConverter $converter)    {       
		$this->beConstructedWith($converter);   
	} 
	public function it_should_return_equal()    {   
		$price1 = new Price(100, 'EUR');     
		$price2 = new Price(100, 'EUR');   
		$this->compare($price1, $price2)->shouldReturn(0);
	}    
	public function it_should_convert_first(PriceConverter $converter) {   
		$price1 = new Price(100, 'EUR');    
		$price2 = new Price(100, 'PLN');    
		$priceConverted = new Price(25, 'EUR');    
		$converter->convert($price2, 'EUR')->willReturn($priceConverted);  
		$this->compare($price1, $price2)->shouldReturn(1); 
	}
}

這里有三個函數(shù):

  • let( ) - 它允許使用依賴來初始化服務(wù)
  • 兩個 it_* 函數(shù)實(shí)現(xiàn)測試。其中一種方法是使用模擬 $priceConverter 的方法實(shí)現(xiàn) priceConverter 接口,該接口被注入到測試對象的創(chuàng)建中。

你可以看到創(chuàng)建模擬非常容易。你所需要做的就是將它定義為測試函數(shù)的參數(shù),并通過指定在執(zhí)行代碼時應(yīng)該運(yùn)行哪些函數(shù)來配置 mock。如果需要,你還可以設(shè)置返回值。

所有測試的方法都是從 $this 上下文中運(yùn)行的,你可以使用與模擬相同的語法來輕松地檢查它們的結(jié)果。

3、如何設(shè)置測試?

Phpspec 有一個很好的文檔,但是我將嘗試向你展示一些在日常實(shí)踐中有用的基本用例。

構(gòu)建測試對象

一般來說,設(shè)置測試對象的最簡單方法是調(diào)用 $this->beConstructedWith(…) 方法,該方法將所有應(yīng)該傳遞給對象構(gòu)造函數(shù)的 params 作為參數(shù)。

如果你的對象應(yīng)該使用工廠方法來創(chuàng)建,那么你可以使用

this−>beConstructedThrough(this−>beConstructedThrough(methodName,$argumentsArray)方法。

在模擬中匹配運(yùn)行時參數(shù)

你會發(fā)現(xiàn) phpspec 使用一種非常類似于人類的語法來配置模擬。例如,如果你想要檢查在運(yùn)行時是否有一個模擬方法 someMethod 與參數(shù)“desired value”被調(diào)用,你可以在測試中定義它,如下面的例子:

$mockObject->someMethod("desired value")->shouldBeCalled();

如果你想要測試代碼的行為,當(dāng)一些 mock 的函數(shù)返回“some value”時,你可以通過調(diào)用來輕松地設(shè)置它:

$mockObject->someFunction("some input")->willReturn("some value");

有時我們并不真正關(guān)心傳遞給 mock 的確切參數(shù)。然后可以寫這段代碼:

use Prophecy\Argument\Token\AnyValueToken;
$mockObject->someFunction(new AnyValueToken())->willReturn(true);

有時你會關(guān)心一些參數(shù),最好是寫一個檢查函數(shù),它會告訴你是否正確地調(diào)用了一些方法,例如:

use Prophecy\Argument\Token\CallbackToken;
$checker = function (Message $message) use ($to, $text) {  
	return $message->to === $to  $message->text === $text;
};
$msgSender->send(new CallbackToken($messageChecker))->shouldBeCalled()

匹配運(yùn)行時異常

。在某些情況下,異常是代碼接口的一部分。你希望它們在特定的場景被拋出。你可以通過編寫以下代碼來完成這項(xiàng)工作:

$this->shouldThrow(\DomainException::class)->during('execute', [$command, $responder]);

傳給 during() 的第一個參數(shù)是將要調(diào)用的方法的名稱,第二個參數(shù)是將傳遞給我們的方法的參數(shù)數(shù)組。

4、在哪里可以找到更多的例子?

在本文中,我們只介紹了一些基本的用例。請參考 phpspec 的文檔,以找到更多的示例,這些示例將使你的測試代碼變得漂亮!

代碼覆蓋率

PHPSpec 附帶了擴(kuò)展子系統(tǒng),它允許例如創(chuàng)建代碼覆蓋率報(bào)告。如果您想要檢查在測試中執(zhí)行了多少代碼,它們是很有幫助的。

你可以通過以下來安裝這個擴(kuò)展:

$ php composer.phar require --dev leanphp/phpspec-code-coverage

然后通過創(chuàng)建 phpspec 來啟用它。yml 文件內(nèi)容:

1 extensions: LeanPHP\PhpSpec\CodeCoverage\CodeCoverageExtension: ~

默認(rèn)情況下,這個擴(kuò)展會使用 PHP 的 Xdebug 擴(kuò)展生成代碼覆蓋率信息,但是 PHP 的本機(jī)調(diào)試器 - phpdbg 會更快速一些:

$ phpdbg -qrr phpspec run

現(xiàn)在,你可以在 build 中更改 phpspec 的構(gòu)建目標(biāo)。xml:

target name="phpspec">
	exec executable="phpdbg" passthru="true" checkreturn="true">
		arg line="-qrr bin/phpspec run --format=pretty" />
	/exec>
/target>...
target name="run" depends="phpcs,phpcpd,phan,phpspec" />

報(bào)告在覆蓋率 / 目錄中生成,作為漂亮的 HTML 頁面,可以瀏覽以檢查測試覆蓋率。

以上就是淺談如何提高PHP代碼質(zhì)量之單元測試的詳細(xì)內(nèi)容,更多關(guān)于如何提高PHP代碼質(zhì)量之單元測試的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • PHPUnit 單元測試安裝與使用入門教程
  • ThinkPHP5與單元測試PHPUnit使用詳解
  • PHP單元測試配置與使用方法詳解
  • PHPUnit + Laravel單元測試常用技能
  • PHP使用phpunit進(jìn)行單元測試示例
  • 使用PHPUnit進(jìn)行單元測試并生成代碼覆蓋率報(bào)告的方法
  • PHPStorm中如何對nodejs項(xiàng)目進(jìn)行單元測試詳解
  • PHP單元測試框架PHPUnit用法詳解
  • thinkPHP框架單元測試庫tpunit用法示例

標(biāo)簽:溫州 怒江 金華 七臺河 白城 洛陽 酒泉 赤峰

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談如何提高PHP代碼質(zhì)量之單元測試》,本文關(guān)鍵詞  淺談,如何,提高,PHP,代碼,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談如何提高PHP代碼質(zhì)量之單元測試》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談如何提高PHP代碼質(zhì)量之單元測試的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    中江县| 原阳县| 金寨县| 沈丘县| 南乐县| 平原县| 龙山县| 林芝县| 安丘市| 随州市| 新兴县| 河津市| 上思县| 平乡县| 关岭| 成安县| 津市市| 鸡东县| 高唐县| 钦州市| 迁安市| 江都市| 龙游县| 淮阳县| 静乐县| 碌曲县| 长丰县| 五指山市| 米泉市| 拉萨市| 汝南县| 台东县| 屯昌县| 五寨县| 治多县| 那曲县| 凤翔县| 台南市| 灵台县| 蕲春县| 邢台市|