Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automatisierte Architekturtests und statische Codeanalyse mit ArchUnit

Automatisierte Architekturtests und statische Codeanalyse mit ArchUnit

Java User Group Frankfurt JUGF, 27. Juli 2022

Automatisierte Architekturtests und statische Codeanalyse mit ArchUnit

Im Architektur-Entwurf treffen wir viele Architekturentscheidungen, im besten Fall explizit, dokumentiert und verstanden. Dieser Prozess ist aufwändig und mühsam, mit der Folge, dass viele Entscheidungen meist nur implizit getroffen werden und dann in Vergessenheit geraten.

Eine automatisierte Überprüfung solcher Architekturentscheidungen hilft hier weiter:
Manche Entscheidungen wie Namenskonventionen lassen sich schon lange über altbekannte Tools wie Checkstyle leicht abtesten. Komplexere Entscheidungen aber lassen sich nicht immer einfach checken - oder sie erfordern ein komplexes Metamodell, das aufwändig zu erstellen und zu pflegen ist. Hier kommt ArchUnit ins Spiel. In unserem Talk stellen wir anhand konkreter Fragestellungen vor, wie man mit ArchUnit automatisiert Architekturentscheidungen in einen Standard-Testzyklus einbinden kann.
Dazu bringt ArchUnit von Haus aus eine ganze Reihe von Standard-Hilfsmitteln mit. Besser noch: Eigene Architekturregeln lassen sich leicht in Form von Tests definieren und so im automatisiertem Build überprüfen. Beispiele:
- Sind Abhängigkeiten zwischen Komponenten richtig definiert?
- Sind Strukturen innerhalb einer Komponente richtig modelliert, z.B. als Onion-Architektur?

Dieselbe API von ArchUnit kann man aber auch für statische Codeanalyse einsetzen, dessen Output nicht in einem Test, sondern als Input in weitere Tools eingeht. Damit lassen sich einfach kleine Helferlein schreiben, um gezielt Handlungsbedarfe identifizieren und analysieren zu können.
Beispiel: In einem System werden Daten versioniert zwischen Services ausgetauscht. Finde alle Services, die direkt oder transitiv von inkompatiblen Änderungen an diesem Datenmodell betroffen und daher anzupassen sind.
ArchUnit lässt sich demnach für kleine, mittlere und komplexe Fragestellungen einsetzen. Das skaliert gut und ermöglicht eine leichtgewichtige und automatisierte Absicherung von Architekturentscheidungen.

Martin Lehmann

July 27, 2022
Tweet

More Decks by Martin Lehmann

Other Decks in Technology

Transcript

  1. Copyright © Accso – Accelerated Solutions GmbH 1 v.3 v.3.18

    Automatisierte Architekturtests und statische Codeanalyse mit MARTIN LEHMANN, DR. KRISTINE SCHAAL JAVA USER GROUP FRANKFURT, 27. JULI 2022
  2. Martin Lehmann Accso - Accelerated Solutions GmbH Cheftechnologe Martin Lehmann

    ist Diplom-Informatiker und arbeitet als Cheftechnologe bei der Accso - Accelerated Solutions GmbH. Seit Ende der 90er-Jahre arbeitet er als Softwarearchitekt in Individualentwicklungsprojekten für Kunden verschiedener Branchen. Er interessiert sich besonders für Software-Architektur und Entwicklungsmethodik, gerne auf der Java-Plattform. [email protected] @mrtnlhmnn xing.to/mle Kristine Schaal Accso - Accelerated Solutions GmbH Softwarearchitektin Dr. Kristine Schaal ist als Softwarearchitektin bei der Accso - Accelerated Solutions GmbH tätig. Sie arbeitet seit mehr als 20 Jahren in der Softwareentwicklung und ist in Projekten der Individualentwicklung für Kunden verschiedener Branchen unterwegs, technisch überwiegend im Java-Umfeld. [email protected] @krschaal www.xing.com/profile/Kristine_Schaal
  3. V0.23.1 vom 27. Februar 2022 V1.0.0.-rc1 vom 13. Juli 2022

    Open-Source https://github.com/TNG/ArchUnit Apache License 2.0 für Java und andere JVM-Sprachen V0.10.1 vom 29. April 2022 https://github.com/TNG/ArchUnitNET für DOT.NET und C# https://www.archunit.org
  4. Copyright © Accso – Accelerated Solutions GmbH 5 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Integration mit anderen Tools Fazit
  5. Copyright © Accso – Accelerated Solutions GmbH 6 Warum automatisierte

    Architektur-Tests mit ArchUnit? Schnelles Feedback für alle Entwickler:innen automatisiert und/statt (nur) Code-Reviews läuft einfach in jedem Build mit Dokumentiert Architekturentscheidungen, macht sie explizit Programmieren statt deklarieren – Man arbeitet im gleichen Code, in der gleichen Programmiersprache (Turing-vollständig) Refactoring schließt auch die Tests ein Ausdrucksstarke und typsichere API Schnell erlernbar und einführbar, gut lesbar und wartbar damit mächtiger als Checkstyle, PMD, Findbugs, JDepend, Sonar*, Structure101, jqAssistant
  6. Copyright © Accso – Accelerated Solutions GmbH 7 Wie schreibt

    man ArchUnit-Tests? Regeln schreiben Regeln prüfen einen Aspekt der Architektur. Regeln definiert man über ArchRule, bzw. spezifische Subklassen. API vereinfacht das Erstellen der Regeln. Tests ausführen ArchUnit-Tests können als JUnit4- oder JUnit5- Tests geschrieben und ausgeführt werden. Sie können im normalen Build-Zyklus mit-laufen. Wenn die Architektur- prüfung fehlschlägt, wird eine Exception geworfen → Der Test schlägt fehl. Was kann man prüfen? Package Dependency Class Dependency Class and Package Containment Inheritance Annotation Layer Cycle …
  7. Copyright © Accso – Accelerated Solutions GmbH 8 Fachliches Bücherei-Beispiel

    „library“ common util … von allen … von allen data management borrow book-admin customers statistics search
  8. Copyright © Accso – Accelerated Solutions GmbH 9 LiveCoding Beispiel

    1 Check von Namenskonventionen Beispiel 2 Check von Abhängigkeiten Beispiel 3 Sind alle Daos auch JpaRepositories? Sind nur Daos JpaRepositories? https://github.com/accso/static-code-analysis-archunit
  9. Copyright © Accso – Accelerated Solutions GmbH 10 LiveCoding Beispiel

    4 Nutzung von ArchUnit auf der „Braunen Wiese“ Ignorieren von Architekturfehlern Einfrieren von Test-Ergebnissen https://github.com/accso/static-code-analysis-archunit
  10. Copyright © Accso – Accelerated Solutions GmbH 11 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Integration mit anderen Tools Fazit
  11. Copyright © Accso – Accelerated Solutions GmbH 12 LiveCoding Nochmal

    Beispiel 3 diesmal mit Fokus auf statischer Code-Analyse Beispiel 5 Finde transitive Abhängigkeiten für eine Klasse. Relevant z.B. für Migrations- planung und -schätzung https://github.com/accso/static-code-analysis-archunit
  12. Copyright © Accso – Accelerated Solutions GmbH 14 ArchUnit basiert

    auf statischer Codeanalyse Byte Code ArchUnit prüft Byte Code, nicht den Source Code ArchUnit baut ein statisches Abhängigkeits- modell auf. Modell ClassFileImporter scannt den Classpath. Einschränkung auf eigene Packages möglich. Mit/ohne Test JavaClass JavaClasses Dependency JavaAccess Abhängigkeiten Aus- und eingehend Vererbung, Interfaces, Generics, Annotationen ArchUnit nutzt diese Informationen: Konstruktoren Feldern Annotationen Typen
  13. Copyright © Accso – Accelerated Solutions GmbH 15 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Integration mit anderen Tools Fazit
  14. Copyright © Accso – Accelerated Solutions GmbH 16 Komponentenschnitt in

    Säulen und Schichten API Business Logik Persistenz Technische Schichten
  15. Copyright © Accso – Accelerated Solutions GmbH 17 Komponentenschnitt in

    Säulen und Schichten API Business Logik Persistenz Billing Shipp ing Ware house Sales Technische Schichten Fachliche Säulen
  16. Copyright © Accso – Accelerated Solutions GmbH 18 Fachliche Abhängigkeiten

    Billing Shipp ing Ware house Sales Hat Abhängigkeit zu …
  17. Copyright © Accso – Accelerated Solutions GmbH 19 Fachliche Abhängigkeiten

    Billing Shipp ing Ware house Sales Hat Abhängigkeit zu …
  18. Copyright © Accso – Accelerated Solutions GmbH 20 Billing ui

    Onion-Architektur application domain model Richtung der Abhängigkeiten von außen nach innen … zu Persistenz … zu Messaging … zu Monitoring …
  19. Copyright © Accso – Accelerated Solutions GmbH 21 LiveCoding Beispiel

    6 Zyklen? Check auf erlaubte Abhängigkeiten … zwischen den fachlichen Komponenten … auf Onion- Architektur https://github.com/accso/static-code-analysis-archunit
  20. Copyright © Accso – Accelerated Solutions GmbH 22 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Integration mit anderen Tools Fazit
  21. Copyright © Accso – Accelerated Solutions GmbH 24 v.2 Integration

    mit Junit 4 & 5 und Surefire-Reports Integration als Test nach Sonar „Freezing Rule Violations“ als Sonar Metrik (siehe) Noch offen: „Architecture Breaks“ nach Sonar (siehe)
  22. Copyright © Accso – Accelerated Solutions GmbH 25 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit Integration mit anderen Tools
  23. Copyright © Accso – Accelerated Solutions GmbH 26 Fazit –

    einfach mal einsetzen! Leichtgewichtig einführbar Regeln per API sehr einfach zu schreiben. Refactoring möglich (außer Package-Namen als String) Filter über Importer, Ignore, Freeze Tests über JUnit in jeden Build integrierbar Wird stetig weiterentwickelt (Beispiel: Type Erasure, Generics) Gute Basis für eigene statische Code-Analyse-Werkzeuge Semantik von Depend, Access etc. nicht immer intuitiv Strings statt Typen bei Klassen, Packages, Wildcards Ungewohnte Wildcard-Notation Auch für .NET/C# verfügbar. Architekturtests sind Tests für die Code-Architektur (nicht mehr, aber auch nicht weniger). Kann andere Tools wie Checkstyle, Sonar & Co ergänzen, in Teilen ersetzen.
  24. Copyright © Accso – Accelerated Solutions GmbH 27 @mrtnlhmnn @krschaal

    @accso Copyright © Accso GmbH https://accso.de/publikationen/ https://github.com/accso/ static-code-analysis-archunit : https://speakerdeck.com/mrtnlhmnn Accso – Accelerated Solutions GmbH T | +49 6151 13029-0 E | [email protected] @ | www.accso.de Hilpertstraße 12 | 64295 Darmstadt Rahmhofstraße 2 | 60313 Frankfurt am Main Moltkestraße 131a | 50674 Köln Balanstraße 55 | 81541 München