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 − 单击"运行测试"按钮,如图所示。
步骤 3 − 检查状态
步骤 4 − 现在检查我们为其编写测试的类和触发器
类
触发器
我们的测试成功并完成。