קוף

הכלי monkeyrunner מדור קודם מספק API לכתיבת תוכניות ששולטות במכשיר Android או באמולטור מחוץ לקוד Android.

הכלי monkeyrunner מיועד בעיקר לבדיקת אפליקציות ומכשירים ברמת הפונקציונליות או המסגרת, ולהרצת חבילות של בדיקות יחידה, אבל אפשר להשתמש בו גם למטרות אחרות. באמצעות monkeyrunner, אפשר לכתוב תוכנית Python שמתקינה אפליקציית Android או חבילת בדיקה, מריצה אותה, שולחת לה הקשות על מקשים, מצלמת צילומי מסך של ממשק המשתמש שלה ושומרת את צילומי המסך בתחנת העבודה.

שימו לב: אין יותר תחזוקה ל-API ‏monkeyrunner. מומלץ להשתמש במקום זאת במסגרת הבדיקות UI Automator.

הכלי monkeyrunner לא קשור לכלי לבדיקת ממשק משתמש/אפליקציות, שנקרא גם הכלי monkey. הכלי monkey פועל במעטפת adb ישירות במכשיר או באמולטור, ומייצר זרמים פסאודו-אקראיים של אירועים שקשורים למשתמש ולמערכת. לעומת זאת, כלי monkeyrunner שולט במכשירים ובאמולטורים מתחנת עבודה על ידי שליחת פקודות ואירועים ספציפיים מ-API.

הכלי monkeyrunner מספק את התכונות הבאות לבדיקות ב-Android:

  • שליטה במספר מכשירים: באמצעות monkeyrunner API אפשר להחיל חבילת בדיקות אחת או יותר על מספר מכשירים או אמולטורים. אפשר לחבר פיזית את כל המכשירים או להפעיל את כל האמולטורים (או את שניהם) בבת אחת, להתחבר לכל אחד מהם בתורו באופן פרוגרמטי, ואז להריץ בדיקה אחת או יותר. אפשר גם להפעיל תוכנה להגדרת אמולטור באופן פרוגרמטי, להריץ בדיקה אחת או יותר ואז לסגור את האמולטור.
  • בדיקות פונקציונליות: monkeyrunner יכול להריץ בדיקה אוטומטית של אפליקציית Android מתחילתה ועד סופה. אתם מספקים ערכי קלט באמצעות הקשות או אירועי מגע, ורואים את התוצאות בצילומי מסך.
  • בדיקת רגרסיה: monkeyrunner יכול לבדוק את יציבות האפליקציה על ידי הפעלת אפליקציה והשוואת צילומי המסך של הפלט שלה לסדרה של צילומי מסך שידוע שהם נכונים.
  • אוטומציה ניתנת להרחבה: מכיוון ש-monkeyrunner היא ערכת כלים של API, אפשר לפתח מערכת של מודולים ותוכניות מבוססי Python לשליטה במכשירי Android. בנוסף לשימוש ב-monkeyrunner API עצמו, אפשר להשתמש במודולים הרגילים של Python ‏os ו-subprocess כדי לקרוא לכלים של Android, כמו Android Debug Bridge.

    אפשר גם להוסיף כיתות משלכם ל-monkeyrunner API. הסבר מפורט יותר מופיע בקטע הרחבת 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')

‫monkeyrunner API

monkeyrunner API כלול בשלושה מודולים בחבילה com.android.monkeyrunner:

  • MonkeyRunner: מחלקה של שיטות עזר לתוכניות monkeyrunner. בכיתה הזו יש שיטה לחיבור monkeyrunner למכשיר או לאמולטור. בנוסף, הוא מספק שיטות ליצירת ממשקי משתמש לתוכנית monkeyrunner ולהצגת העזרה המובנית.
  • MonkeyDevice: מייצג מכשיר או אמולטור. המחלקות האלה מספקות שיטות להתקנה ולהסרה של חבילות, להפעלת פעילות ולשליחת אירועים של מקלדת או מגע לאפליקציה. אפשר גם להשתמש במחלקות האלה כדי להריץ חבילות בדיקה.
  • MonkeyImage: מייצג תמונה של צילום מסך. במחלקת ה-class הזו יש שיטות לצילום מסכים, להמרת תמונות bitmap לפורמטים שונים, להשוואה בין שני אובייקטים מסוג MonkeyImage ולכתיבת תמונה לקובץ.

בתוכנית Python, ניגשים לכל מחלקה בתור מודול Python. monkeyrunner הכלי לא מייבא את המודולים האלה באופן אוטומטי. כדי לייבא מודול, משתמשים בהצהרת from של Python:

from com.android.monkeyrunner import <module>

כאשר <module> הוא שם הכיתה שרוצים לייבא. אפשר לייבא יותר ממודול אחד באותה הצהרת from על ידי הפרדה בין שמות המודולים באמצעות פסיקים.

הרצת monkeyrunner

אפשר להריץ תוכניות monkeyrunner מקובץ או על ידי הזנת הצהרות monkeyrunner בסשן אינטראקטיבי. כדי לעשות את שתי הפעולות האלה, מפעילים את הפקודה monkeyrunner שנמצאת בספריית המשנה tools/ של ספריית ה-SDK. אם מספקים שם קובץ כארגומנט, הפקודה monkeyrunner מריצה את תוכן הקובץ כתוכנית Python. אחרת, היא מפעילה סשן אינטראקטיבי.

התחביר של הפקודה monkeyrunner הוא:

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

בטבלה 1 מוסברים הדגלים והארגומנטים של monkeyrunner.

טבלה 1. monkeyrunner דגלים וארגומנטים

ארגומנט תיאור
-plugin <plugin_jar> (אופציונלי) מציין קובץ JAR שמכיל פלאגין ל-monkeyrunner. מידע נוסף על monkeyrunner פלאגינים זמין בקטע הרחבת monkeyrunner באמצעות פלאגינים. כדי לציין יותר מקובץ אחד, צריך לכלול את הארגומנט כמה פעמים.
<program_filename> אם מספקים את הארגומנט הזה, הפקודה monkeyrunner מריצה את התוכן של הקובץ כתוכנית Python. אחרת, הפקודה תתחיל סשן אינטראקטיבי.
<program_options> (אופציונלי) דגלים וארגומנטים לתוכנית ב-<program_file>.

עזרה מובנית ב-monkeyrunner

כדי ליצור הפניית API ל-monkeyrunner, מריצים את הפקודה:

monkeyrunner help.py <format> <outfile>

הארגומנטים הם:

  • <format> הוא text אם הפלט הוא טקסט פשוט או html אם הפלט הוא HTML.
  • <outfile> הוא שם מלא של קובץ הפלט.

הרחבת monkeyrunner באמצעות פלאגינים

אפשר להרחיב את monkeyrunner API באמצעות מחלקות שכותבים ב-Java ובונים לקובץ JAR אחד או יותר. אתם יכולים להשתמש בתכונה הזו כדי להרחיב את monkeyrunner API עם מחלקות משלכם או כדי להרחיב את המחלקות הקיימות. אפשר להשתמש בתכונה הזו גם כדי לאתחל את סביבת monkeyrunner.

כדי לספק פלאגין ל-monkeyrunner, מפעילים את הפקודה monkeyrunner עם הארגומנט -plugin <plugin_jar> שמתואר בטבלה 1.

בקוד של התוסף, אפשר לייבא ולהרחיב את המחלקות הראשיות monkeyrunner, MonkeyImage ו-MonkeyRunner ב-com.android.monkeyrunner (ראו את הקטע בנושא monkeyrunner API).MonkeyDevice

שימו לב: פלאגינים לא נותנים לכם גישה ל-Android SDK. אי אפשר לייבא חבילות כמו com.android.app. הסיבה לכך היא ש-monkeyrunner פועל עם המכשיר או האמולטור מתחת לרמה של ממשקי ה-API של המסגרת.

הכיתה להפעלת הפלאגין

קובץ ה-JAR של פלאגין יכול לציין מחלקה שמופעלת לפני שתהליך העיבוד של הסקריפט מתחיל. כדי לציין את המחלקה הזו, מוסיפים את המפתח MonkeyRunnerStartupRunner למניפסט של קובץ ה-JAR. כערך, משתמשים בשם של הכיתה להפעלה בעת ההפעלה. בקטע הקוד הבא אפשר לראות איך עושים את זה בסקריפט build של 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;
    }
}