میمون دونده

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

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

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

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

ابزار monkeyrunner این ویژگی‌ها را برای تست اندروید ارائه می‌دهد:

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

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

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

یک برنامه‌ی ساده‌ی monkeyrunner

در اینجا یک برنامه‌ی ساده‌ی monkeyrunner را مشاهده می‌کنید که به یک دستگاه متصل می‌شود و یک شیء MonkeyDevice ایجاد می‌کند. با استفاده از شیء MonkeyDevice ، برنامه یک بسته‌ی نرم‌افزاری اندروید نصب می‌کند، یکی از activityهای آن را اجرا می‌کند و رویدادهای کلیدی را به activity ارسال می‌کند. سپس برنامه از نتیجه‌ی کار اسکرین‌شات می‌گیرد و یک شیء 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')

رابط برنامه‌نویسی کاربردی (API) مربوط به monkeyrunner

API monkeyrunner در سه ماژول در بسته‌ی com.android.monkeyrunner قرار دارد:

  • MonkeyRunner : کلاسی از متدهای کاربردی برای برنامه‌های monkeyrunner . این کلاس متدی برای اتصال monkeyrunner به یک دستگاه یا شبیه‌ساز ارائه می‌دهد. همچنین متدهایی برای ایجاد رابط‌های کاربری برای یک برنامه monkeyrunner و نمایش راهنمای داخلی ارائه می‌دهد.
  • MonkeyDevice : نشان‌دهنده‌ی یک دستگاه یا شبیه‌ساز است. این کلاس متدهایی برای نصب و حذف نصب بسته‌ها، شروع یک Activity و ارسال رویدادهای صفحه‌کلید یا لمس به یک برنامه ارائه می‌دهد. همچنین می‌توانید از این کلاس برای اجرای آزمایشی بسته‌ها استفاده کنید.
  • MonkeyImage : نشان‌دهنده‌ی یک تصویر ضبط‌شده از صفحه نمایش است. این کلاس متدهایی برای ضبط صفحه نمایش، تبدیل تصاویر بیت‌مپ به فرمت‌های مختلف، مقایسه‌ی دو شیء MonkeyImage و نوشتن یک تصویر در یک فایل ارائه می‌دهد.

در یک برنامه پایتون، به هر کلاس به عنوان یک ماژول پایتون دسترسی پیدا می‌کنید. ابزار monkeyrunner این ماژول‌ها را به طور خودکار وارد نمی‌کند. برای وارد کردن یک ماژول، from پایتون استفاده کنید:

from com.android.monkeyrunner import <module>

که در آن <module> نام کلاسی است که می‌خواهید وارد کنید. می‌توانید با جدا کردن نام ماژول‌ها با کاما، بیش از یک ماژول را در یک دستور from وارد کنید.

اجرای monkeyrunner

شما می‌توانید برنامه‌های monkeyrunner را یا از یک فایل یا با وارد کردن دستورات monkeyrunner در یک جلسه تعاملی اجرا کنید. شما هر دو را با فراخوانی دستور monkeyrunner که در زیرشاخه tools/ در دایرکتوری SDK شما یافت می‌شود، انجام می‌دهید. اگر نام فایل را به عنوان آرگومان ارائه دهید، دستور monkeyrunner محتویات فایل را به عنوان یک برنامه پایتون اجرا می‌کند. در غیر این صورت، یک جلسه تعاملی را آغاز می‌کند.

سینتکس دستور monkeyrunner به صورت زیر است:

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

جدول ۱ پرچم‌ها و آرگومان‌های monkeyrunner را توضیح می‌دهد.

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

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

کمک داخلی monkeyrunner

شما می‌توانید با اجرای دستور زیر یک مرجع API برای monkeyrunner ایجاد کنید:

monkeyrunner help.py <format> <outfile>

استدلال‌ها عبارتند از:

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

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

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

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

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

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

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

فایل JAR یک افزونه می‌تواند کلاسی را مشخص کند که قبل از شروع پردازش اسکریپت، نمونه‌سازی می‌شود. برای مشخص کردن این کلاس، کلید MonkeyRunnerStartupRunner را به مانیفست فایل JAR اضافه کنید. برای مقدار، از نام کلاسی که قرار است در هنگام راه‌اندازی اجرا شود استفاده کنید. قطعه کد زیر نحوه انجام این کار را در یک اسکریپت ant build نشان می‌دهد:

<jar jarfile="myplugin" basedir="${build.dir}">
<manifest>
<attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
</manifest>
</jar>

برای دسترسی به محیط زمان اجرای ابزار monkeyrunner ، کلاس startup می‌تواند 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;
    }
}