2013-08-16 11 views
38

Robolectricएंड्रॉयड टेस्ट फ्रेमवर्क की तुलना में किसी भी स्पष्ट लाभ प्रदान करता है? मैंने दोनों ढांचे के बारे में दस्तावेज़ों को पढ़ा है, लेकिन जहां तक ​​मैं के बारे में एकमात्र स्पष्ट कट लाभ देख सकता हूं, रोबोलेक्ट्रिक यह है कि यह DalvikVM की बजाय JVM पर चलता है, जो इसे एंड्रॉइड फ्रेमवर्क से तेज़ बनाता है।Robolectric बनाम एंड्रॉयड टेस्ट फ्रेमवर्क

क्या कोई अन्य प्रमुख लाभ खड़ा है?

+0

यह बहुत समय पहले पूछा गया था। एंड्रॉइड टेस्ट फ्रेमवर्क रोबोइलेक्ट्रिक से बेहतर है {आज 2017/06 के रूप में]? – Sam

उत्तर

70

अद्यतन अप्रैल 2015: Gradle उपकरण और एंड्रॉयड स्टूडियो now officially support unit testing का निर्माण और android.jar ठूंठ फेंकने से (कोई वास्तविक कार्यान्वयन) त्रुटि को रोकने के। तो, हाँ जावा वीएम पर परीक्षण चलाने के लिए संभव है, जब स्टब्स उचित रूप से mocked हैं। यह एक शुरुआत है लेकिन अभी भी Robolectric की शक्ति के साथ तुलनीय नहीं है। एक तीसरा विकल्प भी है, इस उत्तर के नीचे स्क्रॉल करें।

अब, Robolectric के बारे में:

पेशेवरों: यहाँ यह कैसे इकाई परीक्षण में उपयोगी साबित हुई है के बारे में कुछ बिंदु हैं:

  1. आप एक एमुलेटर चलाने की जरूरत नहीं है, तो तुम एमुलेटर या डिवाइस की आवश्यकता के बिना परियोजना के गैर यूआई भागों में से कुछ का परीक्षण कर सकते हैं। यह निरंतर एकीकरण/बिल्ड सर्वर पर चल रहे परीक्षणों पर भी लागू होता है, कोई एमुलेटर उदाहरण लॉन्च होने की आवश्यकता नहीं है।

  2. एंड्रॉइड स्टूडियो के साथ, आप परीक्षण मामलों को पूरा करने के लिए कार्यान्वयन पर काम कर रहे हैं, तो आप जल्दी से एक विशेष परीक्षा कक्षा चला सकते हैं। जब आप कोड लिखते हैं तो आप डीबग कर सकते हैं। यह एक विशाल उत्पादकता लाभ है।

  3. छाया ऑब्जेक्ट्स, यहां तक ​​कि SQLite के रूप में लगभग हर एंड्रॉइड संबंधित चीज़ नकली कर सकते हैं। इसके अलावा प्रत्येक छाया वस्तु कई उपयोगी कार्यों का खुलासा करती है जो उनके सामान्य एंड्रॉइड समकक्षों की पेशकश नहीं करते हैं। एंड्रॉइड ऑब्जेक्ट के छाया समकक्षों के साथ, आप आंतरिक जांच कर सकते हैं या विशेष तरीकों को कॉल कर सकते हैं। जब AsyncTask रों, Loopers और Handlers जैसे बहु थ्रेडेड कोड का परीक्षण आदि तुम भी मुख्य थ्रेड रोक सकते हैं और तेजी से आगे धागा Loopers कर सकते हैं,

  4. सच चमकता है। हैंडलर आधारित कॉलबैक परीक्षण के लिए उत्कृष्ट।

  5. जुनीट 4 प्रारूप समर्थित है। पिछली बार मैंने जांच की है कि एंड्रॉइड अभी भी जुनीट 3 पर है।

  6. नकली गतिविधि उदाहरण निर्माण Robolectric.buildActivity() और ActivityController माध्यम से उसके नियंत्रण का समर्थन करता है Mockito, एस्प्रेसो आदि आदि जैसे अन्य परीक्षण उपकरणों के साथ जोड़ा जा सकता है। टुकड़ा/दृश्य हेरफेर भी इस तरह के नकली गतिविधि उदाहरणों पर काम करता है।

  7. अब add-on modules प्रदान किए गए हैं जो मल्टी-डेक्स, वी 4-सपोर्ट, प्ले सेवाएं, मानचित्र और http क्लाइंट को भी कवर करते हैं।तो, अब इन पुस्तकालय कार्यों का उपयोग कर कोड का परीक्षण करना आसान है।

विपक्ष: जहां मैं इसे बहुत अच्छा नहीं पाया:

  1. Robolectric इकाई परीक्षण सहायता में excels, लेकिन सभी कार्यक्षमता कोई वास्तविक उपकरण या एम्युलेटर पेशकश कर सकते हैं कवर नहीं करता। उदाहरण के लिए सेंसर, जीपीएस, ओपन-ग्ला आदि इत्यादि

  2. एकीकरण या यूआई परीक्षण करते समय आपको एक एमुलेटर या असली डिवाइस की आवश्यकता होगी, ताकि गतिविधियां और सेवाएं पूर्ण एंड्रॉइड वातावरण (अन्य ऐप्स, जैसे उपयोग करने के साथ बातचीत कर सकें) अपने ऐप के लिए एक तस्वीर पाने के लिए कैमरा ऐप), सीमित नहीं है। यहां आपको डिफ़ॉल्ट परीक्षण ढांचे का उपयोग करने की आवश्यकता होगी क्योंकि इसमें यूआई का परीक्षण करने के लिए भी कार्य है।

  3. जेएनआई लोडिंग समर्थित नहीं है। तो देशी निर्भरता के साथ कोड का परीक्षण नहीं किया जा सकता है।

  4. अभी तक, रोबॉलेक्ट्रिक के पास Google मानचित्र जार पर काम करने के लिए एक कठिन वायर्ड निर्भरता है। और मैवेन से एक और android.jar डाउनलोड करेगा। इसलिए, प्रोजेक्ट सेटअप को थोड़ा सा टिंकरिंग की आवश्यकता हो सकती है। अपडेट: v3 के रूप में यह बिना किसी झगड़े के ग्रैडल के माध्यम से सभी निर्भरताओं को खींचता प्रतीत होता है।

  5. नए एंड्रॉइड टूल समर्थन कवरेज और रिपोर्ट जनरेशन आदि, लेकिन केवल तभी जब डिवाइस पर परीक्षण चलाया जाता है। तो Robolectric के साथ आपको यह करने के लिए अतिरिक्त ग्रैडल कार्य (Jaococ चलाएं) बनाना होगा। अपडेट: ग्रैडल 2.9 + जैकोको प्लगइन के साथ जहाजों।

  6. चूंकि दोनों ग्रेडल और एंड्रॉइड बिल्ड टूल्स तेजी से नए बिल्ड संस्करणों को शिपिंग कर रहे हैं, स्थिर रोबोलेक्ट्रिक संस्करणों को कभी-कभी बदले गए टूल टूलींग में समस्याएं शुरू हो जाएंगी। अधिकांश सामान्य समस्याओं में शामिल हैं: एसडीके संस्करण असंगत, मैनिफेस्ट नहीं मिला, आउटपुट पथ मिस्चैच, संसाधन लोड नहीं हो रहा है, कॉन्फ़िगरेशन समस्याएं आदि बनाते हैं। कुछ समस्याएं एंड्रॉइड टूल्स में बग से भी संबंधित हैं। कभी-कभी आपको अपना खुद का कस्टम टेस्ट धावक भी लिखना पड़ सकता है या अगले संस्करण तक उन मुद्दों को हल करने तक वर्कअराउंड लागू करना पड़ सकता है। open issues देखें और तदनुसार परीक्षण कॉन्फ़िगर करें। , कोई चौखटे शामिल


एक अन्य विकल्प अपने दम पर बस नकली सामान है। इसका "कठिन तरीका" लेकिन सबसे अनुकूल तरीका है। जेएमॉकिट के साथ इसका सादा जुनीट:

@RunWith(JMockit.class) 
public class OtherTest { 
    public void testHandlerCallback(@Mocked final FragmentTransaction transaction, 
            @Mocked final FragmentManager manager, 
            @Mocked final Activity activity, 
            @Mocked final LayoutInflater inflater, 
            @Mocked final ViewGroup parent) { 

     final List<Fragment> fragments = new ArrayList<>(); 
     new Expectations() {{ 
      activity.getFragmentManager(); result = manager; 
      manager.beginTransaction(); result = transaction; 
      transaction.add(withCapture(fragments), anyString); 
      transaction.commit(); result = new Delegate<Void>() { 
       public int commit() { 
        View v = fragments.get(0).onCreateView(inflater,parent,null); 
        Deencapsulation.invoke(v,"onMeasure",0,0); 
        return 0; 
       } 
      }; 
     }}; 
    } 
} 

ऊपर एक कच्चा और इनलाइन उदाहरण है। आप वास्तव में उचित पुनः उपयोग करने योग्य कक्षाएं बना सकते हैं (FragmentTestHarness कहें) जो परीक्षण के तहत एक घटक (Fragment कहें) लें और इसे पूरी तरह अलग वातावरण में लपेटें, इसे परीक्षण के लिए तैयार करें।

+0

क्या एंड्रॉइड टेस्ट फ्रेमवर्क की तुलना में रोबॉलेक्ट्रिक की कोई डाउनसाइड्स है? – Traxex1909

+0

@ Traxex1909 मैं उत्तर में अपडेट करूंगा। –

+0

लगता है कि इस पल में कुछ हिस्सों को सच नहीं है जब हमें पहले से ही जीनमोशन मिला है? –

2

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

आप अभी भी एक वास्तविक डिवाइस के खिलाफ चलने वाले एकीकरण परीक्षण का एक सूट चाहते हैं, बस एक बहुत छोटा सूट।

18

साझा करने के लिए मैं कैसे कर ...

Robolectric एसक्यूएल के लिए, गतिविधियों प्रवाह, उन वस्तुओं है कि संदर्भ की जरूरत के लिए।

एपीआई जावा मॉड्यूल के लिए JUnit4 सुनिश्चित करने के लिए कि डेटा सही तरीके से वापस आ गया है।

एस्प्रेसो सही ढंग से UI प्रदर्शित करने के लिए।

जब मैंने एपीआई संशोधित किया ... मैं केवल jUnit4 चलाता हूं।

जब मैंने एपीआई और यूआई या स्क्लाइट के बीच बाध्यकारी डेटा संशोधित किया, तो मैं केवल रोबोलेक्ट्रिक चलाऊंगा।

जब मैंने यूआई संशोधित किया तो मैं केवल एस्प्रेसो चलाता हूं।

कभी-कभी मैं रोबोलेक्ट्रिक और एस्प्रेसो को एक साथ चलाऊंगा, लेकिन बहुत दुर्लभ।

लेकिन मैं स्टोर स्टोर करने के लिए प्रकाशित होने से पहले सभी को चलाऊंगा।

क्योंकि मुझे लगता है कि अब के लिए वास्तविक लाभ नहीं है। लेकिन देखें कि आप अपनी उत्पाद की गुणवत्ता और विकास की गति को तेज करने के लिए इसका उपयोग कैसे करते हैं।

अगर मैं गलत हूं तो मुझे सुधारें।

+1

क्या आपके पास कुछ नमूने हैं जिन्हें मैं देख सकता हूं? : डी – Spurdow

संबंधित मुद्दे