Monkeyrunner

เครื่องมือ monkeyrunner เดิมมี API สำหรับการเขียนโปรแกรมที่ควบคุม อุปกรณ์ Android หรือโปรแกรมจำลองจากภายนอกโค้ด Android

เครื่องมือ monkeyrunner ออกแบบมาเพื่อทดสอบแอปและอุปกรณ์เป็นหลัก ที่ระดับการทำงาน/เฟรมเวิร์ก และสำหรับการเรียกใช้ชุดทดสอบ 1 หน่วย แต่คุณสามารถใช้ เพื่อวัตถุประสงค์อื่นๆ เมื่อใช้ monkeyrunner คุณจะสามารถเขียนโปรแกรม Python ที่ติดตั้งแอป Android หรือแพ็กเกจทดสอบ เรียกใช้ ส่งการกดแป้นพิมพ์ ถ่ายภาพหน้าจอของอินเทอร์เฟซผู้ใช้และจัดเก็บภาพหน้าจอบนเวิร์กสเตชัน

ข้อควรระวัง: monkeyrunner API ไม่ได้รับการบำรุงรักษา เราขอแนะนำให้ใช้ เครื่องมือโปรแกรมรวบรวมข้อมูลแอปหรือ เครื่องมือสร้าง UI อัตโนมัติ เฟรมเวิร์กการทดสอบแทน

เครื่องมือ monkeyrunner ไม่เกี่ยวข้องกับ Monkey ตัวดำเนินการของ UI/แอปพลิเคชัน หรือเรียกอีกอย่างว่าเครื่องมือ monkey เครื่องมือ monkey จะทำงานใน adb Shell โดยตรงบน อุปกรณ์หรือโปรแกรมจำลอง และสร้างสตรีมจำลองของเหตุการณ์ผู้ใช้และเหตุการณ์ระบบแบบสุ่ม เมื่อเปรียบเทียบกันแล้ว เครื่องมือ monkeyrunner จะควบคุมอุปกรณ์และโปรแกรมจำลองจากเวิร์กสเตชันโดยการส่ง คำสั่งและเหตุการณ์ที่เฉพาะเจาะจงจาก API

เครื่องมือ monkeyrunner มีฟีเจอร์เหล่านี้สำหรับการทดสอบ Android

  • ระบบควบคุมอุปกรณ์หลายเครื่อง: monkeyrunner API จะใช้ได้เพียง 1 รายการหรือมากกว่านั้น ชุดทดสอบในอุปกรณ์หรือโปรแกรมจำลองต่างๆ คุณต่อพ่วงอุปกรณ์ทั้งหมดได้ หรือเริ่มต้นโปรแกรมจำลองทั้งหมด (หรือทั้ง 2 อย่าง) พร้อมกัน แล้วเชื่อมต่อทีละตัว แบบเป็นโปรแกรม แล้วเรียกใช้การทดสอบอย่างน้อย 1 รายการ คุณยังสามารถเริ่มใช้โปรแกรมจำลอง กำหนดค่าแบบเป็นโปรแกรม เรียกใช้การทดสอบอย่างน้อยหนึ่งรายการ จากนั้นจึงปิดโปรแกรมจำลอง
  • การทดสอบการทำงาน: 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 ออบเจ็กต์ โปรแกรมจะติดตั้งแอปพลิเคชัน Android โดยใช้ออบเจ็กต์ MonkeyDevice ดำเนินกิจกรรมใดกิจกรรมหนึ่งของแพ็กเกจ และส่งเหตุการณ์สำคัญไปยังกิจกรรม จากนั้นโปรแกรมจะถ่ายภาพหน้าจอของผลลัพธ์เพื่อสร้าง ออบเจ็กต์ 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 มีอยู่ใน 3 โมดูลใน แพ็กเกจ com.android.monkeyrunner:

  • MonkeyRunner: คลาสของวิธีการยูทิลิตีสำหรับ monkeyrunner โปรแกรม ชั้นเรียนนี้จะมี วิธีการเชื่อมต่อ monkeyrunner กับอุปกรณ์หรือโปรแกรมจำลอง และยังมี วิธีสร้าง UI สำหรับโปรแกรม monkeyrunner และแสดง ความช่วยเหลือในตัว
  • MonkeyDevice: หมายถึงอุปกรณ์หรือโปรแกรมจำลอง คลาสนี้บอกวิธีติดตั้งและ การถอนการติดตั้งแพ็กเกจ การเริ่มกิจกรรม และส่งกิจกรรมแป้นพิมพ์หรือการแตะไปยัง แอป นอกจากนี้ คุณยังสามารถใช้คลาสนี้เพื่อเรียกใช้แพ็กเกจการทดสอบ
  • MonkeyImage: แสดงรูปภาพที่จับภาพหน้าจอ ชั้นเรียนนี้มีวิธีการจับภาพหน้าจอ แปลงรูปภาพบิตแมปเป็นรูปแบบต่างๆ และเปรียบเทียบออบเจ็กต์ MonkeyImage 2 รายการ และ การเขียนรูปภาพลงในไฟล์

ในโปรแกรม 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 ด้วยปลั๊กอิน หากต้องการระบุไฟล์มากกว่า 1 ไฟล์ ให้ใส่อาร์กิวเมนต์หลายครั้ง
<program_filename> หากคุณระบุอาร์กิวเมนต์นี้ คำสั่ง monkeyrunner จะเรียกใช้เนื้อหา ของไฟล์เป็นโปรแกรม Python มิฉะนั้น คำสั่งจะเริ่มต้น เซสชันแบบอินเทอร์แอกทีฟ
<program_options> (ไม่บังคับ) แฟล็กและอาร์กิวเมนต์สำหรับโปรแกรมใน <program_file>.

ความช่วยเหลือในตัวของ monkeyrunner

คุณสามารถสร้างการอ้างอิง API สำหรับ monkeyrunner โดยเรียกใช้:

monkeyrunner help.py <format> <outfile>

อาร์กิวเมนต์มีดังนี้

  • <format> เป็น text สำหรับเอาต์พุตข้อความธรรมดา หรือ html สำหรับเอาต์พุต HTML
  • <outfile> คือชื่อที่มีคุณสมบัติพาธสำหรับไฟล์เอาต์พุต

ขยาย Monkeyrunner ด้วยปลั๊กอิน

คุณสามารถขยาย API ของ monkeyrunner ด้วยคลาสที่คุณเขียนใน Java และสร้างเป็นไฟล์ JAR อย่างน้อย 1 ไฟล์ คุณใช้ฟีเจอร์นี้เพื่อขยาย monkeyrunner API พร้อมกับชั้นเรียนของคุณเองหรือขยายชั้นเรียนที่มีอยู่ คุณ นอกจากนี้ยังใช้ฟีเจอร์นี้เพื่อเริ่มต้นสภาพแวดล้อม monkeyrunner ได้ด้วย

หากต้องการระบุปลั๊กอินให้กับ monkeyrunner ให้เรียกใช้คำสั่ง monkeyrunner ด้วยอาร์กิวเมนต์ -plugin <plugin_jar> ที่อธิบายใน ตาราง 1

คุณสามารถนำเข้าและขยายคลาส monkeyrunner หลักได้ในโค้ดปลั๊กอิน MonkeyDevice, MonkeyImage และ MonkeyRunner ใน com.android.monkeyrunner (ดูหัวข้อเกี่ยวกับ monkeyrunner API)

โปรดทราบว่าปลั๊กอินไม่ได้ให้สิทธิ์เข้าถึง Android SDK แก่คุณ คุณไม่สามารถนำเข้าแพ็กเกจได้ เช่น com.android.app เนื่องจาก monkeyrunner โต้ตอบกับ อุปกรณ์หรือโปรแกรมจำลองที่ต่ำกว่าระดับ API ของเฟรมเวิร์ก

ชั้นเรียนเริ่มต้นปลั๊กอิน

ไฟล์ JAR สำหรับปลั๊กอินสามารถระบุคลาสที่มีการสร้างอินสแตนซ์ก่อน การประมวลผลสคริปต์จะเริ่มต้น หากต้องการระบุคลาสนี้ ให้เพิ่มคีย์ MonkeyRunnerStartupRunner ลงในไฟล์ JAR ไฟล์ Manifest สำหรับค่า ให้ใช้ชื่อชั้นเรียนเพื่อเรียกใช้เมื่อเริ่มต้นใช้งาน ดังต่อไปนี้ ตัวอย่างข้อมูลแสดงวิธีการดำเนินการนี้ภายในสคริปต์บิลด์ ant

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


หากต้องการเข้าถึงสภาพแวดล้อมรันไทม์ของเครื่องมือ monkeyrunner คลาสสตาร์ทอัพสามารถใช้ com.google.common.base.Predicate<PythonInterpreter> ตัวอย่างเช่น รายการนี้ class จะตั้งค่าตัวแปรบางอย่างในเนมสเปซเริ่มต้น

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