monkeyrunner

Alat monkeyrunner lama menyediakan API untuk program penulisan yang mengontrol emulator atau perangkat Android dari luar kode Android.

Alat monkeyrunner terutama dirancang untuk menguji aplikasi dan perangkat pada tingkat fungsional/framework dan untuk menjalankan suite pengujian unit, tetapi Anda dapat menggunakannya untuk tujuan lain. Dengan monkeyrunner, Anda dapat menulis program Python yang menginstal dan menjalankan aplikasi Android atau paket pengujian, mengirimkan penekanan tombol ke aplikasi, mengambil screenshot antarmuka pengguna aplikasi, dan menyimpan screenshot di workstation.

Perhatian: monkeyrunner API tidak dipertahankan. Sebaiknya gunakan alat Crawler Aplikasi atau framework pengujian UI Automator.

Alat monkeyrunner tidak ada kaitannya dengan UI/Application Exerciser Monkey, yang juga dikenal sebagai alat monkey. Alat monkey berjalan di shell adb secara langsung pada perangkat atau emulator serta menghasilkan aliran pseudo-random peristiwa pengguna dan sistem. Sebagai perbandingan, alat monkeyrunner mengontrol perangkat dan emulator dari workstation dengan mengirimkan perintah dan peristiwa khusus dari API.

Alat monkeyrunner menyediakan fitur berikut untuk pengujian Android:

  • Kontrol beberapa perangkat: monkeyrunner API dapat menerapkan satu rangkaian pengujian atau lebih di beberapa perangkat atau emulator. Anda dapat secara fisik menautkan semua perangkat atau memulai semua emulator (atau keduanya) secara bersamaan, terhubung ke setiap perangkat secara bergiliran dan terprogram, lalu menjalankan satu pengujian atau lebih. Anda juga dapat memulai konfigurasi emulator secara terprogram, menjalankan satu pengujian atau lebih, lalu mematikan emulator.
  • Pengujian fungsional: monkeyrunner dapat menjalankan pengujian aplikasi Android dari awal sampai akhir secara otomatis. Anda memberikan nilai input dengan tombol atau peristiwa sentuh, dan melihat hasilnya sebagai screenshot.
  • Pengujian regresi: monkeyrunner dapat menguji stabilitas aplikasi dengan menjalankan aplikasi dan membandingkan screenshot output-nya dengan serangkaian screenshot yang telah terbukti benar.
  • Otomatisasi yang dapat diperluas: Karena monkeyrunner adalah toolkit API, Anda dapat mengembangkan sistem modul dan program berbasis Python untuk mengontrol perangkat Android. Selain menggunakan monkeyrunner API, Anda dapat menggunakan modul os dan subprocess Python standar untuk memanggil alat Android seperti Android Debug Bridge.

    Anda juga dapat menambahkan class versi Anda sendiri ke monkeyrunner API. Cara untuk menambahkannya dijelaskan secara lebih detail di bagian Memperluas monkeyrunner dengan plugin.

Alat monkeyrunner menggunakan Jython, implementasi Python yang menggunakan bahasa pemrograman Java. Jython memudahkan monkeyrunner API berinteraksi dengan framework Android. Dengan Jython, Anda dapat menggunakan sintaksis Python untuk mengakses konstanta, class, dan metode API.

Program monkeyrunner sederhana

Berikut adalah program monkeyrunner sederhana yang terhubung ke sebuah perangkat sehingga membuat objek MonkeyDevice. Dengan menggunakan objek MonkeyDevice, program ini akan menginstal paket aplikasi Android, menjalankan salah satu aktivitasnya, dan mengirimkan peristiwa utama ke aktivitas tersebut. Setelah itu, program akan mengambil screenshot hasilnya dan membuat objek MonkeyImage. Dari objek inilah program akan menulis file PNG yang berisi screenshot.

# 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 dimuat dalam tiga modul di paket com.android.monkeyrunner:

  • MonkeyRunner: Class metode utilitas untuk program monkeyrunner. Class ini menyediakan metode untuk menghubungkan monkeyrunner ke perangkat atau emulator. Class ini juga menyediakan metode guna membuat UI untuk program monkeyrunner dan menampilkan bantuan bawaan.
  • MonkeyDevice: Menampilkan perangkat atau emulator. Class ini menyediakan metode untuk menginstal dan meng-uninstal paket, memulai Aktivitas, dan mengirim keyboard atau peristiwa sentuh ke aplikasi. Anda juga akan menggunakan class ini untuk menjalankan paket pengujian.
  • MonkeyImage: Menampilkan gambar screenshot. Class ini menyediakan metode untuk mengambil screenshot, mengonversi gambar bitmap ke berbagai format, membandingkan dua objek MonkeyImage, dan menulis gambar ke file.

