Apex - 测试

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

测试类

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

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

// 使用辅助类触发
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   CustomerTriggerHelper.createInvoiceRecords(Trigger.new, trigger.oldMap);
      //Trigger调用辅助类,并且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') {
            
            // 检查旧值和新值的条件
            APEX_Invoice__c objInvoice = new APEX_Invoice__c();
            objInvoice.APEX_Status__c = 'Pending';
            objInvoice.APEX_Customer__c = objCustomer.id;
            InvoiceList.add(objInvoice);
         }
      }
      insert InvoiceList;  // 在 SFDC 中插入账单列表的 DML
   }
}

创建测试类

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

数据创建

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

@isTest 注解

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

testMethod 关键字

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

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

Test.startTest() 和 Test.stopTest()

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

System.assert()

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

示例

/**
* 此类包含用于验证 Apex 类和触发器行为的单元测试。
*
* 单元测试是验证特定代码段是否正常工作的类方法。 单元测试方法不带参数,
* 不向数据库提交任何数据,并在方法定义中使用 testMethod 关键字进行标记。
*
* 每当 Apex 代码部署到生产组织时,都会执行组织中的所有测试方法,以确认正确性、确保代码覆盖率并防止回归。 所有 Apex 类都需要具有至少 75% 的代码覆盖率才能部署到生产组织。 此外,所有触发器都必须具有一定的代码覆盖率。
*
* @isTest 类注释表示该类仅包含测试方法。 使用 @isTest 注释定义的类不计入所有 Apex 脚本的组织大小限制。
*
* 有关测试和代码覆盖率的更多信息,请参阅 Apex 语言参考。
*/

@isTest
private class CustomerTriggerTestClass {
   static testMethod void myUnitTest() {
      //为客户对象创建数据
      APEX_Customer__c objCust = new APEX_Customer__c();
      objCust.Name = 'Test Customer';
      objCust.APEX_Customer_Status__c = 'Inactive';
      insert objCust;
      
      // 现在,我们的触发器将在更新事件后触发,因此更新记录
      Test.startTest();    // Starts the scope of test
      objCust.APEX_Customer_Status__c = 'Active';
      update objCust;
      Test.stopTest();     // Ends the scope of test
      
      // 现在使用 system.assert 检查它是否给出了所需的结果
      // Statement. 应创建新账单
      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());
      // 检查 Invoivce sObject 中是否创建了一条记录
   }
}

运行测试类

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

步骤 1 − 转到 Apex classes ⇒,单击类名"CustomerTriggerTestClass"。

步骤 2 − 单击"运行测试"按钮,如图所示。

Apex 测试步骤 1

步骤 3 − 检查状态

Apex 测试步骤2

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

Apex 测试步骤3

触发器

Apex 测试步骤4

我们的测试成功并完成。