लेगसी monkeyrunner टूल, प्रोग्राम लिखने के लिए एक एपीआई उपलब्ध कराता है. इसकी मदद से, Android कोड के बाहर से किसी Android डिवाइस या एम्युलेटर को कंट्रोल किया जा सकता है.
monkeyrunner टूल को मुख्य रूप से ऐप्लिकेशन और डिवाइसों की जांच करने के लिए डिज़ाइन किया गया है. यह जांच फ़ंक्शनल/फ़्रेमवर्क लेवल पर की जाती है. साथ ही, इसका इस्तेमाल यूनिट टेस्ट सुइट चलाने के लिए भी किया जाता है. हालांकि, इसका इस्तेमाल अन्य कामों के लिए भी किया जा सकता है. monkeyrunner की मदद से, एक Python प्रोग्राम लिखा जा सकता है. यह प्रोग्राम, Android ऐप्लिकेशन या टेस्ट पैकेज को इंस्टॉल करता है, उसे चलाता है, और उस पर कीस्ट्रोक भेजता है. साथ ही, यह प्रोग्राम ऐप्लिकेशन के यूज़र इंटरफ़ेस के स्क्रीनशॉट लेता है और उन्हें वर्कस्टेशन पर सेव करता है.
चेतावनी: monkeyrunner एपीआई को बनाए नहीं रखा जाता. हमारा सुझाव है कि आप इसके बजाय, UI Automator टेस्टिंग फ़्रेमवर्क का इस्तेमाल करें.
monkeyrunner टूल, UI/ऐप्लिकेशन एक्सरसाइज़र मंकी से जुड़ा नहीं है. इसे monkey टूल भी कहा जाता है. monkey टूल, सीधे तौर पर डिवाइस या एम्युलेटर पर adb शेल में चलता है. साथ ही, यह उपयोगकर्ता और सिस्टम इवेंट की छद्म-रैंडम स्ट्रीम जनरेट करता है. इसके उलट, monkeyrunner टूल, वर्कस्टेशन से डिवाइसों और एम्युलेटर को कंट्रोल करता है. इसके लिए, यह टूल एपीआई से खास निर्देश और इवेंट भेजता है.
monkeyrunner टूल, Android की टेस्टिंग के लिए ये सुविधाएं देता है:
-
एक से ज़्यादा डिवाइसों को कंट्रोल करना:
monkeyrunnerएपीआई, एक से ज़्यादा डिवाइसों या एम्युलेटर पर एक या एक से ज़्यादा टेस्ट सुइट लागू कर सकता है. सभी डिवाइसों को एक साथ अटैच किया जा सकता है या सभी एम्युलेटर (या दोनों) एक साथ चालू किए जा सकते हैं. इसके बाद, प्रोग्राम के हिसाब से एक-एक करके सभी डिवाइसों से कनेक्ट किया जा सकता है. इसके बाद, एक या उससे ज़्यादा टेस्ट चलाए जा सकते हैं. एम्युलेटर को प्रोग्राम के हिसाब से कॉन्फ़िगर किया जा सकता है. साथ ही, एक या उससे ज़्यादा टेस्ट चलाए जा सकते हैं. इसके बाद, एम्युलेटर को बंद किया जा सकता है. -
फ़ंक्शनल टेस्टिंग:
monkeyrunner, Android ऐप्लिकेशन की शुरू से आखिर तक अपने-आप होने वाली जांच कर सकता है. कीस्ट्रोक या टच इवेंट के ज़रिए इनपुट वैल्यू दी जाती हैं और नतीजों को स्क्रीनशॉट के तौर पर देखा जाता है. -
रिग्रेशन टेस्टिंग:
monkeyrunner, ऐप्लिकेशन को चलाकर और उसके आउटपुट के स्क्रीनशॉट की तुलना, स्क्रीनशॉट के ऐसे सेट से करके ऐप्लिकेशन की स्थिरता की जांच कर सकता है जो सही माने जाते हैं. -
ऑटोमेशन को बेहतर बनाने की सुविधा:
monkeyrunnerएक एपीआई टूलकिट है. इसलिए, Android डिवाइसों को कंट्रोल करने के लिए, Python पर आधारित मॉड्यूल और प्रोग्राम का सिस्टम डेवलप किया जा सकता है.monkeyrunnerएपीआई के अलावा, Android टूल को कॉल करने के लिए, स्टैंडर्ड Pythonosऔरsubprocessमॉड्यूल का इस्तेमाल किया जा सकता है. जैसे, Android Debug Bridge.monkeyrunnerAPI में अपनी क्लास भी जोड़ी जा सकती हैं. इस बारे में ज़्यादा जानकारी के लिए, प्लगिन की मदद से monkeyrunner को बेहतर बनाएं सेक्शन देखें.
monkeyrunner टूल,
Jython का इस्तेमाल करता है. यह Python का एक ऐसा वर्शन है जो Java प्रोग्रामिंग लैंग्वेज का इस्तेमाल करता है. Jython की मदद से, monkeyrunner एपीआई, Android फ़्रेमवर्क के साथ आसानी से इंटरैक्ट कर पाता है. Jython की मदद से, एपीआई के कॉन्स्टेंट, क्लास, और तरीकों को ऐक्सेस करने के लिए, Python सिंटैक्स का इस्तेमाल किया जा सकता है.
monkeyrunner का एक सामान्य प्रोग्राम
यहां एक सामान्य monkeyrunner प्रोग्राम दिया गया है, जो किसी डिवाइस से कनेक्ट होता है और एक MonkeyDevice ऑब्जेक्ट बनाता है. MonkeyDevice ऑब्जेक्ट का इस्तेमाल करके, प्रोग्राम एक Android ऐप्लिकेशन पैकेज इंस्टॉल करता है, उसकी किसी एक गतिविधि को चलाता है, और गतिविधि को मुख्य इवेंट भेजता है.
इसके बाद, प्रोग्राम नतीजे का स्क्रीनशॉट लेता है और एक MonkeyImage ऑब्जेक्ट बनाता है.
इस ऑब्जेक्ट से, प्रोग्राम एक PNG फ़ाइल लिखता है. इसमें स्क्रीनशॉट होता है.
# Imports the monkeyrunner modules used by this program. from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice # Connects to the current device, returning a MonkeyDevice object. device = MonkeyRunner.waitForConnection() # Installs the Android package. Notice that this method returns a boolean, so you can test # whether the installation worked. device.installPackage('myproject/bin/MyApplication.apk') # Sets a variable with the package's internal name. package = 'com.example.android.myapplication' # Sets a variable with the name of an Activity in the package. activity = 'com.example.android.myapplication.MainActivity' # Sets the name of the component to start. runComponent = package + '/' + activity # Runs the component. device.startActivity(component=runComponent) # Presses the Menu button. device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP) # Takes a screenshot. result = device.takeSnapshot() # Writes the screenshot to a file. result.writeToFile('myproject/shot1.png','png')
monkeyrunner API
monkeyrunner एपीआई, com.android.monkeyrunner पैकेज के तीन मॉड्यूल में शामिल है:
-
MonkeyRunner: यहmonkeyrunnerप्रोग्राम के लिए, यूटिलिटी मेथड की क्लास है. यह क्लास,monkeyrunnerको किसी डिवाइस या एम्युलेटर से कनेक्ट करने का तरीका बताती है. यहmonkeyrunnerप्रोग्राम के लिए यूज़र इंटरफ़ेस (यूआई) बनाने और बिल्ट-इन सहायता को दिखाने के तरीके भी उपलब्ध कराता है. -
MonkeyDevice: डिवाइस या एम्युलेटर को दिखाता है. यह क्लास, पैकेज इंस्टॉल और अनइंस्टॉल करने, कोई गतिविधि शुरू करने, और किसी ऐप्लिकेशन को कीबोर्ड या टच इवेंट भेजने के तरीके उपलब्ध कराती है. इस क्लास का इस्तेमाल, टेस्ट पैकेज चलाने के लिए भी किया जाता है. -
MonkeyImage: स्क्रीन कैप्चर की गई इमेज के बारे में बताता है. यह क्लास, स्क्रीन कैप्चर करने, बिटमैप इमेज को अलग-अलग फ़ॉर्मैट में बदलने, दोMonkeyImageऑब्जेक्ट की तुलना करने, और किसी इमेज को फ़ाइल में लिखने के तरीके उपलब्ध कराती है.
Python प्रोग्राम में, हर क्लास को Python मॉड्यूल के तौर पर ऐक्सेस किया जाता है. monkeyrunner
टूल, इन मॉड्यूल को अपने-आप इंपोर्ट नहीं करता. किसी मॉड्यूल को इंपोर्ट करने के लिए, Python from स्टेटमेंट का इस्तेमाल करें:
from com.android.monkeyrunner import <module>
इसमें <module> वह क्लास का नाम है जिसे इंपोर्ट करना है. एक ही from स्टेटमेंट में एक से ज़्यादा मॉड्यूल इंपोर्ट किए जा सकते हैं. इसके लिए, मॉड्यूल के नामों को कॉमा लगाकर अलग करें.
monkeyrunner को चलाना
monkeyrunner प्रोग्राम को किसी फ़ाइल से चलाया जा सकता है. इसके अलावा, इंटरैक्टिव सेशन में monkeyrunner स्टेटमेंट डालकर भी प्रोग्राम चलाया जा सकता है. इसके लिए, monkeyrunner कमांड का इस्तेमाल करें. यह कमांड, SDK डायरेक्ट्री की tools/ सबडायरेक्ट्री में मौजूद होती है.
अगर फ़ाइल का नाम आर्ग्युमेंट के तौर पर दिया जाता है, तो monkeyrunner कमांड, फ़ाइल के कॉन्टेंट को Python प्रोग्राम के तौर पर चलाती है. ऐसा न होने पर, यह इंटरैक्टिव सेशन शुरू करती है.
monkeyrunner कमांड का सिंटैक्स यहां दिया गया है:
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
पहली टेबल में, monkeyrunner फ़्लैग और आर्ग्युमेंट के बारे में बताया गया है.
पहली टेबल. monkeyrunner फ़्लैग और तर्क
| आर्ग्युमेंट | ब्यौरा |
|---|---|
-plugin <plugin_jar>
|
(ज़रूरी नहीं) यह monkeyrunner के लिए प्लगिन वाली JAR फ़ाइल के बारे में बताता है.
monkeyrunner प्लगिन के बारे में ज़्यादा जानने के लिए, प्लगिन की मदद से monkeyrunner को एक्सटेंड करना सेक्शन देखें.
एक से ज़्यादा फ़ाइलें तय करने के लिए, आर्ग्युमेंट को कई बार शामिल करें.
|
<program_filename>
|
यह तर्क देने पर, monkeyrunner कमांड, फ़ाइल के कॉन्टेंट को Python प्रोग्राम के तौर पर चलाती है. ऐसा न करने पर, कमांड से इंटरैक्टिव सेशन शुरू हो जाता है.
|
<program_options>
|
(ज़रूरी नहीं) <program_file> में प्रोग्राम के लिए फ़्लैग और आर्ग्युमेंट |
monkeyrunner में पहले से मौजूद सहायता
monkeyrunner के लिए एपीआई के बारे में जानकारी जनरेट करने के लिए, यह कमांड चलाएं:
monkeyrunner help.py <format> <outfile>
ये तर्क दिए गए हैं:
-
<format>, सादे टेक्स्ट के आउटपुट के लिएtextया एचटीएमएल के आउटपुट के लिएhtmlहोता है. -
<outfile>, आउटपुट फ़ाइल के लिए पाथ-क्वालिफ़ाइड नाम है.
प्लगिन की मदद से monkeyrunner को बेहतर बनाना
monkeyrunner API को Java में लिखी गई क्लास की मदद से बढ़ाया जा सकता है. साथ ही, इन्हें एक या उससे ज़्यादा JAR फ़ाइलों में बनाया जा सकता है. इस सुविधा का इस्तेमाल, monkeyrunner API को अपनी क्लास के साथ जोड़ने या मौजूदा क्लास को बढ़ाने के लिए किया जा सकता है. इस सुविधा का इस्तेमाल, monkeyrunner एनवायरमेंट को शुरू करने के लिए भी किया जा सकता है.
monkeyrunner को प्लगिन देने के लिए, monkeyrunner कमांड को monkeyrunner आर्ग्युमेंट के साथ लागू करें. इस आर्ग्युमेंट के बारे में टेबल 1 में बताया गया है.-plugin <plugin_jar>
अपने प्लगिन कोड में, com.android.monkeyrunner में मौजूद मुख्य monkeyrunner क्लास MonkeyDevice, MonkeyImage, और MonkeyRunner को इंपोर्ट और एक्सटेंड किया जा सकता है. monkeyrunner एपीआई के बारे में जानकारी देने वाला सेक्शन देखें.
ध्यान दें कि प्लगिन से आपको Android SDK का ऐक्सेस नहीं मिलता. com.android.app जैसे पैकेज इंपोर्ट नहीं किए जा सकते. ऐसा इसलिए होता है, क्योंकि monkeyrunner, फ़्रेमवर्क एपीआई के लेवल से नीचे मौजूद डिवाइस या एम्युलेटर के साथ इंटरैक्ट करता है.
प्लगिन स्टार्टअप क्लास
किसी प्लगिन की JAR फ़ाइल, ऐसी क्लास के बारे में बता सकती है जिसे स्क्रिप्ट प्रोसेसिंग शुरू होने से पहले इंस्टैंटिएट किया जाता है. इस क्लास को तय करने के लिए, JAR फ़ाइल के मेनिफ़ेस्ट में MonkeyRunnerStartupRunner कुंजी जोड़ें. वैल्यू के लिए, स्टार्टअप पर चलने वाली क्लास का नाम इस्तेमाल करें. यहां दिए गए स्निपेट में, ant बिल्ड स्क्रिप्ट में ऐसा करने का तरीका बताया गया है:
<jar jarfile="myplugin" basedir="${build.dir}"> <manifest> <attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/> </manifest> </jar>
monkeyrunner टूल के रनटाइम एनवायरमेंट का ऐक्सेस पाने के लिए, स्टार्टअप क्लास com.google.common.base.Predicate<PythonInterpreter> को लागू कर सकती है. उदाहरण के लिए, यह क्लास डिफ़ॉल्ट नेमस्पेस में कुछ वैरिएबल सेट अप करती है:
Kotlin
package com.android.example import com.google.common.base.Predicate import org.python.util.PythonInterpreter class Main: Predicate<PythonInterpreter> { override fun apply(anInterpreter: PythonInterpreter): Boolean { /* * Examples of creating and initializing variables in the monkeyrunner environment's * namespace. During execution, the monkeyrunner program can refer to the variables * "newtest" and "use_emulator" * */ anInterpreter.set("newtest", "enabled") anInterpreter.set("use_emulator", 1) return true } }
Java
package com.android.example; import com.google.common.base.Predicate; import org.python.util.PythonInterpreter; public class Main implements Predicate<PythonInterpreter> { @Override public boolean apply(PythonInterpreter anInterpreter) { /* * Examples of creating and initializing variables in the monkeyrunner environment's * namespace. During execution, the monkeyrunner program can refer to the variables "newtest" * and "use_emulator" * */ anInterpreter.set("newtest", "enabled"); anInterpreter.set("use_emulator", 1); return true; } }