為你的 PHP 程序編寫自動(dòng)化測(cè)試被認(rèn)為是最佳實(shí)踐,可以幫助你建立良好的應(yīng)用程序。 自動(dòng)化測(cè)試是非常棒的工具,它能確保你的應(yīng)用程序在改變或增加新的功能時(shí)不會(huì)影響現(xiàn)有的功能,不應(yīng)該忽視。
PHP 有一些不同種類的測(cè)試工具 (或框架) 可以使用,它們使用不同的方法 - 但他們都試圖避免手動(dòng)測(cè)試和大型 QA 團(tuán)隊(duì)的需求,確保最近的變更不會(huì)破壞既有功能。
Wikipedia 上的定義:
測(cè)試驅(qū)動(dòng)開發(fā) (TDD) 是一種以非常短的開發(fā)周期不斷迭代的軟件開發(fā)過程:首先開發(fā)者對(duì)將要實(shí)現(xiàn)的功能或者新的方法寫一個(gè)失敗的自動(dòng)化測(cè)試用例,然后就去寫代碼來通過這個(gè)測(cè)試用例,最終通過重構(gòu)代碼讓一其達(dá)到可接受的水準(zhǔn)。Kent Beck, 這個(gè)技術(shù)創(chuàng)造者或者說重新發(fā)現(xiàn)者,在2003年聲明TDD 鼓勵(lì)簡(jiǎn)單的設(shè)計(jì)和激勵(lì)信心。
目前你可以應(yīng)用的幾種不同類型的測(cè)試:
單元測(cè)試是一種編程方法來確認(rèn)函數(shù),類和方法以我們預(yù)期的方式來工作,單元測(cè)試會(huì)貫穿整個(gè)項(xiàng)目的開發(fā)周期。通過檢查各個(gè)函數(shù)和方法的輸入輸出,你就可以保證內(nèi)部的邏輯已經(jīng)正確執(zhí)行。通過使用依賴注入和編寫"mock" 類以及 stubs 來確認(rèn)依賴被正確的使用,提高測(cè)試覆蓋率。
當(dāng)你創(chuàng)建一個(gè)類或者一個(gè)函數(shù),你應(yīng)該為它們的每一個(gè)行為創(chuàng)建一個(gè)單元測(cè)試。至少你應(yīng)該確認(rèn)當(dāng)你輸入一個(gè)錯(cuò)誤參數(shù)會(huì)觸發(fā)一個(gè)錯(cuò)誤,你輸入一個(gè)有效的參數(shù)會(huì)得到正確的結(jié)果。這會(huì)幫助你在開發(fā)周期后段對(duì)類或者函數(shù)做出修改后,確認(rèn)已有的功能任然可以正常的工作??商娲姆椒ㄊ窃谠创a中使用 var_dump()
,但這種方法卻不能去構(gòu)建一個(gè)或大或小的應(yīng)用。
單元測(cè)試的其他用處是在給開源項(xiàng)目貢獻(xiàn)代碼時(shí)。如果你寫了一個(gè)測(cè)試證明代碼有bug,然后修復(fù)它,并且展示測(cè)試的過程,這樣補(bǔ)丁將會(huì)更容易被接受。如果你在維護(hù)一個(gè)項(xiàng)目,在處理 pull request 的時(shí)候可以將單元測(cè)試作為一個(gè)要求。
PHPUnit 是業(yè)界PHP應(yīng)用開發(fā)單元測(cè)試框架的標(biāo)準(zhǔn),但也有其他可選的框架:
Wikipedia 上的定義:
集成測(cè)試 (有時(shí)候稱為集成和測(cè)試,縮寫為
I&T
)是把各個(gè)模塊組合在一起進(jìn)行整體測(cè)試的軟件測(cè)試階段。它處于單元測(cè)試之后,驗(yàn)收測(cè)試之前。集成測(cè)試將已經(jīng)經(jīng)過了單元測(cè)試的模塊做為輸入模塊,組合成一個(gè)整體,然后運(yùn)行集成測(cè)試用例,然后輸出一個(gè)可以進(jìn)行系統(tǒng)測(cè)試的系統(tǒng)。
許多相同的測(cè)試工具既可以運(yùn)用到單元測(cè)試,也可以運(yùn)用到集成測(cè)試。
有時(shí)候也被稱之為驗(yàn)收測(cè)試,功能測(cè)試是通過使用工具來生成自動(dòng)化的測(cè)試用例,然后在真實(shí)的系統(tǒng)上運(yùn)行。而不是單元測(cè)試中簡(jiǎn)單的驗(yàn)證單個(gè)模塊的正確性和集成測(cè)試中驗(yàn)證各個(gè)模塊間交互的正確性。這些工具會(huì)使用代表性的真實(shí)數(shù)據(jù)來模擬真實(shí)用戶的行為來驗(yàn)證系統(tǒng)的正確性。
有兩種不同的行為驅(qū)動(dòng)開發(fā) (BDD): SpecBDD 和 StoryBDD。 SpecBDD 專注于代碼的技術(shù)行為,而 StoryBDD 專注于業(yè)務(wù)邏輯或功能的行為和互動(dòng)。這兩種 BDD 都有對(duì)應(yīng)的 PHP 框架。
采用 StoryBDD 時(shí), 你編寫可讀的故事來描述應(yīng)用程序的行為。接著這些故事可以作為應(yīng)用程序的實(shí)際測(cè)試案例執(zhí)行。Behat 是使用在 PHP 應(yīng)用程序中的 StoryBDD框架,它受到 Ruby 的 Cucumber 項(xiàng)目的啟發(fā)并且實(shí)現(xiàn)了 Gherkin DSL 來描述功能的行為。
采用 SpecBDD 時(shí), 你編寫規(guī)格來描述實(shí)際的代碼應(yīng)該有什么行為。你應(yīng)該描述函數(shù)或者方法應(yīng)該有什么行為,而不是測(cè)試函數(shù)或者方法。PHP 提供了 PHPSpec 框架來達(dá)到這個(gè)目的,這個(gè)框架受到了 Ruby 的 RSpec project 項(xiàng)目的啟發(fā)。
除了個(gè)別的測(cè)試驅(qū)動(dòng)和行為驅(qū)動(dòng)框架之外,還有一些通用的框架和輔助函數(shù)類庫,對(duì)任何的測(cè)試方法都很有用。