Quali strumenti di analisi del codice utilizzi per i tuoi progetti Java? [chiuso]


117

Quali strumenti di analisi del codice utilizzi nei tuoi progetti Java?

Sono interessato a tutti i tipi

  • strumenti di analisi del codice statico (FindBugs, PMD e qualsiasi altro)
  • strumenti di copertura del codice (Cobertura, Emma e qualsiasi altro)
  • qualsiasi altro strumento basato sulla strumentazione
  • qualcos'altro, se mi manca qualcosa

Se applicabile, indica anche quali strumenti di compilazione usi e quanto bene questi strumenti si integrano sia con i tuoi IDE che con gli strumenti di compilazione.

Se uno strumento è disponibile solo in un modo specifico (come un plug-in IDE o, ad esempio, un plug-in dello strumento di compilazione), vale la pena notare anche queste informazioni.


Dai un'occhiata anche a UCDetector: ucdetector.org
Christophe Roussy,

Andando alla cassa Pitest per la copertura del test di mutazione.
mucaho

Risposte:


70

Per gli strumenti di analisi statica utilizzo spesso CPD, PMD , FindBugs e Checkstyle .

CPD è lo strumento PMD "Copy / Paste Detector". Stavo usando PMD per un po 'prima di notare il link "Finding Duplicated Code" sulla pagina web di PMD .

Vorrei sottolineare che questi strumenti a volte possono essere estesi oltre il loro insieme di regole "fuori dagli schemi". E non solo perché sono open source in modo da poterli riscrivere. Alcuni di questi strumenti vengono forniti con applicazioni o "ganci" che consentono di estenderli. Ad esempio, PMD viene fornito con lo strumento "designer" che consente di creare nuove regole. Inoltre, Checkstyle ha il controllo DescendantToken che ha proprietà che consentono una personalizzazione sostanziale.

Integro questi strumenti con una build basata su Ant . Puoi seguire il link per vedere la mia configurazione commentata.

Oltre alla semplice integrazione nella build, trovo utile configurare gli strumenti in modo che siano in qualche modo "integrati" in un paio di altri modi. Vale a dire, uniformità della generazione di report e della soppressione degli avvisi. Vorrei aggiungere questi aspetti a questa discussione (che probabilmente dovrebbe avere anche il tag "static-analysis"): come stanno configurando questi strumenti le persone per creare una soluzione "unificata"? (Ho posto questa domanda separatamente qui )

Innanzitutto, per i report di avviso, trasformo l'output in modo che ogni avviso abbia il formato semplice:

/absolute-path/filename:line-number:column-number: warning(tool-name): message

Questo è spesso chiamato "formato Emacs", ma anche se non stai usando Emacs, è un formato ragionevole per omogeneizzare i rapporti. Per esempio:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.

Le mie trasformazioni del formato di avviso vengono eseguite dal mio script Ant con le catene di filtri Ant .

La seconda "integrazione" che faccio è per la soppressione degli avvisi. Per impostazione predefinita, ogni strumento supporta commenti o un'annotazione (o entrambi) che è possibile inserire nel codice per silenziare un avviso che si desidera ignorare. Ma queste varie richieste di soppressione degli avvisi non hanno un aspetto coerente che sembra alquanto sciocco. Quando sopprimi un avviso, stai sopprimendo un avviso, quindi perché non scrivere sempre " SuppressWarning?"

Ad esempio, la configurazione predefinita di PMD sopprime la generazione di avvisi sulle righe di codice con la stringa " NOPMD" in un commento. Inoltre, PMD supporta l' @SuppressWarningsannotazione di Java . Configuro PMD per utilizzare commenti contenenti " SuppressWarning(PMD." invece di in NOPMDmodo che le soppressioni PMD si assomiglino. Inserisco la regola particolare che viene violata quando si utilizza la soppressione dello stile di commento:

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained

Solo la parte " SuppressWarnings(PMD." è significativa per un commento, ma è coerente con il supporto di PMD per l' @SuppressWarningannotazione che riconosce le singole violazioni delle regole per nome:

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended

Allo stesso modo, Checkstyle sopprime la generazione di avvisi tra coppie di commenti (non viene fornito alcun supporto per le annotazioni). Per impostazione predefinita, i commenti per disattivare e attivare Checkstyle contengono le stringhe CHECKSTYLE:OFFe CHECKSTYLE:ON, rispettivamente. La modifica di questa configurazione (con "SuppressionCommentFilter" di Checkstyle) per utilizzare le stringhe " BEGIN SuppressWarnings(CheckStyle." e " END SuppressWarnings(CheckStyle." rende i controlli più simili a PMD:

// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)

Con i commenti stile di controllo, la particolare violazione del controllo ( HiddenField) è significativa perché ogni controllo ha la sua " BEGIN/END" coppia di commenti.

FindBugs supporta anche la soppressione della generazione di avvisi con @SuppressWarningsun'annotazione, quindi non sono necessarie ulteriori configurazioni per ottenere un certo livello di uniformità con altri strumenti. Sfortunatamente, Findbugs deve supportare @SuppressWarningsun'annotazione personalizzata perché l' @SuppressWarningsannotazione Java incorporata ha una SOURCEpolitica di conservazione che non è abbastanza forte da mantenere l'annotazione nel file di classe in cui FindBugs ne ha bisogno. Qualifico pienamente la soppressione degli avvisi di FindBugs per evitare conflitti con l' @SuppressWarningsannotazione di Java :

@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")

Queste tecniche fanno sembrare le cose ragionevolmente coerenti tra gli strumenti. Notare che il fatto che ogni soppressione di avviso contenga la stringa " SuppressWarnings" semplifica l'esecuzione di una semplice ricerca per trovare tutte le istanze per tutti gli strumenti su un'intera base di codice.


