Sonar is een QA applicatie die een (groot) aantal bestaande kwaliteitsmetingen combineert en inzichtelijk maakt. Sonar analiseert de “7 onderdelen van code quality”: commentaar, mogelijke bugs, complexiteit, unit tests en coverage, broncode, code style en duplicatie en design. Sonar is een commandline applicatie die je kunt installeren en starten op je continuous integration (CI) omgeving.
Daarnaast run je het volgende Maven2 commando om het project te laten analiseren:
mvn clean install sonar:sonar
De Maven Sonar plugin verzamelt alle statistieken. De Sonar command line applicatie verzamelt deze, slaat ze op en toont het overzicht via een webinterface (http://localhost:9000). Tijdens de analyse wordt een groot aantal waarschijnlijk al bekende code analyse tools gebruikt:
- Cobertura (meet unit test coverage)
- JavaNCSS (telt aantal regels code, packages, classes)
- PMD (analiseert complexiteit, code duplicatie)
- Checkstyle (controleert coding guidelines)
- Surefire (runt de unit tests)
- Changelog (meet projectactiviteit)
- FindBugs (detecteert mogelijke bugs)
Het resultaat is een overzicht van deze statistieken via de Sonar webinterface; een dashboard overzicht, statistieken per component en package en de ontwikkeling van deze statistieken over tijd. Zie bijvoorbeeld het Sonar rapport voor Apache Tomcat.
Het dashboard geeft een zeer uitgebreid overzicht van alle metingen die door eerder genoemde code analyse tools verzameld zijn:
- Aantal regels code, aantal statements, aantal classes, packages en methodes
- Aantal regels commentaar, percentage gedocumenteerde API, @todo en @deprecated tags
- Percentage code duplicatie, uitgedrukt in aantal regels en code blokken
- Gemiddelde complexiteit van de code per methode en class
- Aantal overtredingen van stijlregels (PMD, Checkstyle, FindBugs)
Voor alle statistieken geldt dat vrijwel overal de trend wordt aangegeven (bijvoorbeeld dat het aantal regels code is gegroeid, maar de code coverage is afgenomen – een indicatie dat er meer unit tests geschreven moeten gaan worden). De overige schermen tonen grafieken waarin twee of meer metingen tegen elkaar uitgezet worden, zodat de invloed en samenhang beter tot uiting komt. Daarnaast is het mogelijk om extra Sonar plugins te installeren.
Veel open source projecten worden al door Sonar gemonitord. Van alle projecten kan je het dashboard inzien inclusief alle bovenstaande statistieken en uitleg van de terminologie. Met Sonar geinstalleerd kan niemand meer beweren dat er geen tijd is voor code reviews of kwaliteitsbewaking. Let er wel op dat deze statistieken slechts tot doel hebben om de code eventueel aan te passen en te verbeteren; het verbeteren van de Sonar statistieken moet geen doel op zich worden, zeker niet als de kwaliteit van de code daar (indirect) onder lijdt.
Sonar Plugins (meer)
De Software Improvement Group Maintainability Model-plugin geeft een samenvatting van vier meetwaarden: inzichtelijkheid (analysability), aanpasbaarheid (changeability), stabiliteit (stability) en testbaarheid (testability) op basis van
- aantal regels code (totaal en gemiddeld per methode)
- percentage duplicate code
- unit test coverage
- complexiteit van methodes
Een gemiddelde van deze vier “-abilities” levert een Maintainability score op, van -- (slecht) tot ++ (zeer goed).
Een andere eenheid om de staat van de applicatie in uit te drukken is de hoeveelheid Technical Debt. Technical Debt is een uitdrukking op basis van code duplicatie, overtredingen van stijlregels, complexiteit, test coverage, documentatie en design (coupling):
Ward Cunningham first drew the comparison between technical complexity and debt in a 1992 experience report: Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite… The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.
De Sonar Technical Debt plugin drukt Techical Debt uit in een percentage (schuld ten opzichte van maximaal mogelijke schuld), tijd en geld (hoeveel zou het kosten om deze schuld af te lossen). Het spreekt voor zich dat de laatste twee gebaseerd zijn op schattingen hoe lang iemand bezig is met het verbeteren van de code en voor welke prijs per uur. Desondanks geeft het inzicht in de staat van een project; 45% code coverage zegt (het management) veel minder dan €50.000 technische schuld. De berekening die de plugin uitvoert is vrij uitgebreid.