Göm dina inspektionsfel

Till byggmiljön Jenkins finns flertalet kraftfulla plugins för att underlätta kodunderhåll och kvalitetskontroll, bland annat PMD, Findbugs, DRY och Checkstyle som tillsammans blir en bra kombination för automatisk genomlysning av kodbasen. En hel del av varningarna som kommer att uppstå vid första bygget är Controversial Rules. Som benämningen tydligt uttrycker så är de inte självklara och det uppstår ofta en diskussion inom teamet ifall de ska vara kvar eller ej. De går i slutänden att konfigurera bort och det brukar ta några dagar eller någon vecka innan mängden varningar stabiliseras.

Ibland skapas dock varningar som är felaktiga (false positives). Men hur tas en varning bort som är felaktig? Vanliga @SuppressWarnings går att använda om man medvetet vill dölja en typ av fel för PMD, men annoteringen sker på metodnivå och påverkar hela metoden. Specifika PMD-varningar går också att eliminera med kommentaren // NOPMD som då påverkar enbart den givna förekomsten.

För en hel metod eller på klassnivå kan en varning filtreras bort med @SuppressWarnings("PMD.[FILTERNAMN]"). Filternamnet finns i rapporten för varje klass. Gå in på statussidan för bygget i Jenkins och sedan vidare via grafen till statusrapporterna där varje klass med varningar listas, klicka på klasslänken i rapporten och lägg muspekaren över den lilla varningstriangeln. Textrutan som nu visas innehåller en kolumn som kallas Class vilket är samma som filternamnet.

För att dölja den här varningen, lägg till:

@SuppressWarnings("PMD.ConfusingTernary") 
private void methodWithWarning() {
...

För att enbart ta bort den här specifika förekomsten (på radnivå) och låta PMD härja fritt i resten av metoden, lägg till // NOPMD i slutet av raden. Att bara lägga till NOPMD kan vara kryptiskt för andra utvecklare och en enkel förklaring efter flaggningen underlättar och visar att varningen är medvetet eliminerad. Exempel:

for (final String part : parts.keySet()) { 
// NOPMD Key is needed in this loop. 
...

Men, det biter inte på Findbugs.

Standardversionen av @SuppressWarnings ger inget stöd för att ta bort Findbugs-varningar, det finns inte heller någon kommentarsfunktion som för PMD för att eliminera varningar. Lyckligtvis är det mer sällan som Findbugs ska filtreras istället för att faktiskt åtgärdas, men det förekommer dock att det kan uppstå falska varningar som kan behöva plockas bort. För att kunna göra det behövs en extern JAR för Findbugs-annoteringar. Om projektet är Maven-baserat, lägg till följande i dependency-kedjan:

<dependency> 
   <groupId>com.google.code.findbugs</groupId> 
   <artifactId>annotations</artifactId> 
   <version>2.0.3</version> 
   <scope>compile</scope> 
</dependency>

Nu finns möjligheten att lägga till en annotering som döljer Findbugs-varningar. Annoteringen vill ha textsträngen justification som också ger en notering till andra utvecklare – och dig själv – att det är ett medvetet val och inte en slentrianmässig bortfiltrering. För att ta bort Findbugs-varningar kan exempelvis @SuppressFBWarnings användas:

@SuppressFBWarnings(
    value = "WMI_WRONG_MAP_ITERATOR", 
    justification = "The key is needed in the loop") 
...

Lycka till med saneringen!