Salesforce: обход ограничений регулятора в тестовых классах по всем направлениям

Я не смог получить какую-либо достоверную информацию об этой проблеме в Интернете. Но я думаю, что это должна быть проблема, которая должна затрагивать многих людей.

По сути, я написал простой триггер и тестовый класс в песочнице, протестировал его и, когда все было в порядке, развернул его в PRD.

Сначала я попробовал режим проверки и получил эту ошибку.

System.LimitException: Слишком много запросов SOQL: 101

Было показано, что эта ошибка возникает в каком-то другом тестовом классе. Итак, я чувствую, что тестовые случаи в моем триггере выполнялись, и это в сочетании с оставшимися тестовыми примерами каким-то образом превысило предел.

Таким образом, общее количество запросов SOQL в наших модульных тестах должно быть меньше 100. Это немного сложно соблюдать, верно? Я могу себе представить, что с таким количеством тестовых случаев нам наверняка понадобится более 100 запросов.

Так как же избежать превышения этого предела, поскольку Salesforce выполняет все тестовые случаи при развертывании даже одной строки кода.

У меня нет обычных подозреваемых... таких как SOQL в цикле for.

ОБНОВЛЕНИЕ: 19 августа 2012 г.: сейчас я публикую исходный код тестового класса и триггера

Тестовый класс:

@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.');
        }
    }   

}

Не могли бы вы поделиться своими мыслями?

Спасибо,

Кальвин


person Richard N    schedule 17.08.2012    source источник
comment
Вы получаете это сообщение об ошибке, потому что один из ваших тестовых классов (не все!) превышает лимит регулятора. В сообщении об ошибке вы можете увидеть имя класса. Разместите здесь код этого класса, чтобы мы могли его проверить.   -  person mast0r    schedule 17.08.2012
comment
На самом деле показанный класс - это класс, который находится в PRD, и в настоящее время тестовые примеры работают нормально. Как Джон ответил ниже, возможно, это произошло из-за того, что я не использовал startTest() и stopTest(), чтобы заключить свой код в тестовый класс.   -  person Richard N    schedule 18.08.2012


Ответы (2)


Было бы полезно увидеть некоторые из ваших тестовых классов, но важно отметить, что вам нужно использовать методы Test.startTest() и Test.stopTest(). Идея состоит в том, что любые запросы или операции DML, которые вы выполняете для настройки теста, должны быть отключены до метода Test.startTest(). Затем при тестировании вашего кода, например при выполнении метода, который вы тестируете, делайте это между вызовами метода start и stop.

Это дает контекст модульного теста. Что в основном будет игнорировать любые dml или запросы, выполненные вне вашего запуска и остановки тестирования, и будет учитывать только то, что происходит между ними как часть вашего теста. В противном случае весь код настройки и фактический тестовый код считаются частью одного и того же контекста и, таким образом, подлежат учету в пределах ограничений.

Эта ссылка должна пролить дополнительный свет на эту тему: http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods< /а>

person John De Santiago    schedule 17.08.2012
comment
Конечно, это то, что мне недавно предложили. Я добавлю эти два утверждения в свой тестовый класс. Спасибо. - person Richard N; 18.08.2012
comment
Привет, Джон, я добавил эти утверждения в свой тестовый класс, и это не помогло. Теперь я разместил тестовый класс и код триггера в своем исходном сообщении выше. - person Richard N; 20.08.2012
comment
Отметить как ответ. Используя IDE force.com, я смог выяснить проблему в другом классе. Я использовал starttest и stoptest в соответствующем месте. - person Richard N; 22.08.2012

Еще одна вещь, о которой следует помнить, — это SOQL, который вы выполняете в своем цикле for. Вы можете создать список и сохранить результаты своего запроса перед циклом. Таким образом, вы не столкнетесь с проблемой ограничений регулятора, поскольку вы используете только один оператор SOQL для каждой транзакции.

person JeyJim    schedule 29.08.2012
comment
Да, это первое, что я проверяю, прежде чем приступить к поиску других ошибок в кодировании. - person Richard N; 29.08.2012
comment
Спасибо, Ричардс..! Вы можете проверить этот вопрос? Спасибо !! stackoverflow.com/q/12183564/1633936 - person JeyJim; 29.08.2012
comment
Я ответил ... дайте мне знать, если вам нужна дополнительная помощь. - person Richard N; 30.08.2012