Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

monkeyrunner

monkeyrunner 도구는 Android 코드 외부에서 Android 기기나 에뮬레이터를 제어하는 프로그램을 작성하기 위한 API를 제공합니다. monkeyrunner를 사용하면 Python 프로그램을 작성할 수 있습니다. 이 프로그램은 Android 애플리케이션 또는 테스트 패키지를 설치 및 실행하고 키 입력을 전송하며 사용자 인터페이스의 스크린샷을 만들고 워크스테이션에 스크린샷을 저장합니다. monkeyrunner 도구는 주로 애플리케이션 및 기기를 기능/프레임워크 레벨에서 테스트하고 단위 테스트 스위트를 실행하기 위해 설계되었지만 자유롭게 다른 용도로도 사용할 수 있습니다.

monkeyrunner 도구는 monkey 도구라고도 하는 UI/Application Exerciser Monkey와 관련이 없습니다. monkey 도구는 기기 또는 에뮬레이터의 adb 셸에서 직접 실행되며 사용자 및 시스템 이벤트의 의사 랜덤 스트림을 생성합니다. 이에 비해 monkeyrunner 도구는 API에서 특정 명령어와 이벤트를 전송하여 워크스테이션의 기기 및 에뮬레이터를 제어합니다.

monkeyrunner 도구에는 Android 테스트를 위한 다음과 같은 고유한 기능이 있습니다.

  • 다중 기기 제어: monkeyrunner API는 여러 기기나 에뮬레이터에 하나 이상의 테스트 스위트를 적용할 수 있습니다. 모든 기기를 실제로 연결하거나 모든 에뮬레이터(또는 둘 다)를 한 번에 시작하고 차례로 프로그래밍 방식으로 각각에 연결한 다음 하나 이상의 테스트를 실행할 수 있습니다. 에뮬레이터 구성을 프로그래밍 방식으로 시작하고 하나 이상의 테스트를 실행한 다음 에뮬레이터를 종료할 수도 있습니다.
  • 기능 테스트: monkeyrunner는 Android 애플리케이션의 자동 시작-완료 테스트를 실행할 수 있습니다. 키 입력이나 터치 이벤트로 입력값을 제공하고 스크린샷으로 결과를 봅니다.
  • 회귀 테스트: monkeyrunner는 애플리케이션을 실행하고 출력 스크린샷을 올바르다고 알려진 스크린샷 세트와 비교하여 애플리케이션 안정성을 테스트할 수 있습니다.
  • 확장 가능한 자동화: monkeyrunner는 API 도구이므로 Android 기기를 제어하기 위해 Python 기반 모듈 및 프로그램의 전체 시스템을 개발할 수 있습니다. monkeyrunner API 자체를 사용하는 것 외에도 표준 Python ossubprocess 모듈을 사용하여 Android 디버그 브리지와 같은 Android 도구를 호출할 수 있습니다.

    자체 클래스를 monkeyrunner API에 추가할 수도 있습니다. 이에 관한 자세한 내용은 플러그인으로 monkeyrunner 확장 섹션에 설명되어 있습니다.

monkeyrunner 도구는 자바 프로그래밍 언어를 사용하는 Python의 구현인 Jython을 사용합니다. Jython을 사용하면 monkeyrunner API가 Android 프레임워크와 쉽게 상호작용할 수 있습니다. Jython으로 Python 구문을 사용하여 API의 상수와 클래스, 메서드에 액세스할 수 있습니다.

간단한 monkeyrunner 프로그램

다음은 기기에 연결하여 MonkeyDevice 객체를 만드는 간단한 monkeyrunner 프로그램입니다. MonkeyDevice 객체를 사용하여 프로그램은 Android 애플리케이션 패키지를 설치하고 그 활동 중 하나를 실행하며 키 이벤트를 활동에 전송합니다. 그러면 프로그램은 결과의 스크린샷을 찍어 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
    # 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는 com.android.monkeyrunner 패키지의 세 가지 모듈에 포함되어 있습니다.

  • MonkeyRunner: monkeyrunner 프로그램의 유틸리티 메서드 클래스입니다. 이 클래스는 monkeyrunner를 기기나 에뮬레이터에 연결하는 메서드를 제공합니다. monkeyrunner 프로그램의 UI를 생성하고 기본 제공 도움말을 표시하는 메서드도 제공합니다.
  • MonkeyDevice: 기기 또는 에뮬레이터를 나타냅니다. 이 클래스는 패키지를 설치 및 제거하고 활동을 시작하며 키보드나 터치 이벤트를 애플리케이션에 전송하는 메서드를 제공합니다. 이 클래스를 사용하여 테스트 패키지를 실행할 수도 있습니다.
  • MonkeyImage: 화면 캡처 이미지를 나타냅니다. 이 클래스는 화면을 캡처하고 비트맵 이미지를 다양한 형식으로 변환하고 MonkeyImage 두 객체를 비교하며 이미지를 파일에 작성하는 메서드를 제공합니다.

Python 프로그램에서는 Python 모듈로 각 클래스에 액세스합니다. monkeyrunner 도구는 이러한 모듈을 자동으로 가져오지 않습니다. 모듈을 가져오려면 Python from 구문을 사용하세요.

    from com.android.monkeyrunner import <module>
    

여기서 <module>은 가져오려는 클래스 이름입니다. 모듈 이름을 쉼표로 구분하여 동일한 from 구문으로 모듈 두 개 이상을 가져올 수 있습니다.

monkeyrunner 실행

파일에서 monkeyrunner 프로그램을 실행하거나 monkeyrunner 구문을 대화형 세션에 입력할 수 있습니다. SDK 디렉터리의 tools/ 하위 디렉터리에 있는 monkeyrunner 명령어를 호출하여 둘 다 실행합니다. 파일 이름을 인수로 제공하면 monkeyrunner 명령어는 파일의 콘텐츠를 Python 프로그램으로 실행합니다. 인수로 제공하지 않으면 대화형 세션이 시작됩니다.

monkeyrunner 명령어의 구문은 다음과 같습니다.

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

표 1에서는 플래그와 인수를 설명합니다.

표 1. monkeyrunner 플래그 및 인수

인수 설명
-plugin <plugin_jar> (선택사항) monkeyrunner용 플러그인이 포함된 .jar 파일을 지정합니다. monkeyrunner 플러그인에 관한 자세한 내용은 플러그인으로 monkeyrunner 확장을 참조하세요. 파일을 둘 이상 지정하려면 인수를 여러 번 포함합니다.
<program_filename> 이 인수를 제공하면 monkeyrunner 명령어는 파일의 콘텐츠를 Python 프로그램으로 실행합니다. 인수를 제공하지 않으면 명령어는 대화형 세션을 시작합니다.
<program_options> (선택사항) <program_file>에서 프로그램의 플래그 및 인수입니다.

monkeyrunner 기본 제공 도움말

다음을 실행하여 monkeyrunner의 API 참조를 생성할 수 있습니다.

    monkeyrunner help.py <format> <outfile>
    

인수는 다음과 같습니다.

  • <format>: 일반 텍스트 출력용 text 또는 HTML 출력용 html
  • <outfile>: 출력 파일의 정규화된 경로 이름

플러그인으로 monkeyrunner 확장

자바 프로그래밍 언어로 작성하는 클래스를 사용하여 monkeyrunner API를 확장하고 하나 이상의 .jar 파일로 빌드할 수 있습니다. 이 기능을 사용하여 자체 클래스로 monkeyrunner API를 확장하거나 기존 클래스를 확장할 수 있습니다. 이 기능으로 monkeyrunner 환경을 초기화할 수도 있습니다.

monkeyrunner에 플러그인을 제공하려면 표 1에서 설명한 -plugin <plugin_jar> 인수를 사용하여 monkeyrunner 명령어를 호출하세요.

플러그인 코드에서는 com.android.monkeyrunner의 기본 monkeyrunner 클래스인 MonkeyDevice, MonkeyImage, MonkeyRunner를 가져오고 확장할 수 있습니다(monkeyrunner API 참조).

플러그인은 Android SDK에 액세스할 권한을 부여하지 않습니다. com.android.app과 같은 패키지를 가져올 수 없습니다. 이는 monkeyrunner가 프레임워크 API 수준 아래의 기기나 에뮬레이터와 상호작용하기 때문입니다.

플러그인 시작 클래스

플러그인의 .jar 파일은 스크립트 처리가 시작되기 전에 인스턴스화된 클래스를 지정할 수 있습니다. 이 클래스를 지정하려면 MonkeyRunnerStartupRunner 키를 .jar 파일의 manifest에 추가하세요. 값은 시작 시 실행할 클래스 이름이어야 합니다. 다음 스니펫은 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
        }
    }
    

자바

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