Apex - Test

Il test è la parte integrante di Apex o di qualsiasi altro sviluppo di applicazioni. In Apex, abbiamo classi di test separate da sviluppare per tutti i test unitari.

Classi di prova

In SFDC, il codice deve avere una copertura di codice del 75% per essere distribuito in produzione. Questa copertura del codice viene eseguita dalle classi di test. Le classi di test sono frammenti di codice che testano la funzionalità di altre classi Apex.

Scriviamo una classe di test per uno dei nostri codici che abbiamo scritto in precedenza. Scriveremo una classe di test per coprire il codice della nostra classe Trigger e Helper. Di seguito è riportato il trigger e la classe di supporto che devono essere coperti.

// Trigger with Helper Class
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   CustomerTriggerHelper.createInvoiceRecords(Trigger.new, trigger.oldMap);
      //Trigger calls the helper class and does not have any code in Trigger
}

// Helper Class:
public class CustomerTriggerHelper {
   public static void createInvoiceRecords (List<apex_customer__c>
      
      customerList, Map<id, apex_customer__c> oldMapCustomer) {
      List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
      
      for (APEX_Customer__c objCustomer: customerList) {
         if (objCustomer.APEX_Customer_Status__c == 'Active' &&
            oldMapCustomer.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
            
            // condition to check the old value and new value
            APEX_Invoice__c objInvoice = new APEX_Invoice__c();
            objInvoice.APEX_Status__c = 'Pending';
            objInvoice.APEX_Customer__c = objCustomer.id;
            InvoiceList.add(objInvoice);
         }
      }
      insert InvoiceList;  // DML to insert the Invoice List in SFDC
   }
}

Creazione della classe di test

In questa sezione capiremo come creare una classe di test.

Creazione dei dati

Abbiamo bisogno di creare dati per la classe di test nella nostra stessa classe di test. La classe di test per impostazione predefinita non ha accesso ai dati dell'organizzazione, ma se si imposta @isTest (seeAllData = true), avrà accesso anche ai dati dell'organizzazione.

Annotazione @isTest

Utilizzando questa annotazione, hai dichiarato che questa è una classe di test e non verrà conteggiata nel limite di codice totale dell'organizzazione.

parola chiave testMethod

I metodi di unit test sono i metodi che non accettano argomenti, non inviano dati al database, non inviano messaggi di posta elettronica e sono dichiarati con la parola chiave testMethod o l'annotazione isTest nella definizione del metodo. Inoltre, i metodi di test devono essere definiti nelle classi di test, ovvero le classi annotate con isTest.

Abbiamo utilizzato il metodo di test "myUnitTest" nei nostri esempi.

Test.startTest () e Test.stopTest ()

Questi sono i metodi di test standard disponibili per le classi di test. Questi metodi contengono l'evento o l'azione per cui simuleremo il nostro test. Come in questo esempio, testeremo la nostra classe di trigger e helper per simulare l'attivazione del fuoco aggiornando i record come abbiamo fatto per avviare e interrompere il blocco. Questo fornisce anche un limite governor separato al codice che si trova nel blocco di avvio e arresto.

System.assert ()

Questo metodo controlla l'output desiderato con l'effettivo. In questo caso, ci aspettiamo che venga inserito un record di fattura, quindi abbiamo aggiunto assert per controllare lo stesso.

Example

/**
* This class contains unit tests for validating the behavior of Apex classes
* and triggers.
*
* Unit tests are class methods that verify whether a particular piece
* of code is working properly. Unit test methods take no arguments,
* commit no data to the database, and are flagged with the testMethod
* keyword in the method definition.
*
* All test methods in an organization are executed whenever Apex code is deployed
* to a production organization to confirm correctness, ensure code
* coverage, and prevent regressions. All Apex classes are
* required to have at least 75% code coverage in order to be deployed
* to a production organization. In addition, all triggers must have some code coverage.
*
* The @isTest class annotation indicates this class only contains test
* methods. Classes defined with the @isTest annotation do not count against
* the organization size limit for all Apex scripts.
*
* See the Apex Language Reference for more information about Testing and Code Coverage.
*/

@isTest
private class CustomerTriggerTestClass {
   static testMethod void myUnitTest() {
      //Create Data for Customer Objet
      APEX_Customer__c objCust = new APEX_Customer__c();
      objCust.Name = 'Test Customer';
      objCust.APEX_Customer_Status__c = 'Inactive';
      insert objCust;
      
      // Now, our trigger will fire on After update event so update the Records
      Test.startTest();    // Starts the scope of test
      objCust.APEX_Customer_Status__c = 'Active';
      update objCust;
      Test.stopTest();     // Ends the scope of test
      
      // Now check if it is giving desired results using system.assert
      // Statement.New invoice should be created
      List<apex_invoice__c> invList = [SELECT Id, APEX_Customer__c FROM
         APEX_Invoice__c WHERE APEX_Customer__c = :objCust.id];
      system.assertEquals(1,invList.size());
      // Check if one record is created in Invoivce sObject
   }
}

Esecuzione della classe di prova

Seguire i passaggi indicati di seguito per eseguire la classe di test:

Step 1 - Vai alle classi Apex ⇒ fai clic sul nome della classe "CustomerTriggerTestClass".

Step 2 - Fare clic sul pulsante Esegui test come mostrato.

Step 3 - Controlla lo stato

Step 4 - Ora controlla la classe e il trigger per cui abbiamo scritto il test

Classe

Trigger

Il nostro test ha esito positivo e completato.