Code Reviews mit Hilfe von jQAssistant

Nachdem in den letzten beiden Artikeln Aspekte der statischen und manuellen Analyse behandelt wurden, wird in diesem Blog-Beitrag ein Tool vorgestellt, welches sowohl für statische Analysen als auch für explizite Fragestellungen einer manuellen Analyse,  wie einer Architekturvalidierung, eingesetzt werden kann.

Es gibt viele nützliche Tools, die für ein Code Review benutzt werden können. Eines davon ist jQAssistant, welches unter der GNU General Public License in der Version 3 veröffentlicht wurde.  jQAssistant übernimmt die Struktur des kompilierten Codes in die Graphdatenbank Neo4j. Bei Neo4j handelt es sich um eine Datenbank-Engine, die Daten in Graphen visualisiert und abspeichert. Als Knoten in der Visualisierung werden zum Beispiel Klassen oder Interfaces angelegt. Die Kanten stellen die Beziehungen zwischen den Knoten dar (implements, contains, …).  Die in Neo4j verwendete Abfragesprache ist Cypher, welches eine einfache Formulierung von komplizierten Datenbankabfragen ermöglicht. Cypher beruht auf dem Property-Graph-Modell. In dem Property-Graph-Modell werden die Graphen, welche normalerweise als eine Menge von Knoten und Kanten definiert sind, um Etiketten und Eigenschaften ergänzt. Jeder Knoten kann eine oder mehrere Etiketten haben und jede Kante besitzt genau ein Etikett.  Etiketten beschreiben den Typ eines Knotens oder einer Kante. Sowohl Knoten als auch Kanten können keine oder mehrere Eigenschaften haben.

Zu Beginn  der Analyse scannt der jQAssistant-Server die auszuwertenden Artefakte. Regeln zur Analyse können als XML-Dokument oder AsciiDoc-Datei in dem Ordner „jqassistant/rules“ abgelegt werden. Diese sind in „Concepts“ und „Constraints“ aufgeteilt. Mithilfe von Concepts soll der Datensatz mit hilfreichen Informationen erweitert werden. In Constraints werden die Regeln umgesetzt. Eine definierte Regel gilt als nicht erfüllt, sobald ein gegenteiliges Ergebnis bei der Analyse gefunden werden kann. Über bereitgestellte Plugins  kann in jQAssistant bestimmt werden, welche Abfragen unterstützt werden und wie die Visualisierung der statischen Analyse aussehen soll. Zudem können beliebige weitere Möglichkeiten der Anpassung selbst entwickelt werden, um die Prüfung des Quellcodes auf die eigenen Bedürfnisse anzupassen.

Über die Analyse kann eine technische Schuld ermittelt werden, indem gefundene Verstöße in unterschiedliche Schweregrade eingeteilt werden. Die Schweregrade werden dabei unterteilt in:

  • Blocker Issues
  • Critical Issues
  • Major Issues
  • Minor Issues
  • Info Issues

Das festgesetzte Regelwerk kann beispielsweise auch automatisiert zur Architekturvalidierung in den Build-Prozess eingebaut werden. Die Darstellung erfolgt über einen Browser, in dem Abfragen gestartet werden können sowie die Ergebnisse grafisch und tabellarisch dargestellt werden.

Beispiel:

Es sind einfache Regeln möglich, wie die Abfrage, ob Klassendateien mit einem Großbuchstaben anfragen:

Es können aber auch  komplexere Architekturregeln umgesetzt werden, die zum Beispiel alle Klassen ausgeben, welche auf andere Module über einen nicht erlaubten Weg zugreifen:

Ein großer Vorteil von jQAssistant ist die Erweiterbarkeit und Anpassungsmöglichkeit durch weitere Plugins und eigene Regelwerke. Die Analyse folgt einem selbst definierten Regelwerk, welches exakt auf die vorliegende Problemstellung angepasst werden kann. Somit können Entwickler schnell erkennen, ob es Abweichungen gegenüber den selbst gesetzten Regularien gibt und nötige Anpassungen vornehmen.

Fazit

Bei einem Code Review können durch die Visualisierung der Daten als Graphen sehr gut Strukturen erkannt und übersichtlich wiedergegeben werden. Durch die Möglichkeit seine Anfragen auf die jeweiligen Fragestellungen anzupassen, können viele verschiedene Erkenntnisse gewonnen und generiert werden. So kann beispielsweise der Aufbau einer Anwendung durch die Verbindungen von Dependencies zwischen den Modulen analysiert werden.

Diesen Beitrag teilen.

Benny Schwarting
IT-Consultant
Als IT-Consultant kümmert sich Benny maßgeblich um die Projektkoordination und das Requirements Engineering. Dabei hat er stets für unsere Kunden und deren Anforderungen ein offenes Ohr und steht ihn mit guten Ideen zur optimalen Lösungsfindung zur Seite.

Florian Deeken
Softwareentwickler
Egal ob als Hobby oder professionell, durch seine Erfahrungen mit Open-Source- und Linux-Technologien ist Florian jeder Aufgabe gewachsen.