国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - PHP教程 - 淺談如何提高PHP代碼質(zhì)量之單元測(cè)試

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

2021-11-17 15:51八重櫻 PHP教程

最常見(jiàn)的測(cè)試軟件的方法可能是編寫(xiě)單元測(cè)試。它們的目的是測(cè)試代碼的特定單元,基于這樣的假設(shè):一切都按預(yù)期運(yùn)行。為了能夠編寫(xiě)適當(dāng)?shù)膯卧獪y(cè)試,我們的代碼應(yīng)該遵循一些基本的設(shè)計(jì)規(guī)則。我們應(yīng)該特別關(guān)注 SOLID 原則。

1、單元測(cè)試

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

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

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

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

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

安裝過(guò)程相當(dāng)簡(jiǎn)單 - 只需使用:

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

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

?
1
2
3
4
5
6
<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" />

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//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);
    }
}

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

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

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

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

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

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

構(gòu)建測(cè)試對(duì)象

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

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

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

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

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

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

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

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

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

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

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

?
1
2
3
4
5
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)行時(shí)異常

。在某些情況下,異常是代碼接口的一部分。你希望它們?cè)谔囟ǖ膱?chǎng)景被拋出。你可以通過(guò)編寫(xiě)以下代碼來(lái)完成這項(xiàng)工作:

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

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

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

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

代碼覆蓋率

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

你可以通過(guò)以下來(lái)安裝這個(gè)擴(kuò)展:

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

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

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

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

$ phpdbg -qrr phpspec run

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

?
1
2
3
4
5
6
<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 頁(yè)面,可以瀏覽以檢查測(cè)試覆蓋率。

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

原文鏈接:https://www.cnblogs.com/a609251438/p/11995603.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成人久久久 | 国产精品久久久久国产a级 九九在线精品视频 | 色.com| 欧美一区免费 | 国产精品久久久亚洲 | 久久久人成影片一区二区三区 | 久久久久久久av | 一级片免费视频 | 国产精品久久久久久久久久久久午夜片 | 国产欧美久久一区二区三区 | 日韩精品久久久 | a一级黄| 国产欧美精品一区二区色综合 | 欧美中文字幕一区二区三区 | 国产精品123| 久久久网| 在线激情视频 | 午夜私人影院 | 免费视频一区 | 久久久久av69精品 | 国产精品久久久久久久久免费桃花 | 天天插天天干 | 最近2019年好看中文字幕视频 | 国产精品69毛片高清亚洲 | 精品日韩一区二区 | 亚洲国产精品一区二区三区 | 俺来也俺也啪www色 性色视频在线 | 欧美九九九 | 久久e久久 | 国产成人久久精品麻豆二区 | 天堂精品久久 | 国产资源免费观看 | 国产丝袜一区 | 午夜精品视频在线观看 | 91精品在线播放 | 亚洲精品久久久久久国产精华液 | 亚洲精品久久久久久下一站 | 伊人五月 | 精品国产99 | 久草成人网 | 久久一区视频 |