קוף

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

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

זהירות: ה-API של monkeyrunner לא מתוחזק. מומלץ להשתמש הכלי סורק אפליקציות או יוצר אוטומטי של ממשק משתמש (UI) אלא את המסגרת הרעיונית.

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

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

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

    אתם יכולים גם להוסיף כיתות משלכם ל-API של monkeyrunner. הדבר שמתוארים בפירוט הקטע Extend monkeyrunner באמצעות יישומי פלאגין

הכלי monkeyrunner משתמש ב Jython, יישום של Python שמשתמש בשפת Java. Jython מאפשר ממשק API של monkeyrunner יכול ליצור אינטראקציה בקלות עם framework של Android. עם Jython, יכול להשתמש בתחביר Python כדי לגשת לקבועים, למחלקות ולשיטות של ה-API.

תוכנית פשוטה של קוף

הנה תוכנה פשוטה של 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')

ממשק ה-API של Monkeyrunner

ה-API monkeyrunner נמצא בשלושה מודולים חבילת com.android.monkeyrunner:

  • MonkeyRunner: סוג של שיטות עזר לתוכנות monkeyrunner. בכיתה הזו יש שיטה לחיבור monkeyrunner למכשיר או לאמולטור. הוא גם מספק שיטות ליצירת ממשקי משתמש לתוכנית monkeyrunner ולהצגת לקבלת עזרה מובנית.
  • MonkeyDevice: מייצג מכשיר או אמולטור. בכיתה הזו יש שיטות להתקנה הסרת חבילות, התחלת פעילות ושליחת אירועי מקלדת או מגע אל אפליקציה. אפשר להשתמש בכיתה הזו גם כדי להריץ חבילות בדיקה.
  • MonkeyImage: מייצג תמונה של צילום מסך. בכיתה הזו יש שיטות לצילום מסכים המרת תמונות של מפת סיביות (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>.

עזרה מובנית לקוף

אפשר ליצור הפניית API בשביל monkeyrunner באמצעות הרצה של:

monkeyrunner help.py <format> <outfile>

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

  • <format> הוא text לפלט טקסט פשוט או html לפלט HTML.
  • <outfile> הוא שם ייחודי לנתיב של קובץ הפלט.

הרחבת Monkeyrunner באמצעות יישומי פלאגין

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

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

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

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

סיווג ההפעלה של יישומי הפלאגין

קובץ ה-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;
    }
}