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

Automatisierte Architekturtests und statische C...

Automatisierte Architekturtests und statische Codeanalyse mit ArchUnit

Vortrag bei den IT-Tagen 2021, 8. Dezember 2021
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

December 09, 2021
Tweet

More Decks by Martin Lehmann

Other Decks in Technology

Transcript

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

    Automatisierte Architekturtests und statische Codeanalyse mit ArchUnit MARTIN LEHMANN DR. KRISTINE SCHAAL IT-TAGE 2021, DEZEMBER 2021 @mrtnlhmnn @krschaal
  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 der Softwareentwicklung in Individualentwicklungsprojekten für Kunden verschiedener Branchen. Er interessiert sich besonders für Software-Architektur und Entwicklungsmethodik. [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 Individual- entwicklung 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 5 Statische Code-Analyse

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

    Architektur-Tests mit ArchUnit? Schnelles Feedback für alle Entwickler:innen automatisiert 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, gut lesbar und wartbar damit mächtiger als Checkstyle, PMD, Findbugs, JDepend, Sonar*, Structure101, jqAssistant V0.22 vom 30. Oktober 2021 https://www.archunit.org
  5. 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. 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 8 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 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
  8. 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
  9. Copyright © Accso – Accelerated Solutions GmbH 11 Statische Code-Analyse

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

    auf statischer Codeanalyse Byte Code ArchUnit prüft Byte Code. Source Code wird nicht geparst! 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 Dazu nutzt ArchUnit Informationen aus: Konstruktoren Feldern Annotationen Typen
  12. Copyright © Accso – Accelerated Solutions GmbH 15 Statische Code-Analyse

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

    Säulen und Schichten API Business Logik Persistenz Fach- liche Säule 2 Fach- liche Säule 3 … Fach- liche Säule 1
  14. Copyright © Accso – Accelerated Solutions GmbH 17 Fachliche Komponenten

    mit Abhängigkeiten Common … von allen Billing Shipp- ing Sales Ware- house
  15. Copyright © Accso – Accelerated Solutions GmbH 18 Billing ui

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

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

    mit ArchUnit Architektur testen mit ArchUnit Fachliche Säulen, technische Schichten, Zyklen Fazit
  18. Copyright © Accso – Accelerated Solutions GmbH 21 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 für statische Code Analyse wie Checkstyle, Sonar & Co komplett ersetzen.
  19. Copyright © Accso – Accelerated Solutions GmbH 22 22 Copyright

    © Accso GmbH 22 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 https://speakerdeck.com/mrtnlhmnn https://github.com/accso/static-code- analysis-archunit : @mrtnlhmnn @krschaal @accso https://accso.de/ https://accso.de/publikationen/