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

Vortrag bei den Karlsruher Entwicklertagen, 18. Mai 2022
Beispielcode siehe https://github.com/accso/static-code-analysis-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 Architekturentscheidungenin 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

May 18, 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 KARLSRUHER ENTWICKLERTAG, 18. MAI 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. Copyright © Accso – Accelerated Solutions GmbH 4 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit
  4. Copyright © Accso – Accelerated Solutions GmbH 5 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 mächtige DSL Schnell erlernbar und einführbar, gut lesbar und wartbar damit mächtiger als Checkstyle, PMD, Findbugs, JDepend, Sonar*, Structure101, jqAssistant V0.23.1 vom 27. Februar 2022 https://www.archunit.org
  5. Copyright © Accso – Accelerated Solutions GmbH 6 Wie schreibt

    man ArchUnit-Tests? Regeln schreiben Regeln prüfen einen Aspekt der Architektur. Regeln definiert man über ArchRule, bzw. spezifische Subklassen. DSL 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 …
  6. Copyright © Accso – Accelerated Solutions GmbH 7 Fachliches Bücherei-Beispiel

    „library“ common util … von allen … von allen data management borrow book-admin customers statistics search
  7. Copyright © Accso – Accelerated Solutions GmbH 8 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
  8. Copyright © Accso – Accelerated Solutions GmbH 9 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
  9. Copyright © Accso – Accelerated Solutions GmbH 10 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit
  10. Copyright © Accso – Accelerated Solutions GmbH 11 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
  11. Copyright © Accso – Accelerated Solutions GmbH 13 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
  12. Copyright © Accso – Accelerated Solutions GmbH 14 Statische Code-Analyse

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit
  13. Copyright © Accso – Accelerated Solutions GmbH 15 Komponentenschnitt in

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

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

    Billing Shipp ing Ware house Sales Hat Abhängigkeit zu …
  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 Billing ui

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

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

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit
  20. Copyright © Accso – Accelerated Solutions GmbH 22 Fazit –

    einfach mal einsetzen! Leichtgewichtig einführbar Regeln per DSL 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.
  21. Copyright © Accso – Accelerated Solutions GmbH 23 Copyright ©

    Accso GmbH @mrtnlhmnn @krschaal @accso 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