MonkeyRunner

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

Công cụ kiểm thử 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. Với monkeyrunner, bạn có thể dùng một chương trình Python để cài đặt, chạy hoặc gửi tổ hợp phím hay chụp ảnh màn hình giao diện người dùng từ một ứng dụng hoặc gói kiểm thử Android rồi lưu trữ ảnh chụp màn hình đó trên máy trạm. 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ị, dù vậy bạn vẫn có thể dùng công cụ này cho các mục đích khác.

Thận trọng: monkeyrunner API không được duy trì. Thay vào đó, bạn nên sử dụng khung kiểm thử Công cụ tự động hóa giao diện người dùng.

Công cụ monkeyrunner không liên quan đến Giao diện người dùng/Ứng dụng Exerciser 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 ra các luồng giả ngẫu nhiên từ của người dùng và sự kiện 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 độc đáo cho kiểm thử trên Android như:

  • Kiểm soát đa thiết bị: monkeyrunner API có thể áp dụng cho một hoặc nhiều bộ kiểm thử trên đa thiết bị hoặc trình mô phỏng. Bạn có thể liên kết tất 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 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 bài kiểm thử, sau đó tắt trình mô phỏng.
  • Kiểm thử chức năng (functional testing): monkeyrunner có thể chạy một 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 bằng tổ hợp phím hoặ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 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ả chạy 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 – Vì monkeyrunner là một bộ công cụ API nên bạn có thể phát triển toàn bộ hệ thống 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 monkeyrunner API, bạ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 lớp bất kỳ vào monkeyrunner API. Phần này được mô tả chi tiết hơn trong mục Mở rộng monkeyrunner bằng trình bổ trợ.

Công cụ monkeyrunner sử 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 giúp monkeyrunner API dễ dàng tương tác 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.

Một chương trình monkeyrunner đơn giản

Đây là một chương trình monkeyrunner đơn giản liên kết với một thiết bị, tạo đối tượng MonkeyDevice. Bằng cách sử dụng đối tượng MonkeyDevice, chương trình này sẽ cài đặt mộ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 một đối tượng MonkeyImage. Với đối tượng này, chương trình sẽ tạo thêm 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
# 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 bao hàm ba mô-đun trong gói com.android.monkeyrunner bao gồm :

  • MonkeyRunner: Một lớp chứa các phương thức tiện ích cho 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: Tượng trưng 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 giúp 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 (keyboard event) 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: Tượng trưng 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 hai đối tượng MonkeyImage và lưu hình ảnh vào tệp.

Đối với chương trình Python, bạn thường truy cập vào từng lớp dưới dạng mô-đun Python. Công cụ monkeyrunner lại 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 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.

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ố.

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 plugin cho monkeyrunner. Để tìm hiểu thêm về trình bổ trợ monkeyrunner, hãy xem phần Mở rộng 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 đối số này được cung cấp, lệnh monkeyrunner sẽ chạy nội dung của tệp như một chương trình Python. Nếu đối số này không được cung cấp, 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 được viết bằng ngôn ngữ lập trình 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 chạy 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> như minh hoạ 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 gồm MonkeyDevice, MonkeyImageMonkeyRunner trong com.android.monkeyrunner (xem thêm monkeyrunner API).

Hãy lưu ý rằng các trình bổ trợ không cấp 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 cho một trình bổ trợ có thể chỉ định một lớp đã 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 .jar. Giá trị phải là tên lớp để chạy khi khởi tạo. Đoạn mã sau đây cho biết cách bạn 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 monkeyrunner, lớp khởi tạo 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 vùng chứa 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;
    }
}