Apex - 测试


测试是 Apex 或任何其他应用程序开发的集成部分。在 Apex 中,我们为所有单元测试开发单独的测试类。

测试班

在 SFDC 中,代码必须具有 75% 的代码覆盖率才能部署到生产。此代码覆盖率由测试类执行。测试类是测试其他 Apex 类的功能的代码片段。

让我们为之前编写的代码之一编写一个测试类。我们将编写测试类来覆盖我们的触发器和帮助器类代码。下面是需要涵盖的触发器和辅助类。

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

创建测试类

在本节中,我们将了解如何创建测试类。

数据创建

我们需要在测试类本身中为测试类创建数据。默认情况下,测试类无权访问组织数据,但如果设置 @isTest(seeAllData = true),那么它将也有权访问组织数据。

@isTest注释

通过使用此注释,您声明这是一个测试类,并且它不会计入组织的总代码限制。

测试方法关键字

单元测试方法是不带参数、不向数据库提交数据、不发送电子邮件,并且在方法定义中使用 testMethod 关键字或 isTest 注释进行声明的方法。另外,测试方法必须定义在测试类中,即使用 isTest 注解的类中。

我们在示例中使用了“myUnitTest”测试方法。

Test.startTest() 和 Test.stopTest()

这些是可用于测试类的标准测试方法。这些方法包含我们将模拟测试的事件或操作。就像在这个例子中一样,我们将测试我们的触发器和辅助类,通过更新记录来模拟火灾触发器,就像我们启动和停止块一样。这还为启动和停止块中的代码提供了单独的调节器限制。

系统断言()

此方法检查所需输出与实际输出。在本例中,我们期望插入发票记录,因此我们添加了断言来检查相同的记录。

例子

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

运行测试类

按照下面给出的步骤运行测试类 -

步骤 1 - 转到 Apex 类 ⇒ 单击类名称“CustomerTriggerTestClass”。

步骤 2 - 单击“运行测试”按钮,如图所示。

顶点测试步骤1

步骤 3 - 检查状态

顶点测试步骤2

步骤 4 - 现在检查我们为其编写测试的类和触发器

班级

顶点测试步骤3

扳机

顶点测试步骤4

我们的测试成功并完成。