wow, risposta abbastanza dettagliata. grazie per la condivisione. imiterò le tue pratiche nelle mie pratiche di codifica.
Vatsala

16

Uso una combinazione di Cobertura, Checkstyle, (Ecl) Emma e Findbugs.

EclEmma è un fantastico plugin Eclipse che mostra la copertura del codice colorando il sorgente java nell'editor ( screenshot ) - la copertura viene generata eseguendo un test JUnit. Questo è davvero utile quando stai cercando di capire quali linee sono coperte in una particolare classe, o se vuoi vedere solo quali linee sono coperte da un singolo test. Questo è molto più facile da usare e utile rispetto alla generazione di un rapporto e quindi a esaminare il rapporto per vedere quali classi hanno una copertura bassa.

Anche i plugin Checkstyle e Findbugs Eclipse sono utili, generano avvisi nell'editor durante la digitazione.

Maven2 ha plug-in di report che funzionano con gli strumenti di cui sopra per generare report in fase di compilazione. Usiamo questo per ottenere rapporti di progetto generali, che sono più utili quando desideri numeri aggregati. Questi sono generati dalle nostre build CI, che vengono eseguite utilizzando Continuum .


1
wow @ EclEmma! Sapevo di Emma, ​​ma integrato direttamente in Eclipse? Quelle regole.
Joshua McKinnon

3
Continuum fa schifo, Hudson governa.
Ken Liu

11

Usiamo e integriamo facilmente tutti i seguenti elementi in entrambe le build di Maven 2.x ed Eclipse / RAD 7:

  • Test - JUnit / TestNG
  • Analisi del codice - FindBugs, PMD
  • Copertura del codice - Clover

Inoltre, nelle nostre build Maven abbiamo:

  • JDepend
  • Controllo tag (TODO, FIXME, ecc.)

Inoltre, se stai usando Maven 2.x, CodeHaus ha una raccolta di utili plugin Maven nel loro progetto Mojo .

Nota: Clover ha un'integrazione immediata con il server Bamboo CI (poiché sono entrambi prodotti Atlassian). Esistono anche plug-in Bamboo per FindBugs, PMD e CheckStyle ma, come notato, anche il server Hudson CI gratuito ha quelli.


9

Uso l'analisi statica incorporata in IntelliJ IDEA. Perfetta integrazione.

Uso la copertura del codice incorporata in Intellij IDEA (basata su EMMA). Ancora una volta, perfetta integrazione.

Questa soluzione integrata è affidabile, potente e facile da usare rispetto al mettere insieme strumenti di vari fornitori.


4

Checkstyle è un altro che ho usato in un'azienda precedente ... è principalmente per il controllo dello stile, ma può anche fare alcune analisi statiche. Inoltre, Clover per la copertura del codice, anche se tieni presente che non è uno strumento gratuito.


3

Stiamo usando FindBugs e Checkstyle così come Clover per la copertura del codice.

Penso che sia importante avere un qualche tipo di analisi statica, a supporto del tuo sviluppo. Purtroppo non è ancora molto diffuso che questi strumenti siano importanti.


1

Usiamo FindBugs e JDepend integrati con Ant. Usiamo JUnit ma non stiamo usando alcuno strumento di copertura.

Non lo sto usando integrato in Rational Application Developer (l'IDE che sto usando per sviluppare applicazioni J2EE) perché mi piace come appare pulito quando esegui javac nella console di Windows. : P


1

Ho avuto fortuna con Cobertura. È uno strumento di copertura del codice che può essere eseguito tramite il tuo script ant come parte della tua normale build e può essere integrato in Hudson.


1

Il nostro team utilizza PMD e Cobertura, in realtà i nostri progetti sono progetti esperti ed è molto semplice includere plug-in per l'analisi del codice. La vera domanda sarebbe per un progetto specifico quale analisi è necessario utilizzare, la mia opinione è che non è possibile utilizzare gli stessi plugin per ogni progetto.


1

nel nostro progetto usiamo Sonar davanti a checkstyle, pmd .... insieme a CI (Bamboo, Hudson) otteniamo anche una bella storia della nostra qualità sorgente e di quale regia andiamo. Mi piace Sonar, perché sei uno strumento centrale nello Stack CI che lo fa per te e puoi personalizzare facilmente le regole per ogni progetto.



0

Sto cercando molte risposte per apprendere nuovi strumenti e consolidare questa conoscenza in una domanda / thread, quindi dubito che ci sarà una risposta vera a questa domanda.

La mia risposta alla mia domanda è che usiamo:

  • Findbugs per cercare errori comuni cattivi / codifica - eseguito da Maven e si integra facilmente anche in Eclipse
  • Cobertura per i nostri rapporti sulla copertura - eseguito da Maven

Hudson ha anche un plug-in per lo scanner delle attività che mostrerà un conteggio dei tuoi TODO e FIXME, oltre a mostrare dove si trovano nei file sorgente.

Tutti sono integrati con Maven 1.x nel nostro caso e collegati a Hudson, che esegue i nostri build sul check-in e altre cose extra ogni sera e ogni settimana. Le tendenze di Hudson rappresentano graficamente i nostri test JUnit, la copertura, i bug di ricerca e le attività aperte. C'è anche un plugin Hudson che riporta e mostra graficamente i nostri avvisi di compilazione. Abbiamo anche diversi test delle prestazioni con i propri grafici delle prestazioni e dell'utilizzo della memoria nel tempo utilizzando anche il plug-in dei grafici di Hudson.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.