Erstellen von Testdaten für Apex-Tests
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Erstellen einer Test-Dienstprogrammklasse
- Verwenden einer Test-Dienstprogrammklasse zum Einrichten von Testdaten für verschiedene Testfälle
- Ausführen aller Testmethoden in einer Klasse
Erstellen von Testdaten für Apex-Tests
Fügen Sie mithilfe von Test-Dienstprogrammklassen wiederverwendbare Methoden zur Einrichtung von Testdaten hinzu.
Voraussetzungen
Sofern nicht bereits geschehen, arbeiten Sie die Voraussetzungen im vorherigen Abschnitt Testen von Apex-Auslösern ab.
Hinzufügen einer Test-Dienstprogrammklasse
Gestalten Sie die vorherige Testmethode um, indem Sie die Erstellung von Testdaten durch einen Aufruf an eine Dienstprogrammklassen-Methode ersetzen. Als Erstes müssen Sie die Test-Dienstprogrammklasse erstellen.
Die Klasse TestDataFactory
ist eine spezielle Art von Klasse. Es handelt sich um eine öffentliche Klasse, die mit der Anmerkung @isTest
gekennzeichnet ist und auf die nur in einem laufenden Test zugegriffen werden kann. Test-Dienstprogrammklassen enthalten Methoden, die von Testmethoden aufgerufen werden können, um nützliche Aufgaben auszuführen, wie etwa das Einrichten von Testdaten. Test-Dienstprogrammklassen sind von der für die Organisation geltenden Obergrenze für die Codegröße ausgenommen.
So fügen Sie die TestDataFactory
-Klasse hinzu:
- Klicken Sie in der Developer Console auf File (Datei) | New (Neu) | Apex Class (Apex-Klasse) und geben Sie als Klassennamen
TestDataFactory
ein. Klicken Sie dann auf OK. - Ersetzen Sie den Standardtext der Klasse durch Folgendes:
@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; } }
Diese Test-Dienstprogrammklasse enthält eine statische Methode, createAccountsWithOpps()
, die die Anzahl der Accounts (enthalten im Parameter numAccts
) und die Anzahl der verknüpften Opportunities (enthalten im Parameter numOppsPerAcct
), die für jeden Account erstellt werden sollen, akzeptiert. Die erste Schleife in der Methode erstellt die angegebene Anzahl an Accounts und speichert sie in der Listenvariablen accts
. Nach der ersten Schleife wird die DML-Anweisung insert()
aufgerufen, um alle Accounts in der Liste in der Datenbank zu erstellen.
Mit der zweiten Schleife werden die Opportunities erstellt. Da jede Gruppe von Opportunities mit einem Account verknüpft ist, durchläuft die äußere Schleife Accounts und enthält eine geschachtelte Schleife, mit der verknüpfte Opportunities für den aktuellen Account erstellt werden. Bei der nächsten Ausführung der geschachtelten Schleife werden Opportunities mithilfe der Methode add()
zur selben Liste hinzugefügt. Opportunities werden über das Feld AccountId
mit ihrem übergeordneten Account verknüpft. Die Gesamtanzahl aller erstellten Opportunities ist das Produkt der Anzahl der Opportunities und der Anzahl der Accounts (numOppsPerAcct
x numAccts
). Als Nächstes wird die DML-Anweisung insert()
auf effiziente Weise außerhalb der Schleife aufgerufen, um alle Opportunities in der Sammlung für alle Accounts in nur einem Aufruf zu erstellen.
Zum Schluss gibt diese Methode eine Liste der neuen Accounts zurück.
Aufrufen von Dienstprogrammmethoden für die Erstellung von Testdaten
Nachdem Sie die Test-Dienstprogrammklasse hinzugefügt haben, ändern Sie als Nächstes die Testklasse TestAccountDeletion
, um diese Klasse zu nutzen. Das vom Aufruf TestDataFactory.createAccountsWithOpps(1,1)
zurückgegebene Array enthält ein Account-sObject.
Die geänderte Testmethode sieht wie folgt aus. Dies ist eine kürzere Version!
@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()); } }
Testen auf unterschiedliche Bedingungen
Eine Testmethode reicht nicht aus, um alle möglichen Eingaben für den Auslöser zu testen. Es müssen einige andere Bedingungen getestet werden, z. B. wann ein Account ohne Opportunities gelöscht wird. Außerdem müssen dieselben Szenarien mit einer großen Anzahl von Datensätzen statt nur einem einzigen Datensatz getestet werden. Nachstehend ist eine aktualisierte Version der Testklasse aufgeführt, die die drei zusätzlichen Testmethoden enthält. Speichern Sie diese aktualisiert Version der Klasse.
@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()); } } }
Ausführen aller Testmethoden
Jetzt, da die Testklasse umfassendere Tests enthält und so umgestaltet wurde, dass sie eine Testdaten-Factory verwendet, besteht der letzte Schritt darin, die Testmethoden in unserer Testklasse auszuführen. Da Sie die Tests bereits in der Klasse TestAccountDeletion
ausgeführt haben, können Sie diese Testklasse einfach erneut ausführen, um alle ihre Testmethoden auszuführen.
- Um denselben Testlauf auszuführen, klicken Sie auf die Registerkarte Tests und wählen Sie Ihren Testlauf aus. Klicken Sie dann auf Test | Rerun (Erneut ausführen).
- Überprüfen Sie die Ergebnisse auf der Registerkarte "Tests", indem Sie den letzten Testlauf erweitern. Für den Testlauf sollte angegeben werden, dass alle vier Tests bestanden wurden.
Ressourcen