Monkeyrunner

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

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

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

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

monkeyrunner มีฟีเจอร์ต่อไปนี้สำหรับการทดสอบ Android

  • การควบคุมอุปกรณ์หลายเครื่อง: monkeyrunner API สามารถใช้ชุดการทดสอบอย่างน้อย 1 ชุดในอุปกรณ์หรือโปรแกรมจำลองหลายเครื่องได้ คุณสามารถเชื่อมต่ออุปกรณ์ทั้งหมด หรือเปิดโปรแกรมจำลองทั้งหมด (หรือทั้ง 2 อย่าง) พร้อมกัน เชื่อมต่อกับแต่ละโปรแกรมตามลำดับ โดยใช้โปรแกรม จากนั้นเรียกใช้การทดสอบอย่างน้อย 1 รายการ นอกจากนี้ คุณยังเริ่มโปรแกรมกำหนดค่าโปรแกรมจำลอง โดยอัตโนมัติ เรียกใช้การทดสอบอย่างน้อย 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')

API ของ monkeyrunner

monkeyrunner API อยู่ใน 3 โมดูลในแพ็กเกจ com.android.monkeyrunner ดังนี้

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

ในโปรแกรม Python คุณจะเข้าถึงแต่ละคลาสเป็นโมดูล Python monkeyrunner เครื่องมือจะไม่นำเข้าโมดูลเหล่านี้โดยอัตโนมัติ หากต้องการนำเข้าโมดูล ให้ใช้คำสั่ง Python from

from com.android.monkeyrunner import <module>

โดยที่ <module> คือชื่อชั้นเรียนที่ต้องการนำเข้า คุณสามารถนำเข้าโมดูลมากกว่า 1 โมดูลในคำสั่ง from เดียวกันได้โดยคั่นชื่อโมดูลด้วย คอมมา

เรียกใช้ monkeyrunner

คุณสามารถเรียกใช้โปรแกรม monkeyrunner จากไฟล์หรือโดยการป้อนคำสั่ง monkeyrunner ในเซสชันแบบอินเทอร์แอกทีฟก็ได้ คุณทำทั้ง 2 อย่างได้โดยเรียกใช้คำสั่ง 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 ด้วยปลั๊กอิน

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

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

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

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

คลาสเริ่มต้นของปลั๊กอิน

ไฟล์ JAR สำหรับปลั๊กอินสามารถระบุคลาสที่สร้างอินสแตนซ์ก่อนเริ่มการประมวลผลสคริปต์ได้ หากต้องการระบุคลาสนี้ ให้เพิ่มคีย์ MonkeyRunnerStartupRunner ลงใน Manifest ของไฟล์ 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> ได้ ตัวอย่างเช่น คลาสนี้ จะตั้งค่าตัวแปรบางอย่างในเนมสเปซเริ่มต้น

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