2013-03-06 85 views
5

是否有任何工具或策略用於在(Java,log4j)上生成「日誌範圍」報告?像代碼覆蓋率一樣,但要確保沒有大的方法,類或包不記錄任何內容。Java日誌覆蓋工具

在編寫Web服務時,我的團隊不寫很多日誌語句。在運行生產代碼時調試實時問題時,我們總是希望得到。不可避免地,我們試圖在附加的調試器或添加額外的日誌語句的情況下重現我們的測試環境中的錯誤,這取決於所涉及的結構和相互操作可能非常困難。

有沒有人使用它作爲代碼質量指標?

+1

這聽起來像是你的測試的一個症狀,而不是測試錯誤條件。生產不是你應該看你的課程破碎的第一個地方。 – djechlin 2013-03-06 04:35:02

+1

@djechlin雖然我理論上同意,但在實踐中沒有人寫無錯代碼。 – 2013-03-06 06:39:05

+0

代碼完整:「不成熟的測試組織往往對每個髒測試都有大約5次乾淨測試,成熟的測試組織往往對每次乾淨測試都有5次髒測試,這個比例不會因爲減少乾淨測試而被逆轉,而是通過創建25多次髒測試。「我認爲這是一個很好的問題,並贊成這樣做,但這絕對引起了我的注意,因爲缺乏骯髒的測試。 – djechlin 2013-03-06 16:02:53

回答

1

代碼覆蓋率需要特殊的工具,因爲您正在試圖找出是否有任何測試執行了一段生產代碼。你所要求的更加模糊一點,可能要簡單得多(「是否爲這個大班級做了任何記錄?」),或者更難以達到不可能的程度(「我們記錄了在生產中將要破壞的方法?「)。

對於第一個問題,你可以很快拿出一個shell腳本來完成這項工作。例如,這裏是Perl中的一個框架。在這裏,我假設我們正在使用SLF4J,並且看到「LoggerFactory」的導入足以證明有一個記錄器。

while ($filename = shift) { 
    open my $in, "<$filename"; 
    my $loc = 0; 
    my $log = "NO LOGGER"; 
    while (<$in>) { 
     $loc++; 
     if (m/import org.slf4j.LoggerFactory/) { 
      $log = "has logger"; 
     } 
    } 
    print "$filename : $loc LOC $log\n"; 
    $total{$log} += $loc; 
} 
print "\n\nTOTAL LOGGED: $total{'has logger'}\nTOTAL UNLOGGED: $total{'NO LOGGER'}\n"; 

,我可以從我的shell中運行此選項可通過在一個小項目中的所有Java文件與

$ find . -name \*.java -exec perl haslog.pm {} \+ 

運行這僅適用於小型項目的作品,這是相當脆弱,但它止跌做一個更加健壯的版本並不是一件容易的事情。

0

很多日誌可能是噪音,以我的經驗,我總是發現通過日誌痛苦追蹤。話雖如此,如果日誌管理良好,您可以獲得良好的診斷/報告。代碼未被正確測試的原因之一是因爲生產代碼中有大量日誌。開發人員傾向於在開發時檢查代碼作品時添加一條日誌語句,因此它鼓勵不要使用正確的斷言編寫測試。你需要的是很多經過良好測試組合在一起的小類。斷言應該完全告訴你爲什麼測試失敗。

讓我們說在你的代碼路徑中,你期望發生什麼是它的主要責任(例如創建一個數據庫條目來註冊用戶/或某人登錄),當我說它的主要責任時,我不是在談論一方效果發生在你的代碼路徑中。如果在主代碼路徑中有錯誤情況,則應該將堆棧中的異常記錄下來並將其轉換爲用戶友好的消息。 RuntimeExceptions在這裏是一個很好的例子,因爲你不想捕捉這些異常,直到它一直到視圖層。副作用也可以被記錄,因爲它們就像信息/警告。