monkeyrunner

Công cụ monkeyrunner cũ cung cấp API để viết các chương trình điều khiển thiết bị Android hoặc trình mô phỏng từ bên ngoài mã Android.

Công cụ monkeyrunner chủ yếu được thiết kế để kiểm thử các ứng dụng và thiết bị ở cấp chức năng/khung và chạy các bộ kiểm thử đơn vị nhưng bạn có thể sử dụng công cụ này cho các mục đích khác. Với monkeyrunner, bạn có thể viết một chương trình Python để cài đặt ứng dụng Android hoặc kiểm thử, chạy gói, thực hiện các thao tác nhấn phím, chụp ảnh màn hình giao diện người dùng và lưu trữ ảnh chụp màn hình trên máy trạm.

Thận trọng: API monkeyrunner không được duy trì. Bạn nên sử dụng công cụ Trình thu thập thông tin của ứng dụng hoặc khung kiểm thử Công cụ tự động hoá giao diện người dùng.

Công cụ monkeyrunner không liên quan đến Trình kiểm thử ứng dụng/giao diện người dùng Monkey, hay còn gọi là công cụ monkey. Công cụ monkey chạy trực tiếp trong môi trường (shell) adb trên thiết bị hoặc trình mô phỏng và tạo những luồng giả ngẫu nhiên của các sự kiện người dùng và hệ thống. Để so sánh, công cụ monkeyrunner sẽ kiểm soát các thiết bị và trình mô phỏng từ một máy trạm bằng cách gửi các lệnh và sự kiện cụ thể từ API.

Công cụ monkeyrunner cung cấp các tính năng sau cho hoạt động kiểm thử Android:

  • Kiểm soát đa thiết bị: API monkeyrunner có thể áp dụng cho một hoặc nhiều bộ kiểm thử trên nhiều thiết bị hoặc trình mô phỏng. Bạn có thể liên kết vật lý tất cả các thiết bị hoặc khởi động toàn bộ các trình mô phỏng (hoặc cả hai) cùng lúc, kết nối lần lượt từng thiết bị hoặc trình mô phỏng bằng cách lập trình rồi chạy một hoặc nhiều quy trình kiểm thử. Bạn cũng có thể khởi động cấu hình trình mô phỏng bằng cách lập trình, chạy một hoặc nhiều quy trình kiểm thử, sau đó tắt trình mô phỏng.
  • Kiểm thử chức năng: monkeyrunner có thể chạy quy trình kiểm thử tự động từ đầu đến cuối cho một ứng dụng Android. Bạn chỉ cần cung cấp giá trị đầu vào thông qua các lần nhấn phím hoặc các sự kiện chạm rồi xem kết quả dưới dạng ảnh chụp màn hình.
  • Kiểm thử hồi quy: monkeyrunner có thể kiểm thử độ ổn định của ứng dụng bằng cách chạy một ứng dụng và so sánh ảnh chụp màn hình kết quả của ứng dụng đó với một nhóm ảnh chụp màn hình đã được xác định là chính xác.
  • Tự động mở rộng: Do monkeyrunner là một bộ công cụ API nên bạn có thể phát triển một hệ thống gồm các mô-đun và chương trình dựa trên Python để điều khiển các thiết bị Android. Ngoài việc sử dụng chính API monkeyrunner, bạn còn có thể dùng các mô-đun Python tiêu chuẩn ossubprocess để gọi các công cụ Android như Cầu gỡ lỗi Android.

    Bạn cũng có thể thêm các lớp của riêng mình vào API monkeyrunner. Việc này được mô tả chi tiết hơn trong phần Mở rộng tính năng của công cụ monkeyrunner bằng trình bổ trợ.

Công cụ monkeyrunner dùng Jython, một bản triển khai của Python sử dụng ngôn ngữ lập trình Java. Jython cho phép API monkeyrunner tương tác dễ dàng với khung Android. Với Jython, bạn có thể sử dụng cú pháp Python để truy cập các hằng số, lớp và phương thức của API.

Chương trình monkeyrunner đơn giản

Dưới đây là một chương trình monkeyrunner đơn giản kết nối với một thiết bị, tạo ra đối tượng MonkeyDevice. Bằng cách sử dụng đối tượng MonkeyDevice, chương trình này cài đặt gói ứng dụng Android, chạy một trong các hoạt động của chương trình và gửi các sự kiện quan trọng đến hoạt động đó. Sau đó, chương trình sẽ chụp ảnh màn hình kết quả, tạo ra đối tượng MonkeyImage. Với đối tượng này, chương trình sẽ viết một tệp PNG chứa ảnh chụp màn hình.

