Découvrez comment intégrer facilement l'analyse statique, les tests unitaires et d'autres méthodes de test de logiciels C et C++ dans votre pipeline CI/CD. Inscrivez-vous pour la démo >>

Commencez à aimer les tests de printemps avec l'assistant de test unitaire pour Java

Par Brian McGlauflin

28 novembre 2017

7  min lire

Spring est le principal framework d'applications Java d'entreprise et, en tant que tel, a besoin d'un niveau de test approprié pour garantir la qualité et la sécurité des applications créées avec lui.

Les Printemps cadre (avec Botte de printemps) est l'un des le plus populaire Cadres de logiciels d'entreprise Java. Son utilisation dans des applications critiques signifie qu'il a fait l'objet d'un examen minutieux en termes de qualité et de sécurité.

Auparavant, notre vice-président des produits, Mark Lambert, a expliqué comment les développeurs n'aiment pas les tests unitaires malgré ses antécédents d'amélioration éprouvés, et a détaillé comment Parasoft Jtest Assistant de test unitaire peut fournir une approche guidée et automatisée des tests pour rendre les tests non seulement plus agréables au goût, mais aussi plus faciles et plus efficaces. Dans cet article, je vais continuer sur le même thème avec le framework Spring, en vous montrant exemples de tests unitaires et comment les tests automatisés et guidés peuvent être exploités dans cet important cadre d'application.

Les défis du test des applications Spring

Le framework Spring est livré avec un bon support pour test d'intégration, mais beaucoup de codage manuel est nécessaire pour configurer correctement les cas de test. La création et la maintenance de tests pour les applications Spring présentent aux développeurs un ensemble unique de défis, notamment les suivants:

  • Le framework Spring doit être initialisé et configuré
  • L'application a généralement 3rd-dépendances de la bibliothèque de parties (stockage persistant, services externes, etc.)
  • Les applications utilisent souvent des fonctionnalités Spring intégrées pour les sessions, la sécurité, la messagerie, etc. Celles-ci peuvent être délicates à configurer pour les développeurs qui ne sont pas familiarisés avec les tests Spring
  • Les dépendances d'application (c'est-à-dire les beans) doivent être configurées de manière appropriée

Ces défis, combinés au fait que l'écriture de suites de tests complètes et maintenables prend beaucoup de temps en général, font en sorte que les développeurs n'écrivent pas suffisamment de tests.

L'assistant de test d'unité Parasoft Jtest aide en rendant le processus de génération, d'amélioration et de maintenance des tests JUnit beaucoup plus facile et moins chronophage, afin que les développeurs créent rapidement de bons tests et reviennent à ce qu'ils aiment vraisemblablement: écrire du code.

Accélérez les tests unitaires des applications Spring avec Parasoft Jtest et son assistant de test unitaire

Le framework de test Spring MVC

Spring Framework comprend un cadre de test qui facilite grandement le test des contrôleurs, des services et d'autres composants. Il comprend des fonctionnalités pour configurer le conteneur de test Spring, appeler des méthodes de gestionnaire de contrôleur et valider le comportement avec des assertions personnalisées.

Un exemple de contrôleur Spring MVC:

@Controller
public class TodoController {     @Autowired
    private TodoService service;
    @GetMapping("/")    public String findAll(Model model) {
        List<Todo> todos = service.findAll();
        model.addAttribute("todos", todos);
        return "todo/list";
    }
}

Cet exemple de contrôleur implémente un service REST simple pour obtenir des éléments d'une liste «à faire». Cela dépend d'un À faireService, qui contient la logique métier.

Pour tester le Trouver tout méthode, nous avons besoin d'un test JUnit qui effectue les opérations suivantes:

  • Configurez le conteneur Spring avec le Controller en cours de test et un TodoService, dont TodoController dépend.
  • Envoyez une requête valide à la méthode du gestionnaire findAll.
  • Validez les éléments de la réponse, y compris la valeur de retour («todo / list») et l'attribut de modèle «todos».

Un exemple de test Spring MVC Junit peut ressembler à ceci:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TodoControllerTest {
    @Autowired
    TodoController controller;
 
    @Autowired
    TodoService todoService;
 
    MockMvc mockMvc;
 
    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }
 
    @Configuration
    static class Config {
        @Bean
        public TodoController getTodoController() {
            return new TodoController();
        }
 
        @Bean
        public TodoService getTodoService() {
            return new TodoService();
        }
    }
 
    @Test
    public void testFindAll() throws Exception {
        mockMvc.perform(get("/")).andExpect(view().name("todo/list"));
    }
}

L'exemple ci-dessus est un très test simple - mais il y a encore beaucoup de code «passe-partout» à écrire, et beaucoup de choses se passent. Dans cet exemple, nous avons configuré Spring avec un contrôleur et ses services, en utilisant une classe de configuration interne. Nous utilisons ensuite le MockMvc fonctions pour envoyer une requête à la méthode du gestionnaire (en utilisant effectuer) et validez le nom de la vue renvoyée à l'aide de et attendez.

Quel est le problème avec le test ci-dessus? Rien de vraiment - mais imaginez une méthode de contrôleur plus complexe, avec plusieurs méthodes de gestion qui acceptent plus d'arguments et produisent plus de sorties. La rédaction des tests prendrait beaucoup plus de temps, surtout si une bonne couverture des tests est importante. De plus, la plupart des tests réels nécessitent beaucoup plus de configuration (configurations XML ou de classe, sessions et environnements, sécurité, etc.).

Générer des tests de printemps avec Parasoft Jtest

Parasoft Jtest's Assistant de test unitaire aide les développeurs à écrire des tests Spring de plusieurs manières:

  1. Génération automatique du code de la plaque chauffante pour les tests Spring MVC rapidement
  2. Tests paramétrés à génération automatique pour une couverture de test accrue
  3. Mocking des dépendances pour isoler la méthode d'assistance et simplifier le test
  4. Collecte des données de couverture et analyse du flux de test au moment de l'exécution
  5. Fournir des recommandations avec des correctifs rapides pour améliorer les tests

Tests à génération automatique

La génération de tests Spring dans Parasoft Jtest est simple - sélectionnez simplement une méthode de gestionnaire Spring dans votre IDE pour votre contrôleur et choisissez une action de création de test:

Choisir soit Printemps régulier or Ressort paramétré génère automatiquement le test Spring MVC de la plaque chauffante pour vous, y compris les classes de configuration (et tous les Beans dont dépend votre contrôleur). Le mockMvc.effectuer l'appel est également ajouté, et est préconfiguré pour appeler la méthode de gestionnaire pour laquelle le test a été créé. L'assistant de test d'unité Jtest ajoute même quelques exemples d'assertions que vous pouvez décommenter et configurer.

Parasoft Jtest prend en charge la génération de tests à l'aide de XML ou de la configuration de classe en définissant l'option «Attributs ContextConfiguration pour les tests Spring» dans les préférences.

Dépendances moqueuses

La gestion des dépendances dans les tests unitaires est essentielle, car une grande partie de la complexité et du travail provient de l'isolement d'une unité sous test. L'assistant de test d'unité Jtest utilise Mockito or PuissanceMockito pour simuler les dépendances par défaut (vous pouvez le désactiver dans les préférences si vous ne le souhaitez pas). Les dépendances simulées permettent au test de contrôler ces dépendances, isolant la méthode du gestionnaire du reste de l'application pour concentrer les efforts de test sur le gestionnaire. Dans notre exemple de gestionnaire, le Trouver tout méthode a été invoquée le À faireService - si nous utilisons un vrai À faireService, nous testons efficacement à la fois le TodoController et de la À faireService. C'est peut-être ce que nous voulons pour un test d'intégration, mais pas pour un test unitaire. Se moquer de la réponse de TodoService.findAll dans le test nous permet de concentrer nos efforts de test sur la méthode du gestionnaire.

(Si vous voulez plus d'informations sur les dépendances simulées dans les tests Spring, continuez à lire mon prochain post.)

Ebook: Améliorez les tests unitaires pour Java avec l'automatisation

Botte de printemps

Étant donné que Spring Boot fournit une configuration simplifiée pour Beans, ainsi que des annotations supplémentaires pour les tests, l'assistant de test unitaire génère des tests légèrement différents lorsqu'il détecte Spring Boot dans votre projet. Par exemple, MockMvc est câblé automatiquement, les dépendances sont simulées avec @MockBean et l'annotation @SpringBootTest est utilisée.

Exécution de tests et analyse des résultats

Vous pouvez exécuter des tests générés à l'aide de n'importe quel exécuteur JUnit normal. Parasoft Jtest fournit des actions de barre d'outils qui exécutent JUnit et analysent le test.

Une fois les tests exécutés, le flux d'exécution du test est affiché et des recommandations pour améliorer le test sont faites par l'assistant de test unitaire et rapportées dans votre IDE:

Fournir des entrées de méthode de gestionnaire

Les méthodes de gestion sont souvent configurées pour accepter le chemin, la requête ou d'autres paramètres comme arguments de la méthode. Pour tester la méthode du gestionnaire MVC, vous pouvez utiliser MockMvc pour générer le chemin / la requête et tous les autres paramètres nécessaires pour appeler la méthode.

L'assistant de test d'unité Jtest configure automatiquement l'appel mockMvc.perform pour appeler la méthode du gestionnaire. Les paramètres individuels apparaissent dans le test en tant que variables locales (ou paramètres dans un test paramétré) qui doivent être configurés pour que le test s'exécute correctement.

Par exemple (voir Unit Test Assistant abrégé en UTA ci-dessous):

@Test public void testGetPerson() throws Throwable {     // When     String id = ""; // UTA: Configure an appropriate parameter value since the tested method depends on it     ResultActions actions = mockMvc.perform(get("/people/" + id));

Ici le "id”La chaîne doit être configurée - sinon, le chemin utilisé serait“ / people / ”, et Spring ne correspondra pas au chemin fourni avec la méthode de gestion appropriée.

class = "p1">L'assistant de test unitaire recherche différents types de paramètres de méthode de gestionnaire et prépare automatiquement le test pour eux de la manière suivante:

  • HttpSession (ajoute un exemple setAttribute () appeler)
  • En-têtes (ajoute un entête() appeler),
  • Corps de la requête (ajoute une variable de charge utile et teneur() appeler)
  • Authentification (ajoute un exemple d'instanciation au installation méthode, et un Majeur() appeler)

L'exécution d'un test qui n'entraîne pas l'appel de la méthode du gestionnaire produit une recommandation comme celle-ci:

Validation des sorties de méthode de gestionnaire

Selon ce que la méthode du gestionnaire est censée fournir aux appelants, elle peut renvoyer une variété de types. La plupart du temps, les méthodes de gestion renvoient soit un ModèleEtVue (ou des objets similaires comme Model ou RedirectView) pour diffuser une page, ou un Entité de réponse d'une sorte (parfois juste l'objet brut à sérialiser). Cette réponse est accessible au framework Spring MVC Test pour validation.

Par exemple, les assertions suivantes ont été ajoutées par l'assistant de test d'unité Jtest pour une méthode de gestionnaire qui renvoie un ModèleEtVue:

  // When
  String id = "1";
  ResultActions actions = mockMvc.perform(get("/people/" + id));
 
  // Then
  // actions.andExpect(status().isOk());
  // actions.andExpect(header().string("", ""));
  // actions.andExpect(view().name(""));
  // actions.andExpect(model().attribute("", ""));

Une fois le test généré, vous pouvez décommenter ces assertions et renseigner des valeurs pour créer rapidement un test utile et précieux. Si une assertion échoue au moment de l'exécution, l'assistant de test unitaire fournit une recommandation et un correctif rapide pour mettre à jour automatiquement la valeur attendue ou simplement supprimer l'assertion. Pour configurer rapidement l'assertion avec une valeur appropriée, vous pouvez annuler la mise en commentaire d'une assertion, la laisser échouer, puis utiliser un correctif rapide pour définir la valeur attendue correcte.

De conclure

Spring (combiné avec Spring Boot) est le principal framework d'applications Java d'entreprise et, à ce titre, nécessite un niveau de test approprié pour garantir la qualité et la sécurité des applications créées avec. Mais malheureusement, ce niveau de test n'est pas atteint actuellement, principalement en raison d'un manque de temps et de la quantité de codage manuel et de maintenance requis. Le Parasoft Jtest Assistant de test unitaire fournit non seulement l'automatisation des tests unitaires, mais aussi la création de tests guidés et la gestion des dépendances, pour accélérer la création de tests et réduire la maintenance.

Pour en savoir plus, lisez comment l'assistant de test unitaire peut vous aider gestion des dépendances avec des frameworks moqueurs.

Apprenez à augmenter votre rendement des tests unitaires avec Parasoft Jtest.
Demandez une démo maintenant

Par Brian McGlauflin

Brian McGlauflin est un ingénieur logiciel chez Parasoft avec une expérience dans le développement de pile complète avec Spring et Android, les tests d'API et la virtualisation de services. Il se concentre actuellement sur les tests logiciels automatisés pour les applications Java avec Parasoft Jtest.

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.