Apex - Teste

O teste é parte integrante do Apex ou de qualquer outro desenvolvimento de aplicativo. No Apex, temos classes de teste separadas para desenvolver para todos os testes de unidade.

Classes de Teste

No SFDC, o código deve ter 75% de cobertura de código para ser implantado na produção. Essa cobertura de código é realizada pelas classes de teste. As classes de teste são fragmentos de código que testam a funcionalidade de outra classe do Apex.

Vamos escrever uma classe de teste para um de nossos códigos que escrevemos anteriormente. Vamos escrever uma classe de teste para cobrir nosso código de classe Trigger e Helper. Abaixo está a classe de gatilho e auxiliar que precisa ser coberta.

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

Criando classe de teste

Nesta seção, vamos entender como criar uma classe de teste.

Criação de Dados

Precisamos criar dados para a classe de teste em nossa própria classe de teste. A classe de teste por padrão não tem acesso aos dados da organização, mas se você definir @isTest (seeAllData = true), ela terá acesso aos dados da organização também.

anotação @isTest

Ao usar essa anotação, você declarou que esta é uma classe de teste e não será contabilizada no limite total de código da organização.

palavra-chave testMethod

Os métodos de teste de unidade são os métodos que não aceitam argumentos, não confirmam dados no banco de dados, não enviam e-mails e são declarados com a palavra-chave testMethod ou a anotação isTest na definição do método. Além disso, os métodos de teste devem ser definidos em classes de teste, ou seja, classes anotadas com isTest.

Usamos o método de teste 'myUnitTest' em nossos exemplos.

Test.startTest () e Test.stopTest ()

Estes são os métodos de teste padrão que estão disponíveis para aulas de teste. Esses métodos contêm o evento ou ação para o qual estaremos simulando nosso teste. Como neste exemplo, testaremos nossa classe de gatilho e auxiliar para simular o gatilho de fogo atualizando os registros como fizemos para iniciar e parar o bloco. Isso também fornece um limite de governador separado para o código que está no bloco de início e parada.

System.assert ()

Este método verifica a saída desejada com o real. Neste caso, esperamos que um registro de Nota Fiscal seja inserido, então adicionamos assert para verificar o mesmo.

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

Executando a classe de teste

Siga as etapas fornecidas abaixo para executar a classe de teste -

Step 1 - Vá para as classes do Apex ⇒ clique no nome da classe 'CustomerTriggerTestClass'.

Step 2 - Clique no botão Executar teste, conforme mostrado.

Step 3 - Verifique o status

Step 4 - Agora verifique a classe e o gatilho para o qual escrevemos o teste

Classe

Desencadear

Nosso teste foi concluído com sucesso.