Skip to main content
Rejoignez-nous lors de l'événement TDX à San Francisco ou sur Salesforce+ les 5 et 6 mars pour la conférence des développeurs à l'ère des agents IA. Inscrivez-vous dès maintenant.

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 ? Commencez le défi dans un Trailhead Playground en français et utilisez les traductions fournies entre crochets pour naviguer. Copiez et collez uniquement les valeurs en anglais, car les validations de défi reposent sur les données en anglais. Si vous ne réussissez pas le défi dans votre organisation en français, nous vous recommandons (1) de définir le paramètre régional sur les États-Unis, (2) de définir la langue sur l’anglais en suivant les instructions ici, puis (3) de cliquer à nouveau sur le bouton « Vérifier le défi Â».

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

Défi pratique

+ 500 points

Préparez-vous

Vous allez effectuer ce(tte) unité dans votre propre organisation pratique. Cliquez sur Lancer pour commencer ou cliquez sur le nom de votre organisation pour en choisir une autre.

Votre défi

Create a Contact Test Factory
Create an Apex class that returns a list of contacts based on two incoming parameters: the number of contacts to generate and the last name, which is common to all contacts. Do not insert the generated contact records into the database.

NOTE: For the purposes of verifying this hands-on challenge, don't specify the @isTest annotation for either the class or the method, even though it's usually required.
  • Create an Apex class in the public scope
    • Name: RandomContactFactory (without the @isTest annotation)
  • Use a Public Static Method to consistently generate contacts with unique first names based on the iterated number in the format Test 0, Test 1, and so on
    • Method Name: generateRandomContacts (without the @isTest annotation)
    • Parameter 1: An integer that controls the number of contacts being generated with unique first names, such as Test 0 and Test 1
    • Parameter 2: A string containing the common last name of the contacts
    • Return Type: List<Contact>
Partagez vos commentaires sur Trailhead dans l'aide Salesforce.

Nous aimerions connaître votre expérience avec Trailhead. Vous pouvez désormais accéder au nouveau formulaire de commentaires à tout moment depuis le site d'aide Salesforce.

En savoir plus Continuer à partager vos commentaires