日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:22日期:2022-09-07 09:44:06
目錄1、單元測試2、應該使用哪個框架?3、如何設置測試?構建測試對象在模擬中匹配運行時參數匹配運行時異常4、在哪里可以找到更多的例子?1、單元測試

通過實現單一責任原則(我們的代碼應該只關注功能的單個部分),我們將確保在測試期間,我們只會同時關注項目的一小部分

通過使用 Liskov 替換原則和依賴倒置原則,我們的代碼不會關心我們是否注入模擬依賴關系,只要它們實現了適當的接口

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

2、應該使用哪個框架?

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

安裝過程相當簡單 - 只需使用:

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

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

<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' />

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

//spec/Domain/PriceComparatorSpec.php<?phpnamespace specDomain;use DomainPrice;use DomainPriceConverter;use PhpSpecObjectBehavior;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); }}

這里有三個函數:

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

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

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

3、如何設置測試?

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

構建測試對象

一般來說,設置測試對象的最簡單方法是調用 $this->beConstructedWith(…) 方法,該方法將所有應該傳遞給對象構造函數的 params 作為參數。

如果你的對象應該使用工廠方法來創建,那么你可以使用

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

在模擬中匹配運行時參數

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

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

如果你想要測試代碼的行為,當一些 mock 的函數返回“some value”時,你可以通過調用來輕松地設置它:

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

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

use ProphecyArgumentTokenAnyValueToken;$mockObject->someFunction(new AnyValueToken())->willReturn(true);

有時你會關心一些參數,最好是寫一個檢查函數,它會告訴你是否正確地調用了一些方法,例如:

use ProphecyArgumentTokenCallbackToken;$checker = function (Message $message) use ($to, $text) { return $message->to === $to && $message->text === $text;};$msgSender->send(new CallbackToken($messageChecker))->shouldBeCalled()匹配運行時異常

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

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

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

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

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

代碼覆蓋率

PHPSpec 附帶了擴展子系統,它允許例如創建代碼覆蓋率報告。如果您想要檢查在測試中執行了多少代碼,它們是很有幫助的。

你可以通過以下來安裝這個擴展:

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

然后通過創建 phpspec 來啟用它。yml 文件內容:

1 extensions: LeanPHPPhpSpecCodeCoverageCodeCoverageExtension: ~

默認情況下,這個擴展會使用 PHP 的 Xdebug 擴展生成代碼覆蓋率信息,但是 PHP 的本機調試器 - phpdbg 會更快速一些:

$ phpdbg -qrr phpspec run

現在,你可以在 build 中更改 phpspec 的構建目標。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' />

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

