2011-04-20 98 views
4

我在嘗試確定我們網站上的代碼覆蓋率時遇到了問題。我使用PHPUnit生成了一個html代碼覆蓋率報告,同時在我們的三個應用上運行我們的單元測試。我們有一個公共應用程序,一個管理應用程序和一個報告應用程序。我想以某種方式將這些結合到一個代碼覆蓋率報告中,因爲這些應用程序共享代碼。使用PHPUnit的代碼覆蓋範圍

看來代碼覆蓋率只是計算測試「接觸」的文件的覆蓋率,所以完全未經測試的文件沒有用於計算。有誰知道如何將這些未使用的文件拖入計算中?有沒有辦法告訴覆蓋率生成器使用特定目錄進行計算,以便拉入未觸及的文件?我在phpunit的配置文件中設置了白名單,並將其設置爲我們項目的根目錄。歡迎所有意見,答覆和建議。

+1

答案顯然是寫到調用不變文件測試。 – 2011-04-20 23:26:24

+0

這是真的,但我試圖避免這一點,因爲我想獲得相對準確的代碼覆蓋率以設定目標。 PHPUnit在線文檔似乎給人的印象是,將這些文件添加到白名單將包括他們,但我不太確定。 – Dave 2011-04-21 00:51:31

+0

我不知道我是否真的瞭解您的問題,但您爲什麼要在代碼覆蓋率報告中包含未觸及的文件?例如如果有一個腳本A在運行testX時無關(因此未觸及),爲什麼腳本A應該包含在代碼覆蓋率報告中? – 2014-03-20 13:29:47

回答

4

如果您在phpunit.xml配置文件中設置了<whitelist>,則應該查看所有未涵蓋的文件。這可能是一個問題,嘗試絕對的看到它爲某些文件創建0%覆蓋率,然後使相對路徑起作用。

爲了將覆蓋範圍結合起來,您可以使用phpunit,我知道的不多。您可以手動合併覆蓋率結果(PHPUnit_Coverage包),然後弄清楚如何渲染它們,但您需要手動完成。至少我不知道有任何項目/工具/方式可以幫助你。

最簡單的方法是在一個phpunit運行中運行所有3個測試套件,並讓它爲您所在的部件生成代碼覆蓋率。

+0

是的問題是我有三個獨立的應用程序,所以它必須是三個單獨的phpunit調用。感謝您在白名單上的信息,我會仔細檢查我的路徑。 – Dave 2011-04-21 16:05:27

+0

爲什麼你不能在一個PHP進程中運行所有這三個應用程序? – edorian 2011-04-23 03:52:22

+0

我們有一個phpunit-admin運行管理應用程序,一個phpunit報告爲我們的報告應用程序。 – Dave 2011-04-25 16:03:16

-1

我認爲PHPUnit使用XDebug,它爲實際執行的文件提供字面覆蓋數據。它不能爲從未執行的文件提供數據,因爲調試器從不會看到它們。您可以手動修補PHPUnit機制,將您認爲應用程序中所有文件的列表添加到從XDebug返回的結果中。

我們的PHP Test Coverage tool的工作原理是不同的。你給它一個你認爲是你的應用程序的一部分的所有文件的列表;它可以幫助你建立這個列表。 (這是您必須修補到第一個解決方案中的相同列表)它提供全部文件,並收集測試覆蓋率數據。您現在獲得的覆蓋率數據正確包含所有內容。它應該適用於PHPUnit。

你可以走得更遠。您可以爲每個「獨立」應用程序創建測試覆蓋範圍,並分別運行它們。然後,您可以合併所有這些數據的覆蓋率數據,以查看整個集合的覆蓋率。

+0

感謝您的信息! – Dave 2011-04-21 00:52:03

+3

PHPUnit還支持列出未覆蓋其覆蓋報告的代碼,只需將其添加到您的'phpunit.xml'中的白名單。停止傳播FUD。 – cweiske 2011-04-30 11:51:24

-1

這聽起來很瘋狂,但爲什麼不只是創建一個測試用例,遞歸循環遍歷項目文件夾,並在它找到的每個文件上運行require_once?這應該允許XDebug爲每個需要的文件創建一個新的代碼覆蓋html文件。

+0

蠻力!這實際上會起作用嗎?如果是這樣,它可能是一個快速修復,直到我可以更少的「哈克」。謝謝詹姆斯! – Dave 2011-04-22 16:17:09

+0

此外,我們正在使用symfony框架,我們目前正在測試的一些操作具有重複的名稱。 (例如,listAction)我們在我們的網站上使用了一個類名稱修剪器,以避免與此相關的一些問題。如果文件名相同,將不會運行require_once導致錯誤? – Dave 2011-04-22 17:56:16

+0

不同目錄中的相同文件名不是問題。 – 2012-10-11 15:05:56

0

我面臨同樣的問題,我只是在運行測試套件之前添加了測試存根的生成(對於每個類和公共方法)。您有,即使選擇PHPUnit中:

http://www.phpunit.de/manual/current/en/skeleton-generator.html

+0

不知道PHPUnit能夠生成骨架代碼!感謝那!看起來我仍然會遇到我們的應用程序共享代碼問題並生成單獨的代碼覆蓋率報告。 – Dave 2011-04-22 16:10:39

+0

@Dave Dohr:您應該在一個腳本中運行三個套件,並使用PHP_CodeCoverage :: merge()從這些實例中加入數據,然後生成HTML/Clover報告 – 2011-04-22 22:13:19

+0

我正在用巡航控件在一個螞蟻腳本中運行套件。我會如何去做這件事?搜索PHP_CodeCoverage :: merge()無濟於事。 – Dave 2011-04-25 16:05:30

2

使用<whitelist processUncoveredFilesFromWhitelist="true">像這樣:

<filter> 
    <whitelist processUncoveredFilesFromWhitelist="true"> 
    <directory suffix=".php">../folder/</directory> 
    </whitelist> 
</filter>