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
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 :
- 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). - 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.
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.
- 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).
- 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