2012-08-17 19 views
5

मुझे इस मुद्दे के बारे में ऑनलाइन कोई विश्वसनीय जानकारी प्राप्त नहीं हुई है। लेकिन मुझे लगता है कि यह एक मुद्दा होना चाहिए जो बहुत से लोगों को प्रभावित करेगा।सेल्सफोर्स: बोर्ड भर में टेस्ट कक्षाओं में गवर्नर सीमा से बचें

असल में मैंने सैंडबॉक्स में एक साधारण ट्रिगर और टेस्ट क्लास लिखा, इसका परीक्षण किया और जब यह ठीक था तो मैंने इसे पीआरडी में तैनात किया।

मैंने पहले सत्यापन मोड की कोशिश की और मुझे यह त्रुटि मिली।

System.LimitException: बहुत सारे SOQL प्रश्नों: 101

यह त्रुटि कुछ अन्य परीक्षण वर्ग में होते दिखाया गया था। तो मुझे लगता है कि मेरे ट्रिगर में परीक्षण के मामले भाग गए और शेष परीक्षण मामलों के साथ-साथ सीमा को खत्म कर दिया गया।

तो हमारे यूनिट परीक्षणों में SOQL क्वेरी की कुल संख्या 100 से कम होनी चाहिए। यह सही करने के लिए थोड़ा मुश्किल है? मैं कई परीक्षण मामलों के साथ कल्पना कर सकता हूं, निश्चित रूप से हमें 100 से अधिक प्रश्नों की आवश्यकता होगी।

तो इस सीमा को मारने से बचने के तरीके क्या हैं क्योंकि सेल्सफोर्स कोड की एक पंक्ति को तैनात करते समय सभी परीक्षण मामलों को चलाता है।

मेरे पास सामान्य सामान्य संदेह नहीं है ... जैसे लूप के लिए SOQL की तरह।

अद्यतन: 2012/08/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.'); 
     } 
    } 

}

आप अपने विचारों को साझा सकते हैं?

धन्यवाद,

केल्विन

+0

आपको यह त्रुटि संदेश मिल गया क्योंकि आपके टेस्ट क्लास में से एक (उन सभी में से नहीं!) राज्यपाल सीमा से अधिक है। त्रुटि संदेश में आप कक्षा का नाम देख सकते हैं। उस कक्षा का कोड यहां पोस्ट करें ताकि हम इसे देख सकें। – mast0r

+0

वास्तव में दिखाया जा रहा वर्ग एक वर्ग है जो पीआरडी में है और वर्तमान में परीक्षण के मामले ठीक काम कर रहे हैं। जैसा कि जॉन ने नीचे उत्तर दिया था, ऐसा इसलिए हुआ क्योंकि मैंने टेस्ट क्लास में अपना कोड संलग्न करने के लिए स्टार्टटेस्ट() और स्टॉपटेस्ट() का उपयोग नहीं किया था। –

उत्तर

10

यह अपने परीक्षण कक्षाओं लेकिन नोट करने के लिए एक महत्वपूर्ण बात यह है कि आप Test.startTest() और Test.stopTest को उपयोग करने के लिए की जरूरत है में से कुछ देखने के लिए मदद मिलेगी() तरीकों। विचार यह है कि आपके परीक्षण को सेट करने के लिए आप जो भी प्रश्न या डीएमएल ऑपरेशन करते हैं, टेस्ट.स्टार्टटेस्ट() विधि से पहले होना चाहिए। फिर जब आपके कोड का परीक्षण करते हैं जैसे किसी विधि को निष्पादित करने के लिए आप परीक्षण कर रहे हैं तो स्टार्ट और स्टॉप विधि कॉल के बीच ऐसा करें।

यह इकाई परीक्षण संदर्भ देता है। जो आपकी शुरुआत के बाहर किए गए किसी भी डीएमएल या प्रश्नों को मूल रूप से अनदेखा कर देगा और परीक्षण को रोक देगा और केवल आपके परीक्षण के हिस्से के बीच में क्या होता है इसकी गणना करें। अन्यथा सभी सेटअप कोड और वास्तविक परीक्षण कोड सभी को एक ही संदर्भ का हिस्सा माना जाता है और इस प्रकार सीमाओं की ओर गिना जाता है।

यह लिंक इस विषय पर कुछ अतिरिक्त प्रकाश डाला जाना चाहिए: http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods

+0

निश्चित रूप से यह कुछ ऐसा है जो मुझे थोड़ी देर पहले सुझाया गया था। मैं अपने टेस्ट क्लास में इन दो कथन जोड़ दूंगा। धन्यवाद। –

+0

अरे जॉन, मैंने इन बयानों को मेरी परीक्षा कक्षा में जोड़ा और इससे मदद नहीं मिली। मैंने अब ऊपर अपनी मूल पोस्ट में टेस्ट क्लास और ट्रिगर का कोड पोस्ट किया है। –

+0

उत्तर के रूप में चिह्नित। Force.com आईडीई का उपयोग करके मैं किसी अन्य वर्ग में समस्या का पता लगाने में सक्षम था। मैंने शुरुआती जगह में स्टार्टटेस्ट और स्टॉपटेस्ट का इस्तेमाल किया। –

1

ध्यान में रखने की एक और बात SOQL है कि आप पाश के लिए अपने में क्रियान्वित कर रहे हैं। आप एक सूची बना सकते हैं और अपनी लूप से पहले अपनी क्वेरी के परिणामों को स्टोर कर सकते हैं .. इस तरह आपको गवर्नर सीमाओं के साथ किसी समस्या का सामना नहीं करना पड़ेगा क्योंकि आप केवल प्रति लेनदेन एक SOQL कथन का उपयोग कर रहे हैं।

+0

Yup यह पहली बात है जिसे मैं कोडिंग में किसी भी अन्य त्रुटियों को देखने के लिए आगे बढ़ने से पहले जांचता हूं। –

+0

धन्यवाद रिचर्ड्स ..! क्या आप इस सवाल की जांच कर सकते हैं? धन्यवाद !! http://stackoverflow.com/q/12183564/1633936 – JeyJim

+0

मैंने जवाब दिया है ... अगर आपको वहां और मदद की ज़रूरत है तो मुझे बताएं। –