# 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 có trong 3 mô-đun của gói com.android.monkeyrunner:

  • MonkeyRunner: Một lớp chứa phương thức phần mềm tiện ích cho các chương trình monkeyrunner. Lớp này cung cấp phương thức để kết nối monkeyrunner với một thiết bị hoặc trình mô phỏng. Lớp này cũng cung cấp các phương thức để tạo giao diện người dùng cho chương trình monkeyrunner và hiển thị trợ giúp tích hợp.
  • MonkeyDevice: Đại diện cho một thiết bị hoặc trình mô phỏng. Lớp này cung cấp các phương thức để cài đặt và gỡ cài đặt gói, khởi tạo Hoạt động, gửi sự kiện thao tác trên bàn phím hoặc sự kiện chạm cho ứng dụng. Bạn cũng có thể sử dụng lớp này để chạy các gói kiểm thử.
  • MonkeyImage: Đại diện cho ảnh chụp màn hình. Lớp này cung cấp các phương thức để chụp ảnh màn hình, chuyển đổi hình ảnh bitmap sang các định dạng khác, so sánh 2 đối tượng MonkeyImage và viết hình ảnh vào tệp.

Đối với chương trình Python, bạn truy cập vào từng lớp dưới dạng mô-đun Python. Công cụ monkeyrunner không tự động nhập các mô-đun này. Để nhập một mô-đun, hãy sử dụng câu lệnh from của Python:

from com.android.monkeyrunner import <module>

Trong đó, <module> là tên lớp mà bạn muốn nhập. Bạn có thể nhập nhiều mô-đun trong cùng một câu lệnh from bằng cách phân tách các tên mô-đun bằng dấu phẩy.

Chạy monkeyrunner

Bạn có thể chạy các chương trình monkeyrunner từ một tệp hoặc bằng cách nhập các câu lệnh monkeyrunner vào một phiên tương tác. Bạn thực hiện cả hai thao tác này bằng cách gọi lệnh monkeyrunner trong thư mục con tools/ của thư mục SDK. Nếu bạn cung cấp tên tệp làm đối số, lệnh monkeyrunner sẽ chạy nội dung của tệp dưới dạng chương trình Python; nếu không, quá trình này sẽ bắt đầu một phiên tương tác.

Sau đây là cú pháp của lệnh monkeyrunner:

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

Bảng 1 giải nghĩa cờ và đối số của monkeyrunner.

Bảng 1. Cờ và đối số của monkeyrunner.

Đối số Mô tả
-plugin <plugin_jar> (Không bắt buộc) Chỉ định tệp JAR chứa trình bổ trợ cho monkeyrunner. Để tìm hiểu thêm về trình bổ trợ monkeyrunner, hãy xem phần nội dung Mở rộng tính năng của công cụ monkeyrunner với trình bổ trợ. Để chỉ định nhiều tệp, hãy chèn đối số đó nhiều lần.
<program_filename> Nếu bạn cung cấp đối số này, thì lệnh monkeyrunner sẽ chạy nội dung của tệp như một chương trình Python. Còn không, lệnh này sẽ bắt đầu một phiên tương tác.
<program_options> (Không bắt buộc) Cờ và đối số của chương trình trong <program_file>.

Trợ giúp tích hợp sẵn monkeyrunner

Bạn có thể tạo một tham chiếu API cho monkeyrunner bằng cách chạy:

monkeyrunner help.py <format> <outfile>

Các đối số bao gồm:

  • <format> có thể là text đối với đầu ra văn bản thuần tuý hoặc html đối với đầu ra là HTML.
  • <outfile> là tên đường dẫn hợp lệ của tệp đầu ra.

Mở rộng tính năng của công cụ monkeyrunner với trình bổ trợ

Bạn có thể mở rộng monkeyrunner API bằng các lớp bạn viết trong Java rồi tạo thành một hoặc nhiều tệp JAR. Bạn có thể sử dụng tính năng này để mở rộng monkeyrunner API với các lớp riêng hoặc mở rộng các lớp hiện có. Bạn cũng có thể dùng tính năng này để khởi động môi trường monkeyrunner.

Để cung cấp một trình bổ trợ cho monkeyrunner, hãy gọi lệnh monkeyrunner với đối số -plugin <plugin_jar> được mô tả trong bảng 1.

Trong mã trình bổ trợ, bạn có thể nhập và mở rộng các lớp monkeyrunner chính là MonkeyDevice, MonkeyImageMonkeyRunner trong com.android.monkeyrunner (xem phần về monkeyrunner API).

Lưu ý rằng các trình bổ trợ không cấp cho bạn quyền truy cập vào SDK Android. Bạn không thể nhập các gói như com.android.app. Điều này là do monkeyrunner tương tác với thiết bị hoặc trình mô phỏng ở dưới cấp độ của các API khung.

Lớp khởi động trình bổ trợ

Tệp JAR của một trình bổ trợ có thể chỉ định lớp được tạo trước khi quá trình xử lý tập lệnh bắt đầu. Để chỉ định lớp này, hãy thêm khoá MonkeyRunnerStartupRunner vào tệp kê khai của tệp JAR. Đối với giá trị nói trên, hãy sử dụng tên lớp để chạy khi khởi động. Đoạn mã sau đây cho biết cách thực hiện việc này trong tập lệnh bản dựng ant:

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

Để có quyền truy cập vào môi trường thời gian chạy của công cụ monkeyrunner, lớp khởi động có thể triển khai com.google.common.base.Predicate<PythonInterpreter>. Ví dụ: lớp này thiết lập một số biến trong không gian tên mặc định:

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