monkeyrunner

ابزار قدیمی monkeyrunner یک API برای نوشتن برنامه‌هایی ارائه می‌دهد که دستگاه یا شبیه‌ساز Android را از خارج از کد Android کنترل می‌کنند.

ابزار monkeyrunner دراصل برای آزمایش برنامه‌ها و دستگاه‌ها در سطح چارچوب/عملکرد و برای اجرای مجموعه آزمون‌های واحد طراحی شده است، اما می‌توانید از آن برای اهداف دیگر نیز استفاده کنید. با monkeyrunner، می‌توانید برنامه Python بنویسید که برنامه Android یا بسته آزمایشی را نصب کند، آن را اجرا کند، کلیدهای فشرده‌شده را به آن ارسال کند، از میانای کاربر آن نماگرفت بگیرد، و نماگرفت‌ها را در ایستگاه کاری ذخیره کند.

احتیاط: میانای برنامه‌سازی کاربردی monkeyrunner نگهداری نمی‌شود. توصیه می‌کنیم به‌جای آن از چارچوب آزمایشی UI Automator استفاده کنید.

ابزار monkeyrunner با UI/Application Exerciser Monkey، که با نام ابزار monkey نیز شناخته می‌شود، مرتبط نیست. ابزار monkey در پوسته adb مستقیماً روی دستگاه یا شبیه‌ساز اجرا می‌شود و جریان‌های شبه‌تصادفی از رویدادهای کاربر و سیستم تولید می‌کند. درمقابل، ابزار monkeyrunner دستگاه‌ها و شبیه‌سازها را از ایستگاه کاری با ارسال فرمان‌ها و رویدادهای خاص از میانای برنامه‌سازی کاربردی کنترل می‌کند.

ابزار monkeyrunner این ویژگی‌ها را برای آزمایش Android ارائه می‌دهد:

  • کنترل چند دستگاه: monkeyrunner API می‌تواند یک یا چند مجموعه آزمون را در چندین دستگاه یا شبیه‌ساز اعمال کند. می‌توانید همه دستگاه‌ها را به‌صورت فیزیکی متصل کنید یا همه شبیه‌سازها (یا هر دو) را هم‌زمان راه‌اندازی کنید، به‌صورت برنامه‌نویسی‌شده به هرکدام به‌نوبت متصل شوید، و سپس یک یا چند آزمایش را اجرا کنید. همچنین می‌توانید پیکربندی شبیه‌ساز را به‌صورت برنامه‌نویسی‌شده راه‌اندازی کنید، یک یا چند آزمایش را اجرا کنید، و سپس شبیه‌ساز را خاموش کنید.
  • آزمایش کارکردی: monkeyrunner می‌تواند آزمایش خودکار شروع تا پایان را برای برنامه Android اجرا کند. مقادیر ورودی را با کلیدزنی یا رویدادهای لمسی ارائه می‌دهید و نتایج را به‌صورت نماگرفت مشاهده می‌کنید.
  • آزمایش رگرسیون: monkeyrunner می‌تواند پایداری برنامه را با اجرای برنامه و مقایسه نماگرفت‌های خروجی آن با مجموعه‌ای از نماگرفت‌هایی که درست بودن آن‌ها مشخص است آزمایش کند.
  • خودکارسازی قابل‌توسعه: ازآنجایی‌که monkeyrunner یک جعبه‌ابزار میانای برنامه‌سازی کاربردی است، می‌توانید سیستمی از برنامه‌ها و ماژول‌های مبتنی بر Python برای کنترل دستگاه‌های Android توسعه دهید. علاوه‌بر استفاده از خود monkeyrunner API، می‌توانید از ماژول‌های استاندارد os و subprocess Python برای فراخوانی ابزارهای Android، مانند Android Debug Bridge استفاده کنید.

    همچنین می‌توانید کلاس‌های خودتان را به میانای برنامه‌سازی کاربردی monkeyrunner اضافه کنید. این موضوع با جزئیات بیشتر در بخش گسترش monkeyrunner با افزونه‌ها شرح داده شده است.

ابزار monkeyrunner از Jython استفاده می‌کند که پیاده‌سازی Python است و از زبان برنامه‌نویسی Java استفاده می‌کند. Jython به monkeyrunner API اجازه می‌دهد به‌راحتی با چارچوب Android تعامل داشته باشد. با Jython، می‌توانید از نحو Python برای دسترسی به ثابت‌ها، کلاس‌ها، و روش‌های API استفاده کنید.

برنامه 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')

The monkeyrunner API

monkeyrunner API در سه ماژول در بسته 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 انجام می‌دهید، که در زیرفهرست راهنمای tools/ در فهرست راهنمای کیت توسعه نرم‌افزار شما قرار دارد. اگر نام فایلی را به‌عنوان آرگومان ارائه دهید، فرمان monkeyrunner محتوای فایل را به‌عنوان برنامه Python اجرا می‌کند؛ درغیراین‌صورت، جلسه تعاملی را شروع می‌کند.

در زیر نحو فرمان monkeyrunner آمده است:

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

جدول ۱ پرچم‌ها و متغیرهای مستقل monkeyrunner را توضیح می‌دهد.

جدول ۱. monkeyrunner پرچم و آرگومان

متغیر مستقل شرح
-plugin <plugin_jar> (اختیاری) فایل JAR حاوی افزایه برای monkeyrunner را مشخص می‌کند. برای کسب اطلاعات بیشتر درباره افزایه‌های monkeyrunner، به بخش گسترش monkeyrunner با افزایه‌ها مراجعه کنید. برای مشخص کردن بیش‌از یک فایل، متغیر مستقل را چند بار اضافه کنید.
<program_filename> اگر این آرگومان را ارائه دهید، فرمان monkeyrunner محتوای فایل را به‌عنوان برنامه Python اجرا می‌کند. درغیراین‌صورت، فرمان یک جلسه تعاملی را شروع می‌کند.
<program_options> (اختیاری) پرچم‌ها و آرگومان‌های برنامه در <program_file>.

راهنمای داخلی monkeyrunner

می‌توانید با اجرای دستور زیر، مرجع میانای برنامه‌سازی کاربردی برای monkeyrunner تولید کنید:

monkeyrunner help.py <format> <outfile>

متغیرهای مستقل عبارت‌اند از:

  • <format> یا text برای برونداد نوشتار ساده یا html برای برونداد HTML است.
  • <outfile> نامی با مسیر مشخص برای فایل خروجی است.

گسترش دادن monkeyrunner با افزایه‌ها

می‌توانید monkeyrunner API را با کلاس‌هایی که در Java می‌نویسید گسترش دهید و در یک یا چند فایل JAR بسازید. می‌توانید از این ویژگی برای گسترش دادن monkeyrunner API با کلاس‌های خودتان یا گسترش دادن کلاس‌های موجود استفاده کنید. همچنین می‌توانید از این ویژگی برای مقداردهی اولیه محیط monkeyrunner استفاده کنید.

برای ارائه افزونه به monkeyrunner، فرمان monkeyrunner را با آرگومان -plugin <plugin_jar> شرح‌داده‌شده در جدول ۱ فراخوانی کنید.

در کد افزایه، می‌توانید کلاس‌های اصلی monkeyrunner MonkeyDevice، MonkeyImage، و MonkeyRunner را در com.android.monkeyrunner وارد و گسترش دهید (بخش مربوط به میانای برنامه‌سازی کاربردی monkeyrunner را ببینید).

توجه داشته باشید که افزونه‌ها به شما دسترسی به کیت توسعه نرم‌افزار Android را نمی‌دهند. نمی‌توانید بسته‌هایی مثل com.android.app را وارد کنید. دلیل این امر این است که monkeyrunner با دستگاه یا شبیه‌ساز در سطحی پایین‌تر از میاناهای برنامه‌سازی کاربردی چارچوب تعامل دارد.

کلاس راه‌اندازی افزونه

فایل JAR برای افزونه می‌تواند کلاسی را مشخص کند که قبل‌از شروع پردازش اسکریپت نمونه‌سازی شده است. برای مشخص کردن این کلاس، کلید MonkeyRunnerStartupRunner را به مانیفست فایل JAR اضافه کنید. برای مقدار، از نام کلاس برای اجرا در راه‌اندازی استفاده کنید. تکه‌کد زیر نشان می‌دهد که چگونه این کار را در متن ساخت 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;
    }
}