monkeyrunner

Fitur monkeyrunner menyediakan API untuk program penulisan yang mengontrol emulator atau perangkat Android dari luar kode Android. Dengan monkeyrunner, Anda dapat menulis program Python yang dapat menginstal aplikasi Android atau paket pengujian, menjalankannya, mengirimkan tombol kepadanya, mengambil screenshot antarmuka penggunanya, dan menyimpan screenshot di workstation. Utamanya, fitur monkeyrunner dirancang untuk menguji aplikasi dan perangkat pada tingkat fungsional/framework, serta untuk menjalankan paket pengujian unit, tetapi Anda bisa menggunakannya untuk tujuan lain.

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

Fitur monkeyrunner menyediakan fitur unik ini untuk pengujian Android:

  • Kontrol beberapa perangkat: monkeyrunner API dapat menerapkan satu atau beberapa paket pengujian di berbagai perangkat atau emulator. Anda dapat secara fisik menautkan semua perangkat atau memulai semua emulator (atau keduanya) sekaligus, terhubung ke setiap perangkat secara bergiliran dan terprogram, lalu menjalankan satu atau beberapa pengujian. Anda juga dapat memulai konfigurasi emulator secara terprogram, menjalankan satu atau beberapa pengujian, 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 outputnya dengan serangkaian screenshot yang terbukti benar.
  • Otomatisasi yang dapat diperluas - Karena monkeyrunner adalah toolkit API, Anda dapat mengembangkan seluruh modul dan program sistem berbasis Python untuk mengontrol perangkat Android. Selain menggunakan monkeyrunner API, Anda dapat menggunakan modul os dan subprocess Python standar untuk memanggil fitur Android seperti Android Debug Bridge.

    Anda juga dapat menambahkan class Anda sendiri ke monkeyrunner API. Ini dijelaskan secara lebih detail di bagian Memperluas monkeyrunner dengan plugin.

Fitur monkeyrunner menggunakan Jython, implementasi Python yang menggunakan bahasa pemrograman Java. Jython memungkinkan monkeyrunner API untuk secara mudah berinteraksi dengan framework Android. Dengan Jython, Anda dapat menggunakan sintaks Python untuk mengakses konstanta, class, dan metode API.

Program monkeyrunner sederhana

Berikut adalah program monkeyrunner sederhana yang terhubung ke perangkat, membuat objek MonkeyDevice. Dengan menggunakan objek MonkeyDevice, program akan menginstal paket aplikasi Android, menjalankan salah satu aktivitasnya, dan mengirimkan peristiwa tombol ke aktivitas tersebut. Kemudian program 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
    # to see if 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 termuat dalam tiga modul dalam 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 untuk membuat UI untuk program monkeyrunner dan untuk menampilkan bantuan bawaan.
  • MonkeyDevice: Menunjukkan perangkat atau emulator. Class ini menyediakan metode untuk menginstal dan meng-uninstal paket, memulai suatu Aktivitas, dan mengirim keyboard atau peristiwa sentuh ke aplikasi. Anda juga menggunakan class ini untuk menjalankan paket pengujian.
  • MonkeyImage: Menunjukkan gambar screenshot layar. Class ini menyediakan metode untuk mengambil screenshot layar, mengonversi gambar bitmap ke berbagai format, membandingkan dua objek MonkeyImage, dan menulis gambar menjadi file.

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

    from com.android.monkeyrunner import <module>
    

di mana <module> adalah nama class yang akan 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 memasukkan pernyataan monkeyrunner dalam sesi interaktif. Lakukan 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; atau, monkeyrunner akan memulai sesi interaktif.

Sintaks perintah monkeyrunner adalah

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

Tabel 1 menjelaskan tanda dan argumen.

Tabel 1. tanda dan argumen monkeyrunner.

Argumen Deskripsi
-plugin <plugin_jar> (Opsional) Menentukan file .jar yang berisi plugin untuk monkeyrunner. Untuk mempelajari plugin monkeyrunner lebih lanjut, lihat 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 argumen tidak disediakan, perintah akan memulai sesi interaktif.
<program_options> (Opsional) Tanda 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 memenuhi syarat lokasi untuk file output.

Memperluas monkeyrunner dengan plugin

Anda dapat memperluas monkeyrunner API dengan class yang ditulis dalam bahasa pemrograman Java dan dibuat menjadi satu atau beberapa file .jar. Anda dapat menggunakan fitur ini untuk memperluas monkeyrunner API dengan class Anda sendiri atau untuk memperluas class yang ada. Anda juga dapat menggunakan fitur ini untuk menginisialisasi lingkungan monkeyrunner.

Untuk memberikan 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 MonkeyDevice, MonkeyImage, dan MonkeyRunner di com.android.monkeyrunner (lihat monkeyrunner API).

Perlu diperhatikan bahwa plugin tidak memberi Anda akses ke Android SDK. Anda tidak dapat mengimpor paket seperti com.android.app. 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. Nilai harus berupa nama class yang akan dijalankan saat startup. Cuplikan berikut menunjukkan cara menambahkan plugin 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 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;
        }
    }