CI l'architecture des applications Java / Kotlin avec ArchUnit

** (Une addition) **

Il a été annoncé au JJUG CCC 2019 Spring.

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


Actuellement, mon équipe travaille sur Développement de nouveaux services HRTech, et a récemment lancé un outil appelé ** ArchUnit **. Je vais le présenter parce qu'il a été incorporé.

J'ai lu le livre Evolutionary Architecture et mesuré / garanti le degré de conformité aux exigences des caractéristiques de l'architecture ** Fonction d'adaptabilité ** 1 A titre d'exemple, JDepend qui peut tester les dépendances de classe est introduit, et quand j'ai cherché un outil similaire, ArchUnit J'ai trouvé. Il a également été présenté comme TRIAL dans le [Technology Radar VOL.19] de cette année (https://www.thoughtworks.com/radar/tools).

Qu'est-ce que ArchUnit?

De quoi es-tu heureux

Exemple concret

Voici une partie du code de test intégré au CI du produit en cours de développement.

(1) Une classe à usage général commune aux domaines ne doit pas dépendre de classes d'autres domaines spécifiques.

Empêche le paquet «commun» de devenir non commun.


@Test
void domainCommonPackageShouldNotDependOnOtherPackages() {
    noClasses()
        .that().resideInAPackage(ROOT_PACKAGE + ".domain.common..")
        .should()
        .dependOnClassesThat(new DescribedPredicate<>("Classes autres que le package commun sous le package de domaine") {
            @Override
            public boolean apply(JavaClass clazz) {
                return clazz.getPackageName().startsWith(ROOT_PACKAGE + ".domain")
                    && ! clazz.getPackageName().equals(ROOT_PACKAGE + ".domain") //interface de base de domaine directement sous le package/La dépendance de classe est acceptable
                    && ! clazz.getPackageName().startsWith(ROOT_PACKAGE + ".domain.common");
            }
        })
        .check(CLASSES);
}

(2) L'énumération qui implémente JsonSerializable doit également implémenter la méthode de désérialisation.

Lors de la désérialisation d'une propriété JSON en une énumération numérique, si vous n'implémentez pas explicitement la méthode de désérialisation, l'énumération correspondant à la valeur ordinale de l'énumération sera instanciée au lieu de l'énumération correspondant à la valeur numérique. J'étais une fois accro aux spécifications.

Ajout d'un test pour vérifier si vous avez oublié d'implémenter la méthode de désérialisation (méthode d'usine annotée avec @ JsonCreator) afin que vous ne soyez pas accroché deux fois à la même chose.


@Test
void jsonSerializableShouldImplementJsonCreator() {
        classes()
            .that(new DescribedPredicate<>("Énumération sérialisée JSON") {
                @Override
                public boolean apply(JavaClass clazz) {
                    return clazz.isEnum() && clazz.isAssignableTo(JsonSerializable.class);
                }
            })
            .should(new ArchCondition<>("@Implémenter la méthode de fabrique annotée dans 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);
}

Résumé

Qu'as-tu pensé. Je ne pense pas qu'il y ait eu beaucoup d'outils pour tester l'architecture. En plus des exemples présentés cette fois, il semble que des tests sous différents angles puissent être mis en œuvre en fonction de l'idée. Ce serait passionnant si nous pouvions améliorer continuellement l'architecture grâce au développement de produits tout en garantissant la qualité de l'architecture grâce à des tests automatisés: smile:

Recommended Posts

CI l'architecture des applications Java / Kotlin avec ArchUnit
[Java] Récupère MimeType à partir du contenu du fichier avec Apathce Tika [Kotlin]
Calculer le score de similarité des chaînes de caractères avec JAVA
[Java / Kotlin] Redimensionner en tenant compte de l'orientation de l'image
Veuillez noter la division (division) de java kotlin Int et Int
Langage Java du point de vue de Kotlin et C #
Surveillez l'état interne des programmes Java avec Kubernetes
Vérifiez le comportement de Java Intrinsic Locks avec bpftrace
L'histoire de la création de DTO, semblable à Dao avec Java, SQLite
Remplacez seulement une partie de l'hôte URL par java
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
J'ai essayé de résumer les bases de kotlin et java
[Java] Simplifiez la mise en œuvre de la gestion de l'historique des données avec Reladomo
Assurez-vous de comparer le résultat Java compareTo avec 0
Trouvez le nombre de jours dans un mois avec Kotlin
Que ce soit pour faire du côté serveur au moment de la reconstruction du système avec Kotlin ou Java
[Java] Supprimer les éléments de la liste
[Java1.8 +] Obtenez la date du jour × suivant avec LocalDate
[Édition Java] Histoire de la sérialisation
Transformez facilement les applications Java en Docker avec Jib
Je veux revenir à l'écran précédent avec kotlin et java!
Essayez HelloWorld avec la configuration minimale de Heroku Java spring-boot
[Détails] Implémentation d'applications grand public avec Kinesis Client Library for Java
Suivez le lien avec Selenium (Java)
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Le point addictif lors de l'authentification de base avec Java URLConnection
Génériques Kotlin pour les développeurs Java
Écraser le téléchargement du fichier avec le même nom avec BOX SDK (java)
La version d'Elasticsearch que vous utilisez est-elle compatible avec Java 11?
Le gars qui essaie avec des ressources avec Kotlin
L'origine des expressions Java lambda
[Code Pipeline x Elastic Beanstalk] Récapitulatif des erreurs et des contre-mesures pour les applications Java CI / CD vers Elastic Beanstalk avec Code Pipeline
Utilisez Priority Queue avec kotlin (1.0.0) d'AtCoder (+ Enquête sur l'environnement du serveur de juge)
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
Exprimons le résultat de l'analyse du code d'octet Java dans un diagramme de classes
À propos de la classification et du concept de Immutable / Mutable / Const / Variable de Java et Kotlin.
Vérifiez l'enregistrement MX de l'adresse e-mail avec java et vérifiez le domaine
Obtenez le résultat de POST en Java
Vérifiez le contenu du magasin de certificats Java
Vérifiez le contenu des paramètres avec le levier
Examiner l'utilisation de la mémoire des éléments Java
[Java] Obtenez le jour d'un jour spécifique
Mémo: [Java] Vérifiez le contenu du répertoire
Application Java CICS-Run - (3) Gestion de build avec Gradle
Comparer les éléments d'un tableau (Java)
[jour: 5] J'ai résumé les bases de Java
Quelles sont les fonctionnalités mises à jour de Java 13
Mesurez facilement la taille des objets Java
Application Java CICS-Run - (2) Gestion de build avec Maven
Retour sur les bases de Java
[Kotlin] Supprimer les fichiers en double [Java]
Sortie du livre "Introduction à Java"
À propos du traitement de BigDecimal (avec réflexion)
Conseils d'interopérabilité avec Kotlin à envoyer aux développeurs Java
L'histoire de l'écriture de Java dans Emacs
Mettre en forme le contenu de LocalDate avec DateTimeFormatter
[Java] Vérifiez le nombre d'occurrences de caractères
[Java] [Spring] Tester le comportement de l'enregistreur
Essayez d'utiliser la télécommande Wii en Java