Testen der Code-Qualität code-quality-testing

Hier finden Sie Informationen dazu, wie das Testen der Code-Qualität von Pipelines funktioniert und wie sich damit die Qualität Ihrer Bereitstellungen verbessern lässt.

Einführung introduction

Beim Testen der Code-Qualität wird Ihr Programm-Code anhand eines Satzes von Qualitätsregeln bewertet. Dabei handelt es sich um das Kernziel einer reinen Code-Qualitäts-Pipeline, die unmittelbar nach dem Erstellungsschritt in allen produktionsfremden und Produktions-Pipelines ausgeführt wird.

Weitere Informationen zu den verschiedenen Pipelines finden Sie unter Konfigurieren der CI/CD-Pipeline.

Code-Qualitätsregeln understanding-code-quality-rules

Beim Testen der Code-Qualität wird der Quell-Code gescannt, um sicherzustellen, dass er bestimmte Qualitätskriterien erfüllt. Dieser Schritt wird durch eine Kombination aus SonarQube und der Prüfung auf Inhaltspaketebene mit OakPAL implementiert. Es gibt mehr als 100 Regeln, wobei generische Java-Regeln und AEM-spezifische Regeln kombiniert sind. Einige der AEM-spezifischen Regeln basieren auf den Best Practices von AEM Engineering und werden als benutzerspezifische Code-Qualitätsregeln bezeichnet.

Sie können die aktuelle vollständige Liste von Regeln über diesen Link herunterladen.

IMPORTANT
Ab Donnerstag, 13. Februar 2025 (Cloud Manager 2025.2.0), verwendet Cloud Manager Code Quality eine aktualisierte Version von SonarQube 9.9 und eine aktualisierte Liste von Regeln, die Sie hier herunterladen können.

Dreistufige Bewertungen three-tiered-gate

Probleme, die durch das Testen der Code-Qualität erkannt werden, werden einer von drei Kategorien zugewiesen.

  • Kritisch: Probleme, die zu einem sofortigen Pipeline-Fehler führen.

  • Wichtig: Probleme, durch die die Pipeline angehalten wird. Bereitstellungs-Manager, Projekt-Manager oder Business Lead können die Probleme außer Kraft setzen, sodass die Pipeline fortgesetzt werden kann. Alternativ können sie die Probleme akzeptieren, wodurch die Pipeline mit einem Fehler angehalten wird.

  • Info: Probleme, die ausschließlich zu Informationszwecken angegeben werden und keine Auswirkungen auf die Pipeline-Ausführung haben

NOTE
In einer Pipeline, in der ausschließlich die Code-Qualität getestet wird, können Fehler der Kategorie „Wichtig“ des Code-Qualitätstests nicht überschrieben werden, da dieser Test der letzte Schritt in der Pipeline ist.

Bewertungen ratings

Die Ergebnisse dieses Schritts werden als Bewertungen bereitgestellt.

In der folgenden Tabelle sind die Bewertungen und Fehlerschwellenwerte für die einzelnen Kategorien „Kritisch“, „Wichtig“ und „Information“ zusammengefasst.

Name
Definition
Kategorie
Fehlerschwellenwert
Sicherheitsbewertung
A = Keine Schwachstellen
B = mindestens 1 kleinere Schwachstelle
C = mindestens 1 größere Schwachstelle
D = mindestens 1 kritische Schwachstelle
E = mindestens 1 Schwachstelle der Kategorie „Blocker“
Kritisch
< B
Zuverlässigkeitsbewertung
A = Keine Fehler
B = mindestens 1 kleinerer Fehler
C = mindestens 1 größerer Fehler
D = mindestens 1 kritischer Fehler
E = mindestens 1 Fehler der Kategorie „Blocker“
Kritisch
< D
Wartbarkeitsbewertung

Definiert durch die ausstehenden Kosten für die Behebung von Code-Fehlern als Prozentsatz der Zeit, die bereits in das Programm investiert wurde

  • A = <=5 %
  • B = 6-10 %
  • C = 11-20 %
  • D = 21-50 %
  • E = >50 %
Wichtig
< A
Abdeckung

Definiert durch eine Mischung aus Zeilenabdeckung der Einheitstests und Bedingungsabdeckung nach der Formel:
Coverage = (CT + CF + LC)/(2*B + EL)

  • CT = Bedingungen wurden mindestens einmal während der Ausführung der Einheitentests zu true ausgewertet
  • CF = Bedingungen wurden mindestens einmal während der Ausführung der Einheitentests zu false ausgewertet
  • LC = abgedeckte Zeilen = lines_to_cover - uncovered_lines
  • B = Gesamtzahl der Bedingungen
  • EL = Gesamtzahl der ausführbaren Zeilen (lines_to_cover)
Wichtig
< 50 %
Übersprungene Einheitentests
Anzahl der übersprungenen Einheitentests
Info
> 1
Offene Probleme
Allgemeine Problemtypen – Schwachstellen (Vulnerability), Fehler (Bug) und Code-Smells (Code Smell)
Info
> 0
Duplizierte Zeilen

Definiert als die Anzahl der Zeilen, die in doppelten Blöcken enthalten sind. Ein Codeblock wird unter den folgenden Bedingungen als dupliziert betrachtet
Nicht-Java-Projekte:

  • Es sollten mindestens 100 aufeinanderfolgende und duplizierte Token vorhanden sein.
  • Diese Token sollten sich mindestens wie folgt verteilen:
  • 30 Codezeilen für COBOL
  • 20 Codezeilen für ABAP
  • 10 Codezeilen für andere Sprachen

Java-Projekte:

  • Unabhängig von der Anzahl der Token und Zeilen sollte es mindestens 10 aufeinanderfolgende und duplizierte Anweisungen geben.

Unterschiede bei Einzügen sowie Zeichenfolgenliteralen werden beim Erkennen von Duplikaten ignoriert.

Info
> 1 %
Kompatibilität mit Cloud Service
Anzahl der festgestellten Kompatibilitätsprobleme mit Cloud-Service
Info
> 0
NOTE
Genauere Definitionen finden Sie unter Metrikdefinitionen von SonarQube.
NOTE
Weitere Informationen zu den benutzerdefinierten Code-Qualitätsregeln, die von Cloud Manager ausgeführt werden, finden Sie unter Benutzerdefinierte Code-Qualitätsregeln.

Umgang mit falsch positiven Treffern dealing-with-false-positives

Das Verfahren zur Qualitätsprüfung ist nicht fehlerfrei und kennzeichnet manchmal Probleme, die keine tatsächlichen Fehler sind. Dieser Status wird als falsch positiv bezeichnet.

In diesen Fällen kann der Quell-Code mit der standardmäßigen @SuppressWarnings-Java-Anmerkung kommentiert werden. Dabei wird die Regel-ID als Anmerkungsattribut angegeben. Ein häufiges Problem ist beispielsweise, dass die SonarQube-Regel zur Erkennung hartcodierter Kennwörter zu restriktiv in Bezug auf die Identifizierung eines hartcodierten Kennworts sein kann.

Der folgende Code ist in einem AEM-Projekt, das eine Verbindung zu einem externen Service herstellen soll, relativ häufig.

@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

SonarQube weist dann auf eine „Blocker“-Schwachstelle hin. Nach Prüfung des Codes erkennen Sie jedoch, dass es sich bei diesem Problem nicht um eine Schwachstelle handelt, und kommentieren dies mit der entsprechenden Regel-ID.

@SuppressWarnings("squid:S2068")
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

Wenn der Code wie folgt lautete:

@Property(label = "Service Password", value = "mysecretpassword")
private static final String PROP_SERVICE_PASSWORD = "password";

Dann bestünde die richtige Lösung darin, das hartcodierte Kennwort zu entfernen.

NOTE
Obwohl es sich als Best Practice empfiehlt, die @SuppressWarnings Anmerkung spezifisch zu gestalten, können Sie auch Anmerkungen auf Klassenebene hinzufügen.
NOTE
Es gibt zwar keinen expliziten Schritt für Sicherheitstests, aber beim Schritt der Code-Qualität werden sicherheitsbezogene Regeln für die Code-Qualität evaluiert. Weitere Informationen zur Sicherheit in Cloud Service finden Sie unter Sicherheitsübersicht für AEM as a Cloud Service.

Optimierung der Inhaltspaketüberprüfung content-package-scanning-optimization

Im Rahmen des Qualitätsanalyseprozesses führt Cloud Manager eine Analyse der vom Maven-Build erzeugten Inhaltspakete durch. Cloud Manager bietet Optimierungen zur Beschleunigung dieses Prozesses an, die wirksam sind, wenn bestimmte Verpackungseinschränkungen beachtet werden. Die wichtigsten Optimierungsziele sind Projekte, die ein einziges „all“-Paket produzieren. Dieses Paket enthält mehrere Inhaltspakete aus dem Build, die als übersprungen markiert sind. Wenn Cloud Manager dieses Szenario erkennt, wird nicht das gesamte Paket entpackt, sondern die einzelnen Inhaltspakete werden direkt gescannt und auf der Grundlage von Abhängigkeiten sortiert. Betrachten Sie zum Beispiel die folgende Build-Ausgabe.

  • all/myco-all-1.0.0-SNAPSHOT.zip (Inhaltspaket)
  • ui.apps/myco-ui.apps-1.0.0-SNAPSHOT.zip (übersprungenes Inhaltspaket)
  • ui.content/myco-ui.content-1.0.0-SNAPSHOT.zip (übersprungenes Inhaltspaket)

Wenn die beiden übersprungenen Inhaltspakete die einzigen Elemente innerhalb von myco-all-1.0.0-SNAPSHOT.zip sind, werden die beiden eingebetteten Pakete anstelle des gesamten Inhaltspakets („all“) gescannt.

Bei Projekten, die Dutzende von eingebetteten Paketen produzieren, spart diese Optimierung nachweislich mehr als 10 Minuten pro Pipeline-Ausführung.

Ein Sonderfall kann eintreten, wenn das Inhaltspaket „all“ eine Kombination aus übersprungenen Inhaltspaketen und OSGi-Bundles enthält. Wenn myco-all-1.0.0-SNAPSHOT.zip beispielsweise die beiden genannten eingebetteten Pakete und OSGi-Bundles enthalten, wird ein neues, minimales Inhaltspaket nur mit den OSGi-Bundles erstellt. Dieses Paket hat immer die Bezeichnung cloudmanager-synthetic-jar-package und die darin enthaltenen Bundles werden in /apps/cloudmanager-synthetic-installer/install abgelegt.

NOTE
  • Diese Optimierung hat keine Auswirkungen auf die Pakete, die in AEM bereitgestellt werden.
  • Der Abgleich zwischen eingebetteten Inhaltspaketen und übersprungenen Inhaltspaketen basiert auf Dateinamen. Diese Optimierung ist nicht möglich, wenn mehrere übersprungene Pakete denselben Dateinamen haben oder sich der Dateiname während der Einbettung ändert.
recommendation-more-help
experience-manager-cloud-service-help-main-toc