2009-02-10 28 views
24

有沒有什麼辦法用DUnit來測量代碼覆蓋率?還是有沒有免費的工具來完成這個工作?你使用什麼?你通常會使用哪些代碼覆蓋?德爾福的測量代碼覆蓋率

Jim McKeeth:謝謝你的詳細解答。我正在談論TDD方法意義上的單元測試,不僅僅是關於發生故障後的單元測試。我對一些基本的預先寫好的單元測試可以實現的代碼覆蓋率感興趣。

+0

我還沒有接受其中一個答案,因爲我想鼓勵人們寫他們對單元測試的看法,他們使用什麼工具和什麼覆蓋面他們試圖實現。所以大家,隨時發表評論;) – jpfollenius 2009-02-18 16:06:25

回答

24

我剛剛創建了谷歌代碼一個新的開源項目,一個基本的代碼覆蓋工具,2010年德爾福https://sourceforge.net/projects/delphicodecoverage/

現在它可以測量線覆蓋,但我打算添加的類和方法也覆蓋。

它生成帶有摘要的html報告,並標記了顯示哪些行覆蓋的行(綠色),哪些行不是(紅色)以及沒有爲它們生成任何代碼的其餘行。

更新: 作爲的Delphi Code Coverage 0.3版本,你可以生成與哈德森EMMA插件內Hudson顯示代碼覆蓋率趨勢兼容的XML報告。

更新: 0.5版帶來的bug修復,增加了可配置性和清理報告

更新: 1.0版帶來了艾瑪輸出,覆蓋的DLL和BPLs

的類和方法和覆蓋面支持
7

您是指單元測試或陳舊代碼的代碼覆蓋率?一般來說,我認爲只有可測試代碼出現故障時才應該用單元測試來覆蓋(是的,我意識到這可能是開始一場神聖的戰爭,但那是我的立場)。所以這個比例相當低。

另一方面,陳舊的代碼是另一回事。陳舊的代碼是沒有被使用的代碼。你很可能不需要一個工具來告訴你很多你的代碼,只需在Delphi中編譯後查找小藍點即可。沒有藍點的任何東西都是陳舊的。通常如果代碼沒有被使用,那麼它應該被刪除。所以這將是100%的代碼覆蓋率。

過時的代碼還有其他一些情況,例如如果日期在二月三十一日登陸時有特殊代碼可以處理。編譯器不知道它不會發生,所以編譯它並給它一個藍點。現在你可以爲它編寫一個單元測試,並測試它,它可能會工作,但是你第二次浪費了你的時間(第一次寫代碼,第二次測試它)。

有一些工具可以跟蹤程序運行時使用哪些代碼路徑,但這只是simi-reliable,因爲並不是所有的代碼路徑每次都會被使用。就像你必須處理閏年的特殊代碼一樣,它只會每四年運行一次。所以如果你把它拿出來,那麼你的程序將每四年打破一次。

我想我沒有真正回答你關於DUnit和代碼覆蓋率的問題,但我想我可能已經給你留下了更多的問題,然後你開始了。你在尋找什麼樣的代碼覆蓋?

更新:如果您正在採用TDD方法,那麼在您爲其編寫測試之前不寫任何代碼,因此本質上您有100個測試覆蓋率。當然,僅僅因爲每種方法都是通過測試來執行的,並不意味着它的整個行爲範圍都會被執行。 SmartInspect提供了一種非常簡單的方法來衡量哪些方法與時間一起被調用等。它比AQTime少一點,但不是免費的。通過一些更多的工作,您可以添加工具來測量每個代碼路徑(「if」語句的分支等)。當然,您也可以將自己的日誌記錄添加到您的方法中以獲得覆蓋報告,這是免費的(好吧,期待你的時間,這可能比那些工具更值錢)。如果您使用JEDI調試,那麼您也可以獲得調用堆棧。

TDD真的不能很容易地被追溯應用到現有的代碼中,而沒有大量的重構。儘管較新的Delphi IDE能夠爲每個公共方法生成單元測試存根,然後可以100%覆蓋您的公共方法。你在這些存根中所做的決定了覆蓋面的有效性。

+0

謝謝。我編輯了這個問題,使其更清楚我的意思。 – jpfollenius 2009-02-10 10:02:26

+0

我加了一些以覆蓋TDD。 – 2009-02-10 17:47:35

+0

「......但這只是simi-reliable ...你的程序每四年就會被破壞。」那就是對代碼進行單元測試(當前)沒有失敗可能有助於防止代碼覆蓋僅在非閏年運行時被刪除? :)就個人而言,我認爲任何處理日期的函數都應在單元測試中進行,並將各種日期的日期傳遞給它們。同樣適用於處理「環境因素」的任何「基本」功能。您不希望依賴當前機器設置/日期來測試/覆蓋結果。 – 2010-05-30 07:15:55

11

我不知道任何免費工具。 AQTime幾乎是德爾福剖析的事實標準。我沒有使用它,但快速搜索發現Discover for Delphi,它現在是開源的,但只是代碼覆蓋。

這些工具中的任何一個都應該讓你知道你的單元測試獲得了多少代碼覆蓋率。

+0

發現德爾福現在是開源https://sourceforge.net/projects/discoverd/ – 2010-08-13 14:35:21

5

我使用Discover for Delphi,它的工作,用DUnit進行單元測試和用TestComplete進行功能測試。

Discover可以配置爲從命令行運行以實現自動化。 在:

Discover.exe Project.dpr -s -c -m 
2

發現對我很好。與AQTime不同,它幾乎不會降低您的應用程序。當然,這對你來說可能不是問題。我認爲AQTime的最新版本在這方面表現更好。

1

我一直在使用發現「多年來,出色地工作到和包括BDS2006(這是德爾福我使用和仍然使用的最後一個預XE *版本),但它目前的開源狀態,尚不清楚如何製作它與Delphi的XE *版本一起工作ame真的,因爲我喜歡這個工具,幾乎在任何方面都快速和方便。 所以現在我正在移動到delphi代碼覆蓋...