以上就是淺談如何提高PHP代碼質量之單元測試的詳細內容,更多關于如何提高PHP代碼質量之單元測試的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产久精国产| 国产精品一二| 奇米亚洲欧美| 免费美女久久99| 视频在线观看91| 国产综合亚洲精品一区二| 91精品婷婷色在线观看| 欧美在线影院| 日韩中文字幕视频网| 青草综合视频| 亚洲精品自拍| 日韩精品一区二区三区av| 欧美激情在线精品一区二区三区| 精品三区视频| 国产精品成人一区二区网站软件| 日韩成人高清| 亚洲激情中文在线| 欧美中文一区二区| 欧美日韩 国产精品| 正在播放日韩精品| 欧美搞黄网站| 欧美精品羞羞答答| 亚洲专区一区| 日本午夜免费一区二区| 欧美日韩a区| 久久精品三级| 韩国三级一区| 99久久精品网站| 久久伊人亚洲| 久久人人精品| 欧美日韩视频一区二区三区| 欧美色图国产精品| 久久精品高清| 模特精品在线| 97久久亚洲| 国产日本亚洲| 日韩综合一区| 性色一区二区| 亚洲自啪免费| 日韩和的一区二在线| 综合日韩av| 日韩黄色大片网站| 亚洲精品乱码久久久久久蜜桃麻豆| 国产亚洲精品久久久久婷婷瑜伽| 国产精品主播| 欧美国产不卡| 91精品啪在线观看国产18| 九一成人免费视频| 中文字幕一区二区三区日韩精品| 久久精品国产久精国产| 国产精品久久久久77777丨| 精品久久影院| 久久精品91| 午夜电影一区| 你懂的亚洲视频| 国产专区一区| 蜜桃久久久久久| 成人在线免费观看网站| 欧美一区=区| 亚洲精品乱码| 国产理论在线| 91成人网在线观看| 欧美亚洲综合视频| 成人在线免费观看网站| 亚洲一区二区三区四区五区午夜| 亚洲精品少妇| 成人va天堂| 蜜臀av亚洲一区中文字幕| 日本va欧美va欧美va精品| 久久久久国产精品一区二区| 视频一区二区欧美| 国产va在线视频| 国产精品三上| 动漫av一区| 免费在线观看一区二区三区| 日本一区二区高清不卡| 黄色在线一区| 亚洲资源在线| 波多野结衣久久精品| 亚州av乱码久久精品蜜桃| 国产精品九九| 亚洲精品888| 成人在线免费观看91| 久久国产福利| 国产资源在线观看入口av| 丝袜亚洲另类欧美| 桃色av一区二区| 三级一区在线视频先锋| 你懂的国产精品| 久久先锋影音| 精品视频黄色| 国产精品一区二区99| 国产麻豆久久| 欧美+日本+国产+在线a∨观看| 国产精品久久久亚洲一区| 亚洲电影在线一区二区三区| 国产精品videossex久久发布 | 日韩一区二区在线免费| 日韩欧美中文在线观看| 国产日韩电影| 久久久久伊人| 一区二区亚洲视频| 国内激情久久| 国产成人精品亚洲线观看| 国产视频一区三区| 国产精品毛片一区二区在线看| 一区二区国产在线观看| 欧美日韩精品一本二本三本| 激情综合五月| 欧美日一区二区三区在线观看国产免 | 欧美特黄一区| 日韩久久电影| 美女免费视频一区| 亚洲区国产区| 亚洲欧美久久| 日韩一区电影| 久久久久久夜| 国产精久久一区二区| 老司机精品久久| 国产精品久久久久av电视剧| 久久精品高清| 久久蜜桃资源一区二区老牛| 精品一区二区三区免费看| 国产欧美日韩精品一区二区免费| 99在线精品免费视频九九视 | 国产一区二区三区免费在线| 色8久久久久| 在线免费观看亚洲| 亚洲精品网址| 性欧美xxxx免费岛国不卡电影| 国产劲爆久久| 偷拍欧美精品| 日本欧美不卡| 精品72久久久久中文字幕| 开心激情综合| 国产精品久久久网站| 国产精品久久久免费| 欧美片第1页综合| 日本综合精品一区| 香蕉久久一区| 亚洲天堂日韩在线| 最新国产精品久久久| 视频一区在线视频| 日本va欧美va瓶| 久久av在线| 亚洲一区av| 视频一区二区三区入口| 亚洲精品福利| 日韩激情精品| 国产乱子精品一区二区在线观看| 亚洲精品日本| 中文字幕亚洲在线观看| 久久都是精品| 免费毛片在线不卡| 六月婷婷一区| 欧美美女一区| 蜜桃视频在线观看一区二区| 老牛影视一区二区三区| 日韩精品电影一区亚洲| 亚洲一区二区免费在线观看| 日韩制服丝袜先锋影音| 首页亚洲欧美制服丝腿| 日韩高清国产一区在线| 日韩国产欧美在线播放| 免费看一区二区三区| 国产精品分类| 亚洲成人二区| re久久精品视频| 亚洲青青久久| 国产三级一区| 岛国av在线播放| 日本精品影院| 亚洲欧美网站在线观看| 欧美亚洲综合视频| 麻豆久久一区| 日本欧美国产| 午夜欧美精品久久久久久久| 日韩中文字幕麻豆| 国产精品.xx视频.xxtv| 国产福利91精品一区二区| 久久精品123| 先锋亚洲精品| 国产亚洲一区二区三区啪| 麻豆成人在线| 国产探花一区| 免费一级欧美片在线观看网站| 六月婷婷综合| 好看的av在线不卡观看| 日韩福利在线观看| 国产精品久久| 精品中文字幕一区二区三区av| 老色鬼久久亚洲一区二区| 精品中文在线| 欧美一级精品| 国产精品一区亚洲| 日韩精品dvd| 日韩1区2区日韩1区2区| 国产成人免费精品| 蜜桃视频一区二区三区在线观看| 国产欧美三级|