monkeyrunner

পুরনো monkeyrunner টুল এমন প্রোগ্রাম লেখার জন্য API প্রদান করে যা Android কোডের বাইরে থেকে Android ডিভাইস বা এমুলেটর কন্ট্রোল করে।

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

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

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

monkeyrunner টুল Android টেস্টিংয়ের জন্য এইসব ফিচার প্রদান করে:

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

    এছাড়াও, আপনি monkeyrunner API-তে নিজের ক্লাস যোগ করতে পারবেন। এটি প্লাগ-ইন সহ monkeyrunner এক্সটেন্ড করুন বিভাগে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে।

monkeyrunner টুল Jython ব্যবহার করে, এটি Python-এর একটি ইমপ্লিমেন্টেশন যা Java প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করে। Jython-এর সাহায্যে monkeyrunner API সহজেই Android ফ্রেমওয়ার্কের সাথে ইন্টার‍্যাক্ট করতে পারে। Jython-এর সাহায্যে, আপনি API-এর কনস্ট্যান্ট, ক্লাস এবং পদ্ধতি অ্যাক্সেস করতে 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 API, com.android.monkeyrunner প্যাকেজের তিনটি মডিউলে রয়েছে:

  • MonkeyRunner: monkeyrunner প্রোগ্রামের জন্য ইউটিলিটি পদ্ধতির একটি ক্লাস। এই ক্লাসটি একটি ডিভাইস বা এমুলেটরে monkeyrunner কানেক্ট করার জন্য একটি পদ্ধতি প্রদান করে। এছাড়াও, এটি monkeyrunner প্রোগ্রামের জন্য UI তৈরি করা এবং বিল্ট-ইন সহায়তা দেখানোর পদ্ধতি প্রদান করে।
  • 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-এর জন্য API রেফারেন্স জেনারেট করতে পারবেন:

monkeyrunner help.py <format> <outfile>

আর্গুমেন্টগুলি হল:

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

প্লাগ-ইন সহ monkeyrunner এক্সটেন্ড করুন

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

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

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

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

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

জাভা

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