Skip to main content

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
Hinweis

Hinweis

Lernen Sie auf Deutsch? In diesem Badge ist für die praktischen Trailhead-Aufgaben Englisch als Bearbeitungssprache festgelegt. Übersetzungen werden zur Referenz in Klammern angegeben. Stellen Sie sicher, dass Sie die englischen Werte kopieren und einfügen und stellen Sie die Sprache Ihres Trailhead Playgrounds auf "English (Englisch)" und das Gebietsschema auf "United States (USA)" um. Die zugehörigen Anweisungen finden Sie hier.

Im Badge "Trailhead in Ihrer Sprache" erfahren Sie, wie Sie die übersetzte Trailhead-Umgebung nutzen.

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:

  1. 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.
  2. 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.

Hinweis

Diese Methode gibt zwar nicht die verknüpften Opportunities zurück, Sie können diese Datensätze jedoch abrufen, indem Sie eine SOQL-Abfrage schreiben, die die bestehende Beziehung zwischen Account und Opportunity verwendet, wie die in dem Auslöser unter Testen von Apex-Auslösern verwendete Abfrage.

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.

  1. 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).
  2. Ü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

Lernen Sie weiter kostenlos!
Registrieren Sie sich für einen Account, um fortzufahren.
Was ist für Sie drin?
  • Holen Sie sich personalisierte Empfehlungen für Ihre Karriereplanung
  • Erproben Sie Ihre Fähigkeiten mithilfe praktischer Aufgaben und Quizze
  • Verfolgen Sie Ihre Fortschritte nach und teilen Sie sie mit Arbeitgebern
  • Nutzen Sie Mentoren und Karrierechancen