Apex - Test

Les tests font partie intégrante d'Apex ou de tout autre développement d'application. Dans Apex, nous avons des classes de test distinctes à développer pour tous les tests unitaires.

Classes de test

Dans SFDC, le code doit avoir une couverture de code de 75% pour être déployé en production. Cette couverture de code est effectuée par les classes de test. Les classes de test sont les extraits de code qui testent les fonctionnalités d'autres classes Apex.

Écrivons une classe de test pour l'un de nos codes que nous avons écrit précédemment. Nous écrirons une classe de test pour couvrir notre code de classe Trigger et Helper. Vous trouverez ci-dessous la classe de déclencheur et d'assistance qui doit être couverte.

// 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
   }
}

Créer une classe de test

Dans cette section, nous allons comprendre comment créer une classe de test.

Création de données

Nous devons créer des données pour la classe de test dans notre classe de test elle-même. La classe de test par défaut n'a pas accès aux données de l'organisation, mais si vous définissez @isTest (voirAllData = true), elle aura également accès aux données de l'organisation.

Annotation @isTest

En utilisant cette annotation, vous avez déclaré qu'il s'agissait d'une classe de test et qu'elle ne sera pas comptabilisée dans la limite de code totale de l'organisation.

Mot clé testMethod

Les méthodes de test unitaire sont les méthodes qui ne prennent pas d'arguments, ne livrent aucune donnée dans la base de données, n'envoient aucun e-mail et sont déclarées avec le mot clé testMethod ou l'annotation isTest dans la définition de méthode. En outre, les méthodes de test doivent être définies dans des classes de test, c'est-à-dire des classes annotées avec isTest.

Nous avons utilisé la méthode de test «myUnitTest» dans nos exemples.

Test.startTest () et Test.stopTest ()

Voici les méthodes de test standard disponibles pour les classes de test. Ces méthodes contiennent l'événement ou l'action pour lequel nous simulerons notre test. Comme dans cet exemple, nous allons tester notre classe de déclencheur et d'assistance pour simuler le déclencheur d'incendie en mettant à jour les enregistrements comme nous l'avons fait pour démarrer et arrêter le bloc. Cela fournit également une limite de gouverneur distincte au code qui est dans le bloc de démarrage et d'arrêt.

System.assert ()

Cette méthode vérifie la sortie souhaitée avec le réel. Dans ce cas, nous nous attendons à ce qu'un enregistrement de facture soit inséré, nous avons donc ajouté assert pour vérifier la même chose.

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
   }
}

Exécution de la classe de test

Suivez les étapes ci-dessous pour exécuter la classe de test -

Step 1 - Allez dans les classes Apex ⇒ cliquez sur le nom de la classe 'CustomerTriggerTestClass'.

Step 2 - Cliquez sur le bouton Exécuter le test comme indiqué.

Step 3 - Vérifier l'état

Step 4 - Vérifiez maintenant la classe et le déclencheur pour lesquels nous avons écrit le test

Classe

Déclencheur

Nos tests sont réussis et terminés.