当前位置: 首页 > 知识库问答 >
问题:

Salesforce:全面避免测试类中的调速器限制

谭献
2023-03-14

我在网上找不到任何关于这个问题的可靠信息。但我认为这一定是一个影响很多人的问题。

基本上,我在沙盒中编写了一个简单的触发器和测试类,并对其进行了测试,当一切正常时,我将其部署到PRD。

我先尝试了验证模式,我得到了这个错误。

系统LimitException:SOQL查询太多:101

此错误显示在其他一些测试类中发生。所以我觉得触发器中的测试用例运行了,而这与剩余的测试用例一起不知何故超出了限制。

因此,单元测试中的SOQL查询总数必须少于100。这有点难,对吧?我可以想象,有这么多测试用例,我们肯定需要100多个查询。

那么,由于Salesforce在部署哪怕是一行代码时都会运行所有测试用例,因此有什么方法可以避免达到这一限制呢。

我没有任何常见的嫌疑人...比如for循环中的SOQL。

更新:2012年8月19日:我现在发布测试类和触发器的源代码

测试等级:

@isTest

私有类TestAccountDuplicateWebsiteTrigger{

static testMethod void myUnitTest() {
    try{
    // TO DO: implement unit test
    Test.startTest();
    Account a1;      
    a1 = new Account();
    a1.name = 'GMSTest';    
    a1.Website = 'www.test.com';            



    Account a2;      
    a2 = new Account();
    a2.name = 'GMSTest2';   
    a2.Website = 'www.test.com';            


    Account a3;      
    a3 = new Account();
    a3.name = 'GMSTest3';   
    a3.Website = 'www.test1.com';           


    insert a1;
    insert a2;
    //insert a3;
    Test.stopTest(); 


    }
    catch (Exception e)
    {
    }

}

}

触发

trigger osv_unique_website_for_account on Account (before insert, before update) {  

    //Map which has no duplicates with website as the key
    Map<String, Account> accountMap = new Map<String, Account>();

    for (Account account: System.Trigger.new)
    {
        //Ensure that during an update, if an website does not change - it should not be treated as a duplicate
        if ((account.Website != null) && (System.Trigger.isInsert ||            
            (account.Website != System.Trigger.oldMap.get(account.Id).Website))) 
            {
                //check for duplicates among the new accounts in case of a batch
                 if (accountMap.containsKey(account.Website)) 
                 {
                    account.Website.addError('Cannot save account. Website already exists.');
                 } 
                 else 
                 {
                    accountMap.put(account.Website, account);
                 }

            }       
    }

    //Now map containing new account websites has been created. 
    //Check them against the account websites that ALREADY EXIST in salesforce. If website exists, display error.
    for (Account account : [SELECT Website FROM Account WHERE Website IN :accountMap.KeySet()]) 
    {
        Account newAccount = accountMap.get(Account.Website);
        if (newAccount!=null)
        {
            newAccount.Website.addError('Cannot save account. Website already exists.');
        }
    }   

}

你能分享一下你的想法吗?

谢谢,

加尔文

共有2个答案

云瑞
2023-03-14

另一件需要记住的事情是在for循环中执行的SOQL。您可以在循环之前创建列表并存储查询结果。。这样,您就不会面临调速器限制的问题,因为每个事务只使用一条SOQL语句。

彭博厚
2023-03-14

查看一些测试类会有所帮助,但需要注意的一件重要事情是,您需要使用Test.startTest()和Test.stopTest()方法。这个想法是,您为设置测试所做的任何查询或DML操作都应该在Test.startTest()方法之前关闭。然后在测试代码(例如执行您正在测试的方法)时,在开始和停止方法调用之间这样做。

这提供了单元测试上下文。这基本上会忽略在开始和停止测试之外进行的任何dml或查询,并且只计算在这两个测试之间发生的事情作为测试的一部分。否则,所有设置代码和实际测试代码都被视为同一上下文的一部分,因此应计入限值。

此链接应该可以为该主题提供更多信息:http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods

 类似资料:
  • 大家好, 我正在尝试为我帮助编写的触发器编写一个测试类。触发器使用名为trigger\u help\u c的字段,该字段是通过添加opportunity Type和Account ID派生的公式字段,如果在过去90天内已在该帐户上创建了该类型的opportunity,则在插入之前激发。除非配置文件是系统管理员。这是我的触发器: 我在写测试课时遇到了困难,我像往常一样不知所措。我写了以下内容,但我不

  • 下面是我的顶点触发器。我是一名初学者,正在尝试编写其测试类,但不断出现错误“System.DmlException:Insert失败。第0行出现第一个异常;第一个错误:REQUIRED\u FIELD\u MISSING,错误:只有在产品相关列表上为此opportunity选择了价格手册,才能选择产品。:[]”。 在Opportunity上触发TrgrOptyHighestCustmorePric

  • 我试图使用testng并行运行测试,但我的配置有一些问题。 我有一个包含许多类文件的项目,每个类文件包含许多测试。 我目前正在使用parallel='methods'标志运行测试,以最大化在给定时间运行的测试数量。 我的目标是避免同一类的测试同时运行,同时最大化并行测试的数量。 因此,给定一个示例xml文件: 给定40个可用线程,我希望在任何给定时间运行40个测试。 我使用了一个方法拦截器来随机化

  • 下面是一个helper函数的代码 基本上,此方法只需使用HttpRequest和HttpResponse调用endpointURL,endpointURL是web服务,在参数中指定的超时之后,它将只返回200。 现在的问题是,我需要编写一个测试用例来涵盖这个方法,但我不知道如何编写它。。我不知道如何正确模拟httpcallout,因为此方法不返回HttpResponse,而且由于代码现在已冻结,我

  • 问题内容: 我正在设置将使用Redis和APCu的PHP标记的缓存实现。由于APC是键值存储,因此我将使用Redis进行键标记关系,并与APC上的每个Web服务器进行同步。 我当前的问题仅涉及Redis。可能您知道实现,但需要明确说明:键可以具有与之关联的标签。在以后的某个时间点,您可以通过某些标签删除缓存的密钥。有很多键,但没有那么多标签,并且键和标签之间存在n对n的关系。 由组成: 因为设置后

  • 我已在Salesforce APEX中记录了触发器。它工作正常。 触发器代码为: 现在我正在尝试为它的测试类编写代码。它在线上给出错误,说对象无法解析为字符串。 测试等级代码为: 期待找到解决方案。任何帮助都将不胜感激。 谢谢