2011-09-11 69 views
1

用例:我正在嘗試爲我的單元測試框架創建一個診斷測試,該框架運行每個測試用例,然後返回尚未覆蓋的公共方法列表測試用例。我們的想法是通過確保每個公共方法都通過至少1個單元測試來測試,從而獲得更高的測試覆蓋率。在PHP中跟蹤以前的方法調用

問題:我在檢測一個類的方法是否被調用時遇到了問題。我試過使用debug_backtrace()函數,但它只返回來自測試框架的調用,而不是正在測試的類方法。唯一可以運行方法名的方法是將debug_backtrace()函數放入被測試類的方法中,這是一個不可接受的選項,因爲我必須在每個類的每個公共方法中都有。

是否有這樣做的回溯,以獲得測試類方法的替代方式?或者,用稍微不同的方法,是否有辦法開始和停止一個監聽器,它將記錄所有被調用的方法(我可以解析出不屬於的任何內容)?

僞代碼

runTest($testName){ 

    //run the test 
    //get all recent classes and methods used 
    //parse out test framework info 
    //compare used public methods to public method list for the tested class 

} 

或者:

runTest($testName){ 

    //start listener 
    //run the test 
    //close listener, get all recent classes and methods used 
    //parse out test framework info 
    //compare used public methods to public method list for the tested class 

} 
+1

「我們的想法是通過確保每個的所有公共方法由至少1單元測試測試,以獲得提高測試覆蓋率。」 ---我不認爲這個指標可以代表*任何有用的*。爲什麼不像其他(phpunit)測試框架那樣使用xdebug呢? – zerkms

+0

@zerkms - 你能解釋爲什麼你不認爲這個指標是有用的嗎?重點不是暗示至少有一個單元測試完全覆蓋了一個方法,而是指出哪些公共方法根本沒有任何*覆蓋。至於xdebug,如果我不需要,我寧願不強制用戶安裝額外的擴展。 – VirtuosiMedia

+0

「任何通話」對我來說都沒有用處。方法可以是100行的長度,但覆蓋1%(只要第一行用if($ bla)return;')。 – zerkms

回答

2

Code Coverage tools for PHP,對一些常見的方法來解決您的問題Xdebug 2: Code Coverage AnalysisSebastian Bergmann's PHP_CodeCoverage

你需要的是平時做從外面看PHP。使用debug_backtrace()速度很慢,正如你所說的,不能完全依賴,因爲你真的想要一個不會修改你php腳本的行爲的監視器(例如在回溯中包括你的測試方法)。

+0

謝謝你的回答,chelmertz。你知道有沒有使用Xdebug的方法嗎? (它看起來像所有這些解決方案都需要它)。 – VirtuosiMedia

+0

@VirtuosiMedia:不,我不會,對不起。儘管如此,我仍然依靠xdebug,它非常穩固,並被主流使用。由於它是一個「額外」度量標準,我可以很好地依賴xdebug,但我不是你:) – chelmertz

1

見我們PHP Test Coverage Tool。它會在您的程序運行時收集測試覆蓋率數據,而不使用xdebug。它通過臨時將檢測插入代碼中,例如在測試過程中進行。

你回來的測試覆蓋率數據,顯示在一個漂亮的UI疊加的代碼,所以你可以看到什麼是覆蓋(另一種OP指出可能被執行的方法,但不能有效地覆蓋)。您還可以返回一份報告,指出未涵蓋的內容,與代碼的層次結構相匹配。它的XML版本包含你想要的信息:這樣一種方法被/未被覆蓋以及在什麼程度上。

+0

該工具看起來不錯,但是如果代碼的目的是在狂野。既然你採取了這種方法,你是否也覺得有沒有簡單的方法在PHP內部做到這一點? – chelmertz

+0

@chlemertz:是的,沒有。我們通常採取這種方式建立我們的工具,以防自衛;如果我們不必依靠神祕的語言調試基礎設施,當我們需要的東西不存在時,我們不會停滯不前。在PHP的情況下,Xdebug的存在是可能的;在服務器上有代碼的人通常沒有它,服務器管理員也不會安裝它。無論XDebug是否存在,我們的解決方案都可以工作。我不確定我是否理解你對「依賴......如果要將代碼發佈到野外」的反對意見。我們的儀器是暫時的;無需保留或運送。運送您的原始代碼。 –

+0

你的工具看起來非常好,但是(缺乏更好的單詞)似乎比xdebug更難獲取,因爲它似乎只是Windows,並且它有一個價格標籤。同樣的道理,「xdebug可以在PHP測試覆蓋工具中使用」。沒有冒犯,+1 – chelmertz