电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:7日期: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
相關文章:
主站蜘蛛池模板: 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 中国品牌排名投票_十大品牌榜单_中国著名品牌【中国品牌榜】 | 优宝-汽车润滑脂-轴承润滑脂-高温齿轮润滑油脂厂家 | 潍坊青州古城旅游景点攻略_青州酒店美食推荐-青州旅游网 | 胃口福饺子加盟官网_新鲜现包饺子云吞加盟 - 【胃口福唯一官网】 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 环比机械| EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 生物风-销售载体,基因,质粒,ATCC细胞,ATCC菌株等,欢迎购买-百风生物 | 镀锌钢格栅_热镀锌格栅板_钢格栅板_热镀锌钢格板-安平县昊泽丝网制品有限公司 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 分轨 | 上传文件,即刻分离人声和伴奏 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 杭州高温泵_热水泵_高温油泵|昆山奥兰克泵业制造有限公司 | 河南不锈钢水箱_地埋水箱_镀锌板水箱_消防水箱厂家-河南联固供水设备有限公司 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 黑龙江「京科脑康」医院-哈尔滨失眠医院_哈尔滨治疗抑郁症医院_哈尔滨精神心理医院 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 振动台-振动试验台-振动冲击台-广东剑乔试验设备有限公司 | 数字展示在线_数字展示行业门户网站| 酒精检测棒,数显温湿度计,酒安酒精测试仪,酒精检测仪,呼气式酒精检测仪-郑州欧诺仪器有限公司 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 |