** (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).
Voici une partie du code de test intégré au CI du produit en cours de développement.
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);
}
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);
}
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: