एंड्रॉइड लाइब्रेरी प्रोजेक्ट का परीक्षण कैसे करें


97

मैं एंड्रॉइड बिटमैप क्लास पर एक एंड्रॉइड लाइब्रेरी प्रोजेक्ट बेसिंग लिख रहा हूं (इसे एंड्रोइंडलिब कहते हैं) जिसमें केवल उपयोगिता वर्ग (कोई गतिविधि नहीं) है। मैंने एंड्रॉइड JUnit का उपयोग करके इसका परीक्षण करने की कोशिश की, लेकिन यह शिकायत करता रहता है कि AnroidLib.apk नहीं मिल सकता है

यूनिट का एंड्रॉइड लाइब्रेरी प्रोजेक्ट का सही तरीका क्या है?


1
या ( बेशर्म प्लग अलर्ट ) आप मेरे द्वारा बनाई गई एक परियोजना का उपयोग कर सकते हैं: एंड्रॉइड लाइब्रेरी टेस्ट हार्नेस (मुझे "ऑल्ट एच" कॉल करना पसंद है)। यह एक git रेपो के रूप में उपलब्ध है: gitorious.org/alth परियोजना अभी भी विकास में है और प्रलेखन थोड़ा विरल है, इसलिए यदि आपके कोई प्रश्न हैं, तो मुझे मारने के लिए स्वतंत्र महसूस करें।
४१

जवाबों:


75

दस्तावेज का हवाला देते हुए :

"एक पुस्तकालय परियोजना में कोड और संसाधनों पर परीक्षण स्थापित करने के दो अनुशंसित तरीके हैं:

  • आप एक परीक्षण प्रोजेक्ट सेट कर सकते हैं जो एक एप्लिकेशन प्रोजेक्ट को इंस्ट्रूमेंट करता है जो लाइब्रेरी प्रोजेक्ट पर निर्भर करता है। फिर आप लाइब्रेरी-विशिष्ट सुविधाओं के लिए प्रोजेक्ट में परीक्षण जोड़ सकते हैं।

  • आप एक मानक एप्लिकेशन प्रोजेक्ट सेट कर सकते हैं जो लाइब्रेरी पर निर्भर करता है और उस प्रोजेक्ट में इंस्ट्रूमेंटेशन डालता है। यह आपको एक स्व-निहित परियोजना बनाने की अनुमति देता है जिसमें परीक्षण / उपकरण और परीक्षण करने के लिए कोड दोनों शामिल हैं। "


27
इसलिए मूल रूप से आपको बस इतना करना है कि लाइब्रेरी को अपने टेस्ट प्रोजेक्ट में जोड़ें और टेस्ट प्रोजेक्ट का परीक्षण करें।
njzk2

लिंक अब मान्य नहीं है, कोई भी मौका जो आप हमें वर्तमान में इंगित कर सकते हैं?
अब्दुल्ला जिबली


4
यकीन नहीं होता कि किसी और को इन सिफारिशों के साथ सफलता मिली है, लेकिन मैंने नहीं। पहले दूसरे समाधान की कोशिश की और जब मैं ग्रहण में चलने की कोशिश करता हूं तो मुझे निम्नलिखित मिलते हैं: <ProjectName> एक android.test.InstrumentationTestRunner इंस्ट्रूमेंटेशन निर्दिष्ट नहीं करता है या अपने AndroidManifest.xml में उपयोग-लाइब्रेरी android.test .runner की घोषणा नहीं करता है। यह इस तथ्य के बावजूद है कि मैंने अपने घोषणापत्र में इंस्ट्रूमेंटेशन और उपयोग-पुस्तकालय दोनों तत्वों को जोड़ा।
बेलिंगहामर

2
दूसरा (और पसंदीदा तरीका काम करना) मिला। यह बहुत महत्वपूर्ण है कि आपको अपनी उपस्थिति में सही स्थान पर उपयोग-पुस्तकालय और इंस्ट्रूमेंटेशन तत्व मिलते हैं। इंस्ट्रूमेंटेशन तत्व रूट मैनिफ़ेस्ट एलिमेंट का बच्चा है और यूज़-लाइब्रेरी एलिमेंट एप्लिकेशन एलिमेंट का बच्चा है। मैं उपयोग-पुस्तकालय को प्रकट तत्व के नीचे रख रहा था और परीक्षणों को चलाने की कोशिश करते समय ऊपर त्रुटि संदेश के साथ समाप्त हो रहा था।
बेलिंगहामर

17

अपने परीक्षण प्रोजेक्ट में केवल पैकेज का नाम बदलें ताकि यह आपके पुस्तकालय के पैकेज के समान हो। उदाहरण के लिए, आपके पास एक पुस्तकालय है जिसका पैकेज है "com.example.lib"। अपनी लाइब्रेरी को लक्षित करने के लिए एक परीक्षण परियोजना बनाएं। मैनिफ़ेस्ट फ़ाइल में आप देखेंगे package="com.example.lib.test", और targetPackage="com.example.lib"। बस पैकेज को "com.example.lib.test" से "com.example.lib" में बदल targetPackageदें ( जैसा है छोड़ दें)।

यह भी सुनिश्चित करें कि लाइब्रेरी आपके टेस्ट प्रोजेक्ट के लिए संदर्भित है जावा बिल्ड पथ में नहीं , बल्कि एक सामान्य एंड्रॉइड लाइब्रेरी के रूप में: ग्रहण में इसे Project->Properties->Androidटैब में लाइब्रेरी के रूप में दिखाया जाना चाहिए , लेकिन टैब में नहींProject->Properties->Java Build Path

फिर आप परीक्षण चलाएं।


आपके विचारों ने मेरे लिए समझ बनाई, ताकि परीक्षण ने खुद को लक्षित किया (ऐप के रूप में) और ऐप को लाइब्रेरी के साथ जोड़ा गया है .... लेकिन मैं इसे एंट बिल्ड और न ही इंटेलीज के माध्यम से काम करने के लिए प्राप्त नहीं कर सका .... जैसा कि। .apk (परीक्षण के तहत ऐप के लिए अपेक्षित) मौजूद नहीं था जब उसने इसे स्थापित करने की कोशिश की, क्योंकि इसे "परीक्षण / बिन /
एंड्रयू मैकेंजी

मुझे यह पता चला कि टेस्ट प्रोजेक्ट के पैकेज का नाम बदलकर काम करना है (और परीक्षण के तहत पैकेज - जो समान होना चाहिए) लाइब्रेरी प्रोजेक्ट के पैकेज के नाम के साथ मेल नहीं खाता, और लक्ष्य परीक्षण के संदर्भ को हटा देता है ant.properties फ़ाइल में प्रोजेक्ट।
एंड्रयू मैकेंजी

1
मुझे लगता है कि यह स्वीकार किए जाते हैं की तुलना में एक बेहतर जवाब है, कि सिर्फ प्रलेखन - आईएमएचओ।
एंड्रयू मैकेंजी


5

प्रति प्रलेखन :

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


परीक्षण चलाने के लिए कौन सा कार्य? gradle test, या gradle androidTest? AndroidTest कोई कार्य नहीं है।
सनीडे

लेकिन फायरबेस टेस्ट लैब जैसे उपकरणों के लिए एपीके या एएबी की आवश्यकता होती है और एक एएआर फ़ाइल को स्वीकार नहीं करते हैं जो लाइब्रेरी के
असेंबली

1

नोट: यह समाधान ग्रहण इंडिगो (3.8.2) का उपयोग करने पर आधारित है और इसे अन्य आईडीई के लिए थोड़ा अलग तरीके से लागू करना पड़ सकता है, हालांकि मूल सिद्धांत समान होंगे।

मेरे पास समान मुद्दे थे और मैंने पाया कि निम्नलिखित हमेशा काम करते हैं:

( नोट: ये निर्देश खरोंच से एक नए प्रोजेक्ट समूह के निर्माण के लिए हैं। यदि आपने पहले ही प्रोजेक्ट समूह के कुछ हिस्सों का निर्माण कर लिया है, तो आपको अपनी परियोजनाओं को संशोधित करना पड़ सकता है, ताकि वे उसी तरह से कनेक्ट हों। )

  1. निर्माण के दौरान "इस लाइब्रेरी" चेकबॉक्स की जांच करके एक नया एंड्रॉइड लाइब्रेरी प्रोजेक्ट बनाएं। (उदाहरण के लिए "रेमिंगटनएंड्रॉइडटूल" नामक एक एंड्रॉइड प्रोजेक्ट)।
  2. एंड्रॉइड लाइब्रेरी प्रोजेक्ट बनाएं और सत्यापित करें कि उसने बिन फ़ोल्डर में जार फ़ाइल बनाई है। (उदाहरण के लिए "रेमिंगटनएंड्रॉइडटूलसजर" नामक एक जार फ़ाइल।)
  3. एंड्रॉइड ऐप के परीक्षण के लिए एक खाली एंड्रॉइड प्रोजेक्ट बनाएं जो एंड्रॉइड टेस्ट ऐप के रूप में काम करेगा। (उदाहरण के लिए "रेमिंगटनएंड्रॉइडटूलस्टेप" नामक एक एंड्रॉइड प्रोजेक्ट)। आपको एंड्रॉइड टेस्ट ऐप प्रोजेक्ट के स्रोत कोड या संसाधनों को संशोधित करने की आवश्यकता नहीं होगी जब तक कि आपके पास ऐसा कुछ न हो जिसे परीक्षण के लिए जोड़ा जाना चाहिए। एंड्रॉइड टेस्ट ऐप प्रोजेक्ट में कई चीजों को बिना किसी संशोधन के परीक्षण किया जा सकता है। एंड्रॉइड टेस्ट ऐप प्रोजेक्ट आपके एंड्रॉइड लाइब्रेरी प्रोजेक्ट और एंड्रॉइड जूनिट प्रोजेक्ट के बीच एक पुल है जो एंड्रॉइड लाइब्रेरी प्रोजेक्ट का परीक्षण एंड्रॉइड जूनिट के माध्यम से संभव बनाता है।
  4. एंड्रॉइड टेस्ट ऐप प्रोजेक्ट के लिए जावा बिल्ड पथ के लाइब्रेरी टैब पर जाएं ("इस उदाहरण में रेमिंगटनएंड्रॉइडटूलस्टेप")।
  5. एंड्रॉइड लाइब्रेरी प्रोजेक्ट के जार फ़ाइल ("रेमिंगटनएंड्रॉइडटूलसजर" इस ​​उदाहरण में जोड़ें) ("रेमिंगटनएंड्रॉइडटूल" इस उदाहरण में) "ऐड जार ..." बटन के माध्यम से।
  6. एक नया एंड्रॉइड टेस्ट प्रोजेक्ट बनाएं (उदाहरण के लिए "रेमिंगटनएंड्रॉइडटूलसटेस्टर") जो एक एंड्रॉइड लाइब्रेरी टेस्टर के रूप में काम करेगा और लक्ष्य के रूप में एंड्रॉइड टेस्ट ऐप प्रोजेक्ट ("रेमिंगटनएंड्रॉइडटसटेस्टएप") का चयन करेगा।
  7. एंड्रॉइड लाइब्रेरी टेस्टर प्रोजेक्ट के लिए जावा बिल्ड पथ के लाइब्रेरी टैब पर जाएं ("उदाहरण में रेमिंगटनएंड्रॉइडटॉल्सटेस्टर")।
  8. एंड्रॉइड लाइब्रेरी प्रोजेक्ट के जार फ़ाइल ("रेमिंगटनएंड्रॉइडटूलसजर" इस ​​उदाहरण में जोड़ें) ("रेमिंगटनएंड्रॉइडटूल" इस उदाहरण में) "ऐड जार ..." बटन के माध्यम से।
  9. एंड्रॉइड लाइब्रेरी टेस्टर प्रोजेक्ट में अपने एंड्रॉइड पैकेज का अंतिम फ़ोल्डर ढूंढें (उदाहरण के लिए "danny.remington.remington_android_tools_test_app.test)" और उदाहरण के लिए एक परीक्षण वर्ग ("MainActivityestest") जोड़ें, जो ActivInstrumentationTestCase2 से विरासत में मिला है।
  10. एक्टिविटीइंस्टीट्यूटेशनटैस्ट 2 के पैरामीटर के रूप में एंड्रॉइड टेस्ट ऐप ("उदाहरण में" टेस्टअक्टिविटी ") का उपयोग करने के लिए टेस्ट क्लास (" टेस्टअक्टिविटी ") का उपयोग करें।
  11. टेस्ट क्लास ("TestActivityTest" को इस उदाहरण में संपादित करें) और एक डिफॉल्ट कंस्ट्रक्टर बनाएं जो सुपर (क्लास) के लिए कॉल करता है और एंड्रॉइड टेस्ट ऐप की क्लास में पास होता है (उदाहरण के लिए "TestActivity.class")।

आपको तीन परियोजनाओं (एंड्रॉइड लाइब्रेरी, एंड्रॉइड टेस्ट ऐप, एंड्रॉइड लाइब्रेरी परीक्षक) के साथ समाप्त होना चाहिए जो इस तरह दिखते हैं:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

आपको अपने एंड्रॉइड लाइब्रेरी के परीक्षण के लिए एक वर्ग के साथ समाप्त होना चाहिए जो इस तरह दिखता है:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

फिर आप अपनी इच्छानुसार कोई भी परीक्षण जोड़ सकते हैं। आपको अपने परीक्षण को चलाने के लिए Android टेस्ट ऐप ("रेमिंगटनएंड्रॉइडटेस्टस्टेप" इस संदर्भ में) का संदर्भ लेने की आवश्यकता नहीं होगी, जब तक कि उन्हें एंड्रॉइड विशिष्ट घटक (उदाहरण के लिए एसेट्स फ़ोल्डर) की आवश्यकता न हो। यदि आपको किसी एंड्रॉइड के विशिष्ट घटकों को एक्सेस करने की आवश्यकता है, तो आप इस उदाहरण में एंड्रॉइड टेस्ट ऐप ("रेमिंगटनएंड्रॉइडटस्टेप" को संशोधित करके) कर सकते हैं और फिर इसे मानक एंड्रॉइड जूनिट एपीआई द्वारा प्रदान किए गए इंस्ट्रूमेंटेशन के माध्यम से संदर्भित कर सकते हैं। (आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: http://developer.android.com/tools/testing/testing_android.html )


0

यदि आपकी ulitiy कक्षाएं किसी भी एंड्रॉइड विशिष्ट कोड पर निर्भर नहीं करती हैं, तो आप बस मानक JUnit इकाई परीक्षणों का उपयोग कर सकते हैं। Android संस्करणों का उपयोग करने की आवश्यकता नहीं है।


2
यह काम नहीं करता है क्योंकि मानक JUnit मानक JVM के लिए संकलित है, जबकि Android java फाइलें Dalvik VM में संकलित हैं।
डैनी रेमिंगटन - ओएमएस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.