Di program Python, Anda mengakses setiap class sebagai modul Python. Alat monkeyrunner tidak mengimpor modul ini secara otomatis. Untuk mengimpor modul, gunakan pernyataan from Python:

from com.android.monkeyrunner import <module>

Dengan <module> adalah nama class yang ingin Anda impor. Anda dapat mengimpor lebih dari satu modul dalam pernyataan from yang sama dengan memisahkan nama modul dengan koma.

Menjalankan monkeyrunner

Anda dapat menjalankan program monkeyrunner dari file atau dengan memasukkan pernyataan monkeyrunner dalam sesi interaktif. Anda dapat melakukan keduanya dengan memanggil perintah monkeyrunner yang ditemukan di subdirektori tools/ dari direktori SDK Anda. Jika Anda memberikan nama file sebagai argumen, perintah monkeyrunner akan menjalankan konten file sebagai program Python; jika tidak, sesi interaktif akan dimulai.

Berikut adalah sintaksis perintah monkeyrunner:

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

Tabel 1 menjelaskan flag dan argumen monkeyrunner.

Tabel 1. Flag dan argumen monkeyrunner

Argumen Deskripsi
-plugin <plugin_jar> (Opsional) Menentukan file JAR yang berisi plugin untuk monkeyrunner. Untuk mempelajari plugin monkeyrunner lebih lanjut, baca bagian Memperluas monkeyrunner dengan plugin. Untuk menentukan lebih dari satu file, sertakan argumen ini beberapa kali.
<program_filename> Jika Anda menyediakan argumen ini, perintah monkeyrunner akan menjalankan konten file sebagai program Python. Jika tidak, perintah akan memulai sesi interaktif.
<program_options> (Opsional) Flag dan argumen untuk program di <program_file>.

Bantuan bawaan monkeyrunner

Anda dapat membuat referensi API untuk monkeyrunner dengan menjalankan:

monkeyrunner help.py <format> <outfile>

Argumennya adalah:

  • <format> adalah text untuk output teks biasa atau html untuk output HTML.
  • <outfile> adalah nama yang menentukan jalur untuk file output.

Memperluas monkeyrunner dengan plugin

Anda dapat memperluas monkeyrunner API dengan class yang ditulis di Java dan di-build menjadi satu atau beberapa file JAR. Anda dapat menggunakan fitur ini untuk memperluas monkeyrunner API dengan class Anda sendiri atau untuk memperluas class yang sudah ada. Anda juga dapat menggunakan fitur ini untuk melakukan inisialisasi lingkungan monkeyrunner.

Untuk menyediakan plugin ke monkeyrunner, panggil perintah monkeyrunner dengan argumen -plugin <plugin_jar> yang dijelaskan dalam tabel 1.

Dalam kode plugin, Anda dapat mengimpor dan memperluas class monkeyrunner utama, yaitu MonkeyDevice, MonkeyImage, dan MonkeyRunner di com.android.monkeyrunner (lihat bagian tentang monkeyrunner API).

Perhatikan bahwa plugin tidak memberi Anda akses ke Android SDK. Anda tidak dapat mengimpor paket seperti com.android.app. Hal ini karena monkeyrunner berinteraksi dengan perangkat atau emulator di bawah level API framework.

Class startup plugin

File JAR untuk plugin dapat menentukan class yang dibuat sebelum pemrosesan skrip dimulai. Untuk menentukan class ini, tambahkan kunci MonkeyRunnerStartupRunner ke manifes file JAR. Untuk nilai, gunakan nama class agar dapat dijalankan saat memulai. Cuplikan berikut menunjukkan cara melakukannya dalam skrip build ant:

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


Untuk mendapatkan akses ke lingkungan runtime alat monkeyrunner, class startup dapat mengimplementasikan com.google.common.base.Predicate<PythonInterpreter>. Misalnya, class ini menetapkan beberapa variabel dalam namespace default:

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