CI die Architektur von Java / Kotlin-Anwendungen mit ArchUnit

** (Ergänzung) **

Dies wurde auf der [JJUG CCC 2019 Spring] angekündigt (http://www.java-users.jp/ccc2019spring/#/sessions/2e1e4779-b1ae-4864-a319-2b1262eba09c).

How to check and improve the Java-based application architecture with “ArchUnit” https://speakerdeck.com/kawanamiyuu/jjug-ccc-2019-spring


Derzeit arbeitet mein Team an Entwicklung neuer HRTech-Dienste und hat kürzlich ein Tool namens ** ArchUnit ** gestartet. Ich werde es vorstellen, weil es aufgenommen wurde.

Ich habe das Buch Evolutionäre Architektur gelesen und den Grad der Übereinstimmung mit den Anforderungen der Eigenschaften der Architektur gemessen / garantiert ** Anpassungsfähigkeitsfunktion ** 1 Als Beispiel wird JDepend vorgestellt, mit dem Klassenabhängigkeiten getestet werden können, und als ich nach einem ähnlichen Tool suchte, ArchUnit Ich fand. Es wurde auch als TRIAL im diesjährigen Technology Radar VOL.19 eingeführt.

Was ist ArchUnit?

Worüber freust du dich?

Konkretes Beispiel

Hier ist ein Teil des Testcodes, der in das CI des derzeit in der Entwicklung befindlichen Produkts eingebettet ist.

(1) Eine für Domänen gemeinsame Allzweckklasse darf nicht von Klassen anderer spezifischer Domänen abhängen.

Verhindert, dass das "gemeinsame" Paket nicht allgemein wird.


@Test
void domainCommonPackageShouldNotDependOnOtherPackages() {
    noClasses()
        .that().resideInAPackage(ROOT_PACKAGE + ".domain.common..")
        .should()
        .dependOnClassesThat(new DescribedPredicate<>("Andere Klassen als das allgemeine Paket unter dem Domänenpaket") {
            @Override
            public boolean apply(JavaClass clazz) {
                return clazz.getPackageName().startsWith(ROOT_PACKAGE + ".domain")
                    && ! clazz.getPackageName().equals(ROOT_PACKAGE + ".domain") //Domain Base-Schnittstelle direkt unter dem Paket/Klassenabhängigkeit ist akzeptabel
                    && ! clazz.getPackageName().startsWith(ROOT_PACKAGE + ".domain.common");
            }
        })
        .check(CLASSES);
}

(2) Die Aufzählung, die JsonSerializable implementiert, muss auch die Deserialisierungsmethode implementieren.

Wenn Sie beim Deserialisieren einer JSON-Eigenschaft in eine numerische Aufzählung die Deserialisierungsmethode nicht explizit implementieren, wird die dem Ordnungswert der Aufzählung entsprechende Aufzählung anstelle der dem numerischen Wert entsprechenden Aufzählung instanziiert. Ich war einmal süchtig nach den Spezifikationen.

Es wurde ein Test hinzugefügt, um zu überprüfen, ob vergessen wurde, die Deserialisierungsmethode (mit @ JsonCreator annotierte Factory-Methode) zu implementieren, damit Sie nicht zweimal an derselben Sache hängen bleiben.


@Test
void jsonSerializableShouldImplementJsonCreator() {
        classes()
            .that(new DescribedPredicate<>("JSON serialisierte Aufzählung") {
                @Override
                public boolean apply(JavaClass clazz) {
                    return clazz.isEnum() && clazz.isAssignableTo(JsonSerializable.class);
                }
            })
            .should(new ArchCondition<>("@Implementieren Sie die mit Anmerkungen versehene Factory-Methode in JsonCreator") {
                @Override
                public void check(JavaClass clazz, ConditionEvents events) {
                    boolean hasJsonCreator = clazz.getMethods().stream()
                        .anyMatch(method -> method.isAnnotatedWith(JsonCreator.class));

                    if (! hasJsonCreator) {
                        events.add(SimpleConditionEvent.violated(
                            clazz,
                            clazz.getName() + " should implement a factory method annotated with @JsonCreator."
                        ));
                    }
                }
            })
            .check(CLASSES);
}

Zusammenfassung

Was haben Sie gedacht. Ich glaube nicht, dass es viele Tools gab, um die Architektur zu testen. Zusätzlich zu den diesmal vorgestellten Beispielen können je nach Idee Tests aus verschiedenen Perspektiven durchgeführt werden. Es wäre aufregend, wenn wir die Architektur durch Produktentwicklung kontinuierlich verbessern und gleichzeitig die Qualität der Architektur durch automatisierte Tests sicherstellen könnten: smile:

Recommended Posts

CI die Architektur von Java / Kotlin-Anwendungen mit ArchUnit
[Java] Holen Sie sich MimeType aus dem Inhalt der Datei mit Apathce Tika [Kotlin]
Berechnen Sie die Ähnlichkeitsbewertung von Zeichenketten mit JAVA
[Java / Kotlin] Ändern Sie die Größe unter Berücksichtigung der Ausrichtung des Bildes
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Java-Sprache aus der Sicht von Kotlin und C #
Überwachen Sie den internen Status von Java-Programmen mit Kubernetes
Überprüfen Sie das Verhalten von Java Intrinsic Locks mit bpftrace
Die Geschichte von dto, dao-like mit Java, SQLite
Ersetzen Sie nur einen Teil des URL-Hosts durch Java
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
[Java] Vereinfachen Sie die Implementierung der Datenverlaufsverwaltung mit Reladomo
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
Finden Sie mit Kotlin die Anzahl der Tage in einem Monat
Gibt an, ob die Serverseite zum Zeitpunkt der Systemwiederherstellung mit Kotlin oder Java erstellt werden soll
[Java] Löschen Sie die Elemente von List
[Java1.8 +] Mit LocalDate das Datum des nächsten × Tages abrufen
[Java Edition] Geschichte der Serialisierung
Verwandeln Sie Java-Anwendungen mit Jib ganz einfach in Docker
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Probieren Sie HelloWorld mit der Mindestkonfiguration von Heroku Java Spring-Boot aus
[Details] Implementierung von Consumer-Anwendungen mit der Kinesis Client Library für Java
Folgen Sie dem Link mit Selen (Java)
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Der Suchtpunkt bei der Durchführung der Basisauthentifizierung mit Java URLConnection
Kotlin-Generika für Java-Entwickler
Überschreiben Sie den gleichnamigen Upload mit dem BOX SDK (Java).
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?
Der Typ, der mit Kotlin mit Ressourcen versucht
Der Ursprung von Java-Lambda-Ausdrücken
[Code Pipeline x Elastic Beanstalk] Zusammenfassung der Fehler und Gegenmaßnahmen für CI / CD-Java-Anwendungen zu Elastic Beanstalk mit Code Pipeline
Verwenden Sie die Prioritätswarteschlange mit kotlin (1.0.0) von AtCoder (+ Untersuchen Sie die Umgebung des Richterservers).
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Lassen Sie uns das Ergebnis der Analyse von Java-Bytecode in einem Klassendiagramm ausdrücken
Über die Klassifizierung und das Konzept von Immutable / Mutable / Const / Variable von Java und Kotlin.
Überprüfen Sie den MX-Eintrag der E-Mail-Adresse mit Java und die Domain
Holen Sie sich das Ergebnis von POST in Java
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Überprüfen Sie den Inhalt der Parameter mit pry
Untersuchen Sie die Speichernutzung von Java-Elementen
[Java] Ermittelt den Tag eines bestimmten Tages
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
Vergleichen Sie Elemente eines Arrays (Java)
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Was sind die aktualisierten Funktionen von Java 13
Messen Sie einfach die Größe von Java-Objekten
CICS-Java-Anwendung ausführen- (2) Build-Management mit Maven
Rückblick auf die Grundlagen von Java
[Kotlin] Doppelte Dateien löschen [Java]
Ausgabe des Buches "Einführung in Java"
Über die Behandlung von BigDecimal (mit Reflexion)
Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler
Die Geschichte des Schreibens von Java in Emacs
Formatieren Sie den Inhalt von LocalDate mit DateTimeFormatter
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] [Spring] Testen Sie das Verhalten des Loggers
Versuchen Sie es mit der Wii-Fernbedienung in Java