Maison >Problème commun >JUnit, 4, 5, Jupiter, Rétro

JUnit, 4, 5, Jupiter, Rétro

百草
百草original
2024-03-21 16:23:001211parcourir

La sortie de JUnit 5 simplifie l'intégration de cette bibliothèque dans les projets car il n'est pas nécessaire de migrer depuis JUnit 4. Cependant, dans un grand projet utilisant à la fois JUnit 5 et 4, cette coexistence peut entraîner de la confusion et des difficultés de maintenance. Pour résoudre ce problème, cet article recommande de suivre les étapes suivantes : informer les équipes des nouvelles fonctionnalités de JUnit 5, encourager l'écriture de nouveaux tests à l'aide de JUnit 5 et suivre la règle Scout lors de la suppression de JUnit 4. De plus, cet article explore les changements notables dans JUnit 5, notamment les mises à jour des annotations, des méthodes et des configurations de test, ainsi que la nouvelle annotation @ParameterizedTest. Enfin, l'article souligne l'importance d'exclure les dépendances, de créer des classes de configuration et d'utiliser OpenRewrite pour refactoriser automatiquement le code source afin de faciliter la migration vers JUnit 5 et de maintenir les projets à jour.

JUnit, 4, 5, Jupiter, Rétro

Après la sortie de JUnit 5, de nombreux développeurs ont simplement ajouté cette superbe nouvelle bibliothèque à leurs projets car contrairement aux autres versions, dans cette nouvelle version, il n'est pas nécessaire de migrer de JUnit 4 vers 5, en incluant simplement le nouveau bibliothèque dans votre projet, avec tous les moteurs de JUnit 5, vous pouvez exécuter de nouveaux tests en utilisant JUnit 5, tandis que les anciens tests utilisant JUnit 4 ou 3 continueront à s'exécuter sans problème.

Mais que se passe-t-il dans un gros projet, construit il y a 10 ans, avec deux versions de JUnit fonctionnant en parallèle ?

De nouveaux développeurs ont commencé à travailler sur le projet, certains avec une expérience JUnit et d'autres sans. De nouveaux tests sont créés avec JUnit 5, de nouveaux tests sont créés avec JUnit 4, à un moment donné, les développeurs sans le savoir, lorsqu'ils créent de nouveaux scénarios dans des tests JUnit 5 déjà créés, ils incluent simplement des annotations JUnit 4, et les tests sont devenus hybrides, certains @Test étaient JUnit 4, certains @Test étaient JUnit 5, et il est devenu plus difficile de supprimer les bibliothèques JUnit 4 chaque jour.

Alors, comment résoudre ce problème ? Tout d'abord, vous devez montrer à votre équipe ce qui vient de JUnit 5 et ce qui vient de JUnit 4 afin que de nouveaux tests puissent être créés en utilisant JUnit 5 au lieu de JUnit 4. Après cela, chaque fois qu'ils réussissent les tests JUnit 4, en suivant les règles des Boy Scouts, ils doivent migrer vers JUnit 5.

Jetons un coup d'œil aux changements majeurs publiés dans JUnit 5. Tout commence par le nom, dans JUnit 5, vous ne voyez pas de package nommé org.junit5, vous voyez org.junit.jupiter. Dans l’ensemble, tout ce que vous voyez contient « Jupiter », ce qui signifie qu’il vient de JUnit 5. Ils ont choisi ce nom parce que Jupiter, qui commence par « JU », est la cinquième planète en partant du Soleil.

Un autre changement concerne @Test, cette annotation a été déplacée vers un nouveau package : org.junit.jupiter.api et n'utilise désormais plus de propriétés comme "attendu" ou "timeout", mais utilise des extensions. Par exemple, pour le délai d'attente, vous disposez désormais d'une annotation : @Timeout(value = 100, unit = TimeUnit.MILLISECONDS). Un autre changement est que ni la méthode de test ni la classe ne doivent être publiques.

@Before Now au lieu de @After vous devez utiliser @BeforeEach et @AfterEach dans votre configuration de test et vous avez également @BeforeAlland @AfterAll.

Pour ignorer un test, vous devez désormais utiliser @Disable au lieu de @Ignore

L'une des bonnes nouvelles publiées dans JUnit 5 est l'annotation @ParameterizedTest, qui permet d'exécuter un test plusieurs fois avec différents paramètres. Par exemple, si vous souhaitez tester une méthode qui crée un certain objet et que vous souhaitez vérifier que les champs sont correctement remplis, vous pouvez simplement procéder comme suit :

@ParameterizedTest
@MethodSource("getInvalidSources")
void shouldCheckInvalidFields(String name, String job, String expectedMessage) {
Throwable exception = catchThrowable(() -> new Client(name, job));
  
  assertThat(exception).isInstanceOf(IllegalArgumentException.class)
      .hasMessageContaining(expectedMessage);
}
static Stream<Arguments> getInvalidSources() {
return Stream.of(Arguments.arguments("Jean Donato", "", "Job is empty"),
                     Arguments.arguments("", "Dev", "Name is empty"));
}

Il y a beaucoup de fonctionnalités intéressantes dans JUnit 5, je vous recommande de consulter le guide de l'utilisateur JUnit 5 pour analyser les fonctionnalités utiles pour votre projet.

Maintenant que tous les développeurs savent ce qui a changé dans JUnit 5, vous pouvez démarrer le processus de suppression de JUnit 4 de votre projet. Ainsi, si vous utilisez toujours JUnit 4 en 2024 et que votre projet est de grande envergure, vous pouvez avoir des dépendances qui utilisent JUnit 4. Je vous recommande de profiler vos bibliothèques pour vérifier si certaines d'entre elles utilisent JUnit 4.

Dans l'image ci-dessous, j'utilise l'analyseur de dépendances d'IntelliJ.

JUnit, 4, 5, Jupiter, Rétro

Comme vous pouvez le voir, jersey-test utilise JUnit 4, c'est-à-dire que même si je supprime JUnit 4 du projet, JUnit 4 fonctionne toujours car Jersey. Un moyen plus simple est de remplacer jersey Mise à niveau vers 2.35 car JUnit. 5 a été introduit dans jersey-test 2.35 mais je ne peux pas mettre à jour le framework jersey-test car d'autres bibliothèques vont s'interrompre dans mon projet. Alors, que puis-je faire dans cette situation ?

J'ai pu exclure JUnit de Jersey via l'exclusion de dépendances de Maven (comme le montre l'image ci-dessous). Cela n'utilisera plus JUnit 4, mais notre JUnit 5.

JUnit, 4, 5, Jupiter, Rétro

当你运行一些使用Jersey的测试时,它们不会被加载,因为Jersey中有使用JUnit 4注释的方法,setUpand tearDown,using@Before和@After。为了解决这个问题,您可以创建一个“配置类”,其扩展JerseyTest实现setUpandtearDown并@BeforeEach调用@AfterEachand 。super.setUp()super.TearDown()

public class JerseyConfigToJUnit5 extends JerseyTest {
  @BeforeEach
  public void setUp() throws Exception {
  super.setUp();
  }
  
  @AfterEach
  public void tearDown() throws Exception {
  super.tearDown();
  }
}

因此,如果您已经检查了您的库并且没有人对 JUnit 4 有更多依赖,那么您终于可以将所有测试迁移到 JUnit 5,对于此过程,有一个很好的工具可以帮助您节省大量工作,那就是OpenRewrite,一个源代码的自动重构生态系统,它们会将您所有的旧包、旧注释和所有内容更改为新包。

就是这样,伙计们,现在您和您的队友可以享受 JUnit 5 并放松心情,因为知道将使用 JUnit 5 创建新测试,并且该项目不会成为弗兰肯斯坦。所以,记住,保持你的项目是最新的,因为如果你忘记了你的库,每一天都会更难更新,总是使用规范,以及遵循规范的框架,并且在你的代码中有一个好的设计,这允许您随设施改变和移动。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn