Skip to main content

Création de données test pour des tests Apex

Objectifs de formation

Une fois cette unité terminée, vous pourrez :

  • Créer une classe utilitaire de test
  • Utiliser une méthode utilitaire de test afin de configurer des données test pour diverses situations de test
  • Exécuter toutes les méthodes de test dans une classe
Remarque

Remarque

Vous souhaitez apprendre en français ? Dans ce badge, les validations de défi pratique Trailhead se font en anglais. Les traductions sont fournies entre parenthèses à titre de référence. Veillez à copier/coller les valeurs en anglais, puis à définir la langue de votre Trailhead Playground sur Anglais et les paramètres régionaux sur États-Unis. Suivez les instructions ici.

Consultez le badge Trailhead dans votre langue pour découvrir comment profiter de l’expérience Trailhead traduite.

Création de données test pour des tests Apex

Utilisez des classes utilitaires de test afin d'ajouter des méthodes réutilisables pour la configuration de données test.

Prérequis

Suivez les étapes préalables de l’unité précédente, Test de déclencheurs Apex, si ce n’est déjà fait.

Ajout d’une classe utilitaire de test

Reprenons la méthode de test précédente en remplaçant la création de données test par un appel à une méthode de classe utilitaire. Commencez par créer la classe utilitaire de test.

La classe TestDataFactory est un type de classe spécial, une classe publique annotée avec @isTest, accessible uniquement à partir d’un test en cours d’exécution. Les classes utilitaires de test contiennent des méthodes qui peuvent être appelées par des méthodes de test pour effectuer des tâches utiles, telles que la configuration de données test. Les classes utilitaires de test sont exclues de la limitation en taille du code.

Pour ajouter la classe TestDataFactory, procédez comme suit :

  1. Dans la Developer Console, cliquez sur File (Fichier) | New (Nouveau) | Apex Class (Classe Apex), saisissez TestDataFactory comme nom de classe, puis cliquez sur OK (OK).
  2. Remplacez le corps de classe par défaut par ce qui suit :
    @isTest
    public class TestDataFactory {
      public static List<Account> createAccountsWithOpps(Integer numAccts, Integer numOppsPerAcct) {
        List<Account> accts = new List<Account>();
        for(Integer i=0;i<numAccts;i++) {
          Account a = new Account(Name='TestAccount' + i);
          accts.add(a);
        }
        insert accts;
        List<Opportunity> opps = new List<Opportunity>();
        for(Integer j=0;j<numAccts;j++) {
          Account acct = accts[j];
          // For each account just inserted, add opportunities
          for(Integer k=0;k<numOppsPerAcct;k++) {
            opps.add(new Opportunity(Name=acct.Name + ' Opportunity ' + k,
              StageName='Prospecting',
              CloseDate=System.today().addMonths(1),
              AccountId=acct.Id));
          }
        }
        // Insert all opportunities for all accounts.
        insert opps;
        return accts;
      }
    }

Cette classe utilitaire de test contient une méthode statique, createAccountsWithOpps(), qui accepte le nombre de comptes (contenu dans le paramètre numAccts) et le nombre d'opportunités associées à créer pour chaque compte (contenu dans le paramètre numOppsPerAcct). La première boucle de la méthode crée le nombre de comptes spécifié et les stocke dans la variable de liste accts. Après la première boucle, l'instruction DML insert() est appelée pour créer tous les comptes de la liste dans la base de données.

La deuxième boucle crée les opportunités. Puisque chaque groupe d'opportunités est lié à un compte, la boucle externe itère sur les comptes et inclut une boucle imbriquée qui crée des opportunités associées pour le compte en cours. Lors de l'exécution suivante de la boucle imbriquée, des opportunités sont ajoutées à la même liste en utilisant la méthode add(). Les opportunités sont liées à leur compte parent en utilisant le champ AccountId. Le nombre total d’opportunités créées est le produit du nombre d’opportunités par le nombre de comptes (numOppsPerAcct*numAccts). L'instruction DML insert() est ensuite appelée hors de la boucle afin de créer toutes les opportunités de la collecte de tous les comptes dans un seul appel.

Pour terminer, cette méthode renvoie la liste des nouveaux comptes.

Remarque

Même si cette méthode ne renvoie pas les opportunités associées, vous pouvez obtenir ces enregistrements en écrivant une requête SOQL qui utilise la relation existante entre Account (Compte) et Opportunity (Opportunité), telle que la requête utilisée dans le déclencheur de l’unité Test de déclencheurs Apex.

Appel de méthodes utilitaires pour la création de données test

Vous avez ajouté la classe utilitaire de test. Vous pouvez maintenant modifier la classe de test TestAccountDeletion pour l’exploiter. Le tableau renvoyé par l'appel TestDataFactory.createAccountsWithOpps(1,1) contient un sObject Account (Compte).

Voici la méthode de test modifiée. Il s’agit d’une version plus courte !

@isTest

private class TestAccountDeletion {

  @isTest

  static void TestDeleteAccountWithOneOpportunity() {

    // Test data setup

    // Create one account with one opportunity by calling a utility method

    Account[] accts = TestDataFactory.createAccountsWithOpps(1,1);

    // Perform test

    Test.startTest();

      Database.DeleteResult result = Database.delete(accts[0], false);

    Test.stopTest();

    // Verify that the deletion should have been stopped by the trigger,

    // so check that we got back an error.

    System.assert(!result.isSuccess());

    System.assert(result.getErrors().size() > 0);

    System.assertEquals('Cannot delete account with related opportunities.',

      result.getErrors()[0].getMessage());

  }

}

Test de différentes conditions

Une méthode de test n'est pas suffisante pour tester toutes les entrées possibles du déclencheur. Vous devez tester d'autres conditions, notamment la suppression d'un compte sans opportunité. Vous devez également tester les mêmes scénarios avec un grand nombre d'enregistrements au lieu d'un seul enregistrement. Voici une version mise à jour de la classe de test qui contient les trois méthodes de test supplémentaires. Enregistrez cette version mise à jour de la classe.

@isTest

private class TestAccountDeletion {

  @isTest

  static void TestDeleteAccountWithOneOpportunity() {

    // Test data setup

    // Create one account with one opportunity by calling a utility method

    Account[] accts = TestDataFactory.createAccountsWithOpps(1,1);

    // Perform test

    Test.startTest();

      Database.DeleteResult result = Database.delete(accts[0], false);

    Test.stopTest();

    // Verify that the deletion should have been stopped by the trigger,

    // so check that we got back an error.

    System.assert(!result.isSuccess());

    System.assert(result.getErrors().size() > 0);

    System.assertEquals('Cannot delete account with related opportunities.',

      result.getErrors()[0].getMessage());

  }

  @isTest

  static void TestDeleteAccountWithNoOpportunities() {

    // Test data setup

    // Create one account with no opportunities by calling a utility method

    Account[] accts = TestDataFactory.createAccountsWithOpps(1,0);

    // Perform test

    Test.startTest();

      Database.DeleteResult result = Database.delete(accts[0], false);

    Test.stopTest();

    // Verify that the deletion was successful

    System.assert(result.isSuccess());

  }

  @isTest

  static void TestDeleteBulkAccountsWithOneOpportunity() {

    // Test data setup

    // Create accounts with one opportunity each by calling a utility method

    Account[] accts = TestDataFactory.createAccountsWithOpps(200,1);

    // Perform test

    Test.startTest();

      Database.DeleteResult[] results = Database.delete(accts, false);

    Test.stopTest();

    // Verify for each record.

    // In this case the deletion should have been stopped by the trigger,

    // so check that we got back an error.

    for(Database.DeleteResult dr : results) {

      System.assert(!dr.isSuccess());

      System.assert(dr.getErrors().size() > 0);

      System.assertEquals('Cannot delete account with related opportunities.',

        dr.getErrors()[0].getMessage());

    }

  }

  @isTest

  static void TestDeleteBulkAccountsWithNoOpportunities() {

    // Test data setup

    // Create accounts with no opportunities by calling a utility method

    Account[] accts = TestDataFactory.createAccountsWithOpps(200,0);

    // Perform test

    Test.startTest();

      Database.DeleteResult[] results = Database.delete(accts, false);

    Test.stopTest();

    // For each record, verify that the deletion was successful

    for(Database.DeleteResult dr : results) {

      System.assert(dr.isSuccess());

    }

  }

}

Exécution de toutes les méthodes de test

La classe contient davantage de tests complets et a été revue pour générer des données test. La dernière étape consiste à exécuter des méthodes de test dans notre classe de test. Vous avez déjà exécuté les tests dans la classe TestAccountDeletion. Par conséquent, vous pouvez simplement réexécuter cette classe de test pour exécuter toutes ses méthodes de test.

  1. Pour réaliser la même exécution de test, cliquez sur l’onglet Tests, sélectionnez votre exécution test, puis cliquez sur Test (Tester) | Rerun (Exécuter à nouveau).
  2. Vérifiez les résultats sous l'onglet Tests en développant la dernière exécution de test. L’exécution du test doit indiquer que les quatre tests ont réussi !

Ressources

Formez-vous gratuitement !
Créez un compte pour continuer.
Qu’est-ce que vous y gagnez ?
  • Obtenez des recommandations personnalisées pour vos objectifs de carrière
  • Mettez en pratique vos compétences grâce à des défis pratiques et à des questionnaires
  • Suivez et partagez vos progrès avec des employeurs
  • Découvrez des opportunités de mentorat et de carrière