বানর রানার

লিগ্যাসি monkeyrunner টুলটি এমন প্রোগ্রাম লেখার জন্য একটি এপিআই প্রদান করে, যা অ্যান্ড্রয়েড কোডের বাইরে থেকে কোনো অ্যান্ড্রয়েড ডিভাইস বা এমুলেটরকে নিয়ন্ত্রণ করতে পারে।

monkeyrunner টুলটি মূলত অ্যাপ এবং ডিভাইসগুলোকে ফাংশনাল/ফ্রেমওয়ার্ক লেভেলে পরীক্ষা করার জন্য এবং ইউনিট টেস্ট স্যুট চালানোর জন্য ডিজাইন করা হয়েছে, তবে আপনি এটি অন্যান্য উদ্দেশ্যেও ব্যবহার করতে পারেন। monkeyrunner দিয়ে, আপনি এমন একটি পাইথন প্রোগ্রাম লিখতে পারেন যা একটি অ্যান্ড্রয়েড অ্যাপ বা টেস্ট প্যাকেজ ইনস্টল করে, সেটি চালায়, এতে কীস্ট্রোক পাঠায়, এর ইউজার ইন্টারফেসের স্ক্রিনশট নেয় এবং ওয়ার্কস্টেশনে স্ক্রিনশটগুলো সংরক্ষণ করে।

সতর্কতা: monkeyrunner API) রক্ষণাবেক্ষণ করা হয় না। এর পরিবর্তে আমরা ইউআই অটোমেটর (UI Automator) টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করার পরামর্শ দিই।

monkeyrunner টুলটি UI/Application Exerciser Monkey-এর সাথে সম্পর্কিত নয়, যা monkey টুল নামেও পরিচিত। monkey টুল সরাসরি ডিভাইস বা এমুলেটরে একটি adb শেলে চলে এবং ব্যবহারকারী ও সিস্টেম ইভেন্টের ছদ্ম-এলোমেলো প্রবাহ তৈরি করে। এর তুলনায়, monkeyrunner টুল একটি API থেকে নির্দিষ্ট কমান্ড এবং ইভেন্ট পাঠিয়ে একটি ওয়ার্কস্টেশন থেকে ডিভাইস এবং এমুলেটর নিয়ন্ত্রণ করে।

monkeyrunner টুলটি অ্যান্ড্রয়েড টেস্টিংয়ের জন্য নিম্নলিখিত বৈশিষ্ট্যগুলো প্রদান করে:

  • একাধিক ডিভাইস নিয়ন্ত্রণ : monkeyrunner এপিআই (monkeyrunner API) ব্যবহার করে একাধিক ডিভাইস বা এমুলেটরে এক বা একাধিক টেস্ট স্যুট প্রয়োগ করা যায়। আপনি সমস্ত ডিভাইসকে ফিজিক্যালি সংযুক্ত করতে পারেন অথবা সমস্ত এমুলেটরকে একসাথে চালু করতে পারেন (কিংবা উভয়ই), প্রোগ্রাম্যাটিকভাবে একে একে প্রতিটির সাথে সংযোগ স্থাপন করতে পারেন এবং তারপরে এক বা একাধিক টেস্ট চালাতে পারেন। এছাড়া, আপনি প্রোগ্রাম্যাটিকভাবে একটি এমুলেটর কনফিগারেশন চালু করে, এক বা একাধিক টেস্ট চালিয়ে, এবং তারপরে এমুলেটরটি বন্ধ করে দিতে পারেন।
  • ফাংশনাল টেস্টিং : monkeyrunner একটি অ্যান্ড্রয়েড অ্যাপের শুরু থেকে শেষ পর্যন্ত স্বয়ংক্রিয় পরীক্ষা চালাতে পারে। আপনি কীস্ট্রোক বা টাচ ইভেন্টের মাধ্যমে ইনপুট ভ্যালু প্রদান করেন এবং ফলাফল স্ক্রিনশট হিসেবে দেখতে পারেন।
  • রিগ্রেশন টেস্টিং : monkeyrunner একটি অ্যাপ চালিয়ে এবং এর আউটপুট স্ক্রিনশটগুলোকে এক সেট সঠিক বলে পরিচিত স্ক্রিনশটের সাথে তুলনা করে অ্যাপটির স্থিতিশীলতা পরীক্ষা করতে পারে।
  • সম্প্রসারণযোগ্য অটোমেশন : যেহেতু monkeyrunner একটি এপিআই টুলকিট, আপনি অ্যান্ড্রয়েড ডিভাইস নিয়ন্ত্রণের জন্য পাইথন-ভিত্তিক মডিউল এবং প্রোগ্রামের একটি সিস্টেম তৈরি করতে পারেন। monkeyrunner এপিআই ব্যবহারের পাশাপাশি, আপনি অ্যান্ড্রয়েড ডিবাগ ব্রিজের মতো অ্যান্ড্রয়েড টুল কল করার জন্য স্ট্যান্ডার্ড পাইথন os এবং subprocess মডিউল ব্যবহার করতে পারেন।

    আপনি monkeyrunner এপিআই-তে আপনার নিজস্ব ক্লাসও যোগ করতে পারেন। এই বিষয়টি ‘প্লাগইন দিয়ে মাঙ্কিরানারকে প্রসারিত করুন’ বিভাগে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।

monkeyrunner টুলটি জাইথন ​​(Jython) ব্যবহার করে, যা জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে তৈরি পাইথনের একটি ইমপ্লিমেন্টেশন। জাইথন monkeyrunner এপিআই-কে অ্যান্ড্রয়েড ফ্রেমওয়ার্কের সাথে সহজে ইন্টারঅ্যাক্ট করতে দেয়। জাইথনের সাহায্যে, আপনি এপিআই-এর কনস্ট্যান্ট, ক্লাস এবং মেথডগুলো অ্যাক্সেস করার জন্য পাইথন সিনট্যাক্স ব্যবহার করতে পারেন।

একটি সাধারণ মাঙ্কিরানার প্রোগ্রাম

এখানে একটি সাধারণ monkeyrunner প্রোগ্রাম রয়েছে যা একটি ডিভাইসের সাথে সংযোগ স্থাপন করে এবং একটি MonkeyDevice অবজেক্ট তৈরি করে। MonkeyDevice অবজেক্টটি ব্যবহার করে, প্রোগ্রামটি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন প্যাকেজ ইনস্টল করে, এর একটি অ্যাক্টিভিটি চালায় এবং অ্যাক্টিভিটিতে কী ইভেন্ট পাঠায়। এরপর প্রোগ্রামটি ফলাফলের একটি স্ক্রিনশট নেয় এবং একটি 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-টি com.android.monkeyrunner প্যাকেজের তিনটি মডিউলে অন্তর্ভুক্ত রয়েছে:

  • MonkeyRunner : monkeyrunner প্রোগ্রামগুলির জন্য ইউটিলিটি মেথডের একটি ক্লাস। এই ক্লাসটি monkeyrunner কোনো ডিভাইস বা এমুলেটরের সাথে সংযোগ করার জন্য একটি মেথড প্রদান করে। এটি একটি monkeyrunner প্রোগ্রামের জন্য UI তৈরি করার এবং বিল্ট-ইন হেল্প প্রদর্শন করার মেথডও প্রদান করে।
  • MonkeyDevice : একটি ডিভাইস বা এমুলেটরকে বোঝায়। এই ক্লাসে প্যাকেজ ইনস্টল ও আনইনস্টল করা, একটি অ্যাক্টিভিটি শুরু করা এবং অ্যাপে কিবোর্ড বা টাচ ইভেন্ট পাঠানোর জন্য মেথড রয়েছে। টেস্ট প্যাকেজ চালানোর জন্যও এই ক্লাসটি ব্যবহার করা হয়।
  • MonkeyImage : একটি স্ক্রিন ক্যাপচার ইমেজকে বোঝায়। এই ক্লাসে স্ক্রিন ক্যাপচার করা, বিটম্যাপ ইমেজকে বিভিন্ন ফরম্যাটে রূপান্তর করা, দুটি MonkeyImage অবজেক্টের তুলনা করা এবং একটি ফাইলে ইমেজ লেখার জন্য মেথড রয়েছে।

একটি পাইথন প্রোগ্রামে, আপনি প্রতিটি ক্লাসকে একটি পাইথন মডিউল হিসেবে অ্যাক্সেস করেন। monkeyrunner টুলটি এই মডিউলগুলো স্বয়ংক্রিয়ভাবে ইম্পোর্ট করে না। একটি মডিউল ইম্পোর্ট করতে, পাইথনের ` from স্টেটমেন্ট ব্যবহার করুন:

from com.android.monkeyrunner import <module>

এখানে <module> হলো সেই ক্লাসের নাম যা আপনি ইম্পোর্ট করতে চান। আপনি একই from স্টেটমেন্টে কমা দিয়ে মডিউলের নামগুলো আলাদা করে একাধিক মডিউল ইম্পোর্ট করতে পারেন।

রান মাঙ্কি রানার

আপনি কোনো ফাইল থেকে অথবা একটি ইন্টারেক্টিভ সেশনে monkeyrunner স্টেটমেন্ট লিখে monkeyrunner প্রোগ্রাম চালাতে পারেন। এই দুটি কাজই করার জন্য আপনাকে monkeyrunner কমান্ডটি ব্যবহার করতে হবে, যা আপনার SDK ডিরেক্টরির tools/ সাবডিরেক্টরিতে পাওয়া যায়। যদি আপনি আর্গুমেন্ট হিসেবে একটি ফাইলের নাম দেন, তাহলে monkeyrunner কমান্ডটি ফাইলটির বিষয়বস্তুকে একটি পাইথন প্রোগ্রাম হিসেবে চালায়; অন্যথায়, এটি একটি ইন্টারেক্টিভ সেশন শুরু করে।

নিম্নলিখিতটি হলো monkeyrunner কমান্ডের সিনট্যাক্স:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

সারণি ১-এ monkeyrunner ফ্ল্যাগ ও আর্গুমেন্টগুলো ব্যাখ্যা করা হয়েছে।

সারণি ১. monkeyrunner ফ্ল্যাগ এবং আর্গুমেন্ট

যুক্তি বর্ণনা
-plugin <plugin_jar> (ঐচ্ছিক) monkeyrunner -এর প্লাগইন ধারণকারী একটি JAR ফাইল নির্দিষ্ট করে। monkeyrunner প্লাগইন সম্পর্কে আরও জানতে, "প্লাগইন দিয়ে মাঙ্কিরানার প্রসারিত করুন" বিভাগটি দেখুন। একাধিক ফাইল নির্দিষ্ট করতে, আর্গুমেন্টটি একাধিকবার অন্তর্ভুক্ত করুন।
<program_filename> আপনি এই আর্গুমেন্টটি দিলে, monkeyrunner কমান্ডটি ফাইলের বিষয়বস্তুকে একটি পাইথন প্রোগ্রাম হিসেবে রান করে। অন্যথায়, কমান্ডটি একটি ইন্টারেক্টিভ সেশন শুরু করে।
<program_options> (ঐচ্ছিক) <program_file> .

মাঙ্কিরানার বিল্ট-ইন হেল্প

নিম্নলিখিত কমান্ডটি চালিয়ে আপনি monkeyrunner জন্য একটি এপিআই রেফারেন্স তৈরি করতে পারেন:

monkeyrunner help.py <format> <outfile>

যুক্তিগুলো হলো:

  • <format> হয় প্লেইন টেক্সট আউটপুটের জন্য text অথবা HTML আউটপুটের জন্য html
  • <outfile> হলো আউটপুট ফাইলের পাথ-কোয়ালিফাইড নাম।

প্লাগইন ব্যবহার করে মাঙ্কি রানারকে আরও উন্নত করুন

আপনি জাভাতে লেখা ক্লাস ব্যবহার করে monkeyrunner এপিআই (API) প্রসারিত করতে পারেন এবং সেগুলোকে এক বা একাধিক JAR ফাইলে বিল্ড করতে পারেন। এই বৈশিষ্ট্যটি ব্যবহার করে আপনি আপনার নিজের ক্লাস দিয়ে monkeyrunner এপিআই প্রসারিত করতে পারেন অথবা বিদ্যমান ক্লাসগুলোকেও প্রসারিত করতে পারেন। এছাড়া, আপনি monkeyrunner এনভায়রনমেন্ট ইনিশিয়ালাইজ করতেও এই বৈশিষ্ট্যটি ব্যবহার করতে পারেন।

monkeyrunner এ একটি প্লাগইন যোগ করতে, সারণি ১- এ বর্ণিত -plugin <plugin_jar> আর্গুমেন্ট সহ monkeyrunner কমান্ডটি ব্যবহার করুন।

আপনার প্লাগইন কোডে, আপনি com.android.monkeyrunner এ থাকা MonkeyDevice , MonkeyImage , এবং MonkeyRunner প্রধান monkeyrunner ক্লাসগুলো ইম্পোর্ট এবং এক্সটেন্ড করতে পারেন ( monkeyrunner এপিআই সম্পর্কিত অংশটি দেখুন)।

মনে রাখবেন যে প্লাগইনগুলি আপনাকে অ্যান্ড্রয়েড এসডিকে (SDK) ব্যবহারের সুযোগ দেয় না। আপনি com.android.app এর মতো প্যাকেজ ইম্পোর্ট করতে পারবেন না। এর কারণ হলো, monkeyrunner ফ্রেমওয়ার্ক এপিআই (API)-এর স্তরের নিচে ডিভাইস বা এমুলেটরের সাথে কাজ করে।

প্লাগইন স্টার্টআপ ক্লাস

একটি প্লাগইনের 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> ইমপ্লিমেন্ট করতে পারে। উদাহরণস্বরূপ, এই ক্লাসটি ডিফল্ট নেমস্পেসে কিছু ভেরিয়েবল সেট আপ করে:

কোটলিন

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
    }
}

জাভা

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;
    }
}