2015-06-04 274 views
2

團隊負責人的問題之一是團隊中的人員(有時甚至包括我自己)經常創建沒有任何測試功能的JUnit測試。JUnit報告顯示測試功能,而不是覆蓋

這很容易做到,因爲開發人員使用他們的JUnit測試作爲啓動他們正在編碼的應用程序的一部分,然後有意或無意地在沒有任何斷言測試或模擬驗證的情況下進行檢查。

然後後來忘記測試是不完整的,但他們通過併產生了很好的代碼覆蓋率。運行應用程序並通過它提供數據將會創建來自Cobertura或Jacoco的高代碼覆蓋率統計數據,但除了它沒有被炸燬的能力以外,沒有任何東西被測試 - 而且我甚至已經看到用大型try-catch塊考試。

是否有一個報表工具在那裏,這將測試試驗,這樣我就不需要經常檢查測試代碼?

我一時興奮地發現Jester,它通過更改測試中的代碼(例如if子句)並重新運行它來查看它是否打破測試來測試測試。

然而,這是不是你可以建立一個CI服務器上運行 - 它需要在命令行設置,沒有顯示出它的圖形用戶界面,只打印結果到GUI不能運行,也需要年齡跑步。

+2

你能提供一個具體的例子,你正在試圖抓住什麼?也就是說,測試的代碼覆蓋率很高,但測試質量很差的例子。 – EJK

+1

你不能添加一個檢查代碼審查覈對清單,檢查單元測試的斷言和實際測試的東西?我認爲自動化解決方案對於這個問題是複雜的,但是在這個過程中一個簡單的額外步驟可能足以學習和防止這種情況。 –

回答

10

PIT是標準的Java突變測試儀。從他們的網站:

突變檢測在概念上很簡單。

故障(或突變)會自動播種到您的代碼中,然後運行您的測試。如果你的測試失敗了,那麼突變就會被殺死,如果你的測試通過了,那麼突變就會存在。

...

傳統的測試覆蓋率(即行語句,分支等)僅代碼由你的測試執行措施。它不檢查你的測試是否真的能夠檢測到執行代碼中的錯誤。因此它只能識別那些絕對沒有經過測試的代碼。

問題的最極端的例子是沒有聲明的測試。幸運的是,在大多數代碼庫中這些並不常見。更常見的是僅由其套件進行部分測試的代碼。僅部分測試代碼的套件仍然可以執行其所有分支(示例)。

因爲它實際上是能夠檢測每個語句是否有意義的測試,突變檢測是針對所有其它類型的覆蓋測量的金標準。

您的測試質量可以從死亡率的百分比來衡量。

它有一個相應的Maven plugin,使它作爲CI構建的一部分進行集成變得簡單。我相信下一個版本也將包含與Maven站點報告的正確集成。

此外,創作者/維護者是相當活躍在這裏在計算器上,而且是良好響應標籤的問題。

+0

我顯然沒有去足夠的devcons,因爲我可以很久以前使用'PIT'。我成功地在一夜之間運行了報告--1小時30分鐘,所以絕對不會在每次源代碼簽入時觸發該報告。然後我檢查了一下,看看什麼級別的覆蓋率很好,並找到了(現在我正在使用'變異測試'作爲搜索項)[90%是可取的](http://dev.theladders.com/2013/02/變異測試與 - 坑一步超出正常代碼覆蓋/)。所以我們還有一段路要走這個項目..... – Adam

+0

是的,這是一個緩慢的過程。你可以做的是創建一個單獨的Maven配置文件,並應用一些過濾器,以便PIT只查看「危險區域」 - 您特別關心的包裝 - 並且在機器上更經常地運行,與夜間構建分開。 –

+0

我推薦它的方式主要是在代碼改變時在本地使用。如果代碼庫很大,請使用版本控制集成來分析修改後的文件,或使用過濾器來縮小範圍。 – henry

2

儘可能在實現該功能前編寫每個測試或修復測試應該處理的錯誤。功能或錯誤修復的順序變爲:

  1. 編寫測試。
  2. 運行它。如果這是一個很好的測試,那麼它就會失敗。如果確實 沒有失敗,請更改,替換或添加它。
  3. 當你有一個失敗的測試,實現它應該測試的功能 。現在它應該通過。
+0

實際上,這解決了另一個我經常研究的問題 - 在項目開始時,如果大多數課程都不存在需要測試,那麼如何編寫好的測試(您的觀點2)?我很樂意自己寫測試,開發人員需要完成。 – Adam

+0

@Adam即使在單獨編程時,我也經常編寫單元測試和Javadoc評論。編寫單元測試讓我提出問題,比如「如果該參數爲空將會發生什麼?」,這應該在評論中回答。 –

+0

問題來自op。 Patricia很好的回答。如果你真的想在單元測試中認真考慮,那麼可以嘗試在循環中越來越多地推動它,直到你開始寫測試!測試根據定義的規格和正確的排列方式證明了所有方法層都按預期工作。在編寫測試之前沒有編碼。 –

-1

聽起來你需要考慮一個覆蓋率工具,如Jacocogradle plugin提供覆蓋報告。我也使用了EclEmma Eclipse插件來獲得相同的結果,但在IDE中進行了很好的集成。

根據我的經驗,即使在沒有操作單元測試的情況下,Jacoco也提供了可接受的數字。因爲它似乎能夠準確地確定測試的代碼路徑。 No-op測試得到低或0%的覆蓋率分數,並且隨着測試變得更加完整,分數增加。

更新 爲了解決低調選民問題。也許一個更合適的工具來解決這個問題是PMD。可以在IDE或構建系統中使用。通過適當的配置和規則開發,可以用它來找到這些不完整的單元測試。過去我曾經使用它來查找缺少某些安全相關注釋的方法。

+0

不是downvoter,但它聽起來像OP中的測試不是沒有操作。他們確實執行了代碼,從而增加了代碼覆蓋率,但是,沒有斷言,因此無論代碼在做什麼都可能是錯誤的。 – dkatzel

+0

是的,好點。我想可以認爲這些斷言測試仍然有效,但不是100%有效。聽起來像我會鼓勵我的團隊在代碼審查期間解決的問題。 –

2

你有多種選擇:

  • 你也許可以使用像CheckStyle的一些代碼分析工具驗證每個測試有一個斷言。或者,也可以使用JUnit Rule來驗證這一點,但兩者都很容易被欺騙,只能在膚淺的層面上使用。

  • Jester做的突變測試再次是一個可行的技術解決方案,看起來@Tom_G有一個可能工作的工具。但這些工具(以我的經驗)極其緩慢,因爲的工作通過更改代碼,運行測試,一次又一次地分析結果。所以即使是很小的代碼庫也需要很多時間,我甚至不會考慮在真正的項目中使用它。代碼評論:這些不好的測試很容易被代碼評論所捕獲,而且它們應該是每一個開發過程的一部分,不管怎樣,

所有這些仍然只是在表面上劃痕。您應該思考的一個大問題是:爲什麼開發人員爲創建應用程序的某個部分而感到很想創建代碼?爲什麼他們不爲他們想要實現的內容編寫測試,因此幾乎不需要啓動應用程序的某些部分。獲得一些自動化單元測試培訓,尤其是TDD/BDD,即您首先編寫測試的過程。

以我的經驗很可能你會聽到像這樣的東西:我們不能測試這個,因爲......你需要找到真正的原因,爲什麼開發人員不能或不想要編寫這些測試,這可能是也可能不是他們陳述的原因。然後解決這些原因,這些測試的可恥行爲將自行消失。

+0

有效點但在我的情況下,對於敏捷/ TDD新手的開發人員的能力不能太樂觀,尤其是在您或我想要將恐龍項目複製到敏捷服裝的環境中。從邏輯上講,人們可能會認識到一個原則,並能夠談論它並承諾這樣做,但實際上做得更難。 – Adam

+0

你是正確的,突變測試是緩慢的 - 但爲了適應現有的項目,它可能很好,只是運行它作爲每晚的構建,而不是每次簽入。 –

+0

儘管我不能說突變檢測速度很快,但像PIT這樣的現代工具的字面速度要比像Jester這樣的早期工具要快。現在對於真正的代碼庫是完全實用的。例如,用PIT完成喬達時間的分析大約需要3分鐘(對於像Jester這樣的大約48小時)。即使使用非常大的代碼庫,分析也只能局​​限於當前感興趣的部分(例如版本控制報告的更改文件)。 – henry

0

你在找什麼確實是變異測試。

關於工具支持,您可能還想看看主要 變異框架(mutation-testing.org),這是非常有效和可配置的。主要的 使用一個編譯器集成的增變器,並且可以很好地控制 什麼應該被突變和測試。據我所知主要還沒有 產生的圖形報告,而是數據(csv)文件,你可以 處理或以任何你想要的方式可視化。

相關問題