기존 monkeyrunner 도구는 Android 코드 외부에서 Android 기기나 에뮬레이터를 제어하는 프로그램을 작성하기 위한 API를 제공합니다.
monkeyrunner 도구는 주로 기능/프레임워크 수준에서 앱과 기기를 테스트하고 단위 테스트 모음을 실행하기 위해 설계되었지만 다른 용도로 사용할 수도 있습니다. monkeyrunner를 사용하면 Python 프로그램을 작성할 수 있습니다. 이 프로그램은 Android 앱 또는 테스트 패키지를 설치 및 실행하고 키 입력을 전송하며, 사용자 인터페이스의 스크린샷을 만든 다음 워크스테이션에 저장합니다.
주의: monkeyrunner API는 유지되지 않습니다. 대신 앱 크롤러 도구 또는 UI Automator 테스트 프레임워크를 사용하는 것이 좋습니다.
monkeyrunner 도구는 monkey 도구라고도 하는 UI/Application Exerciser Monkey와는 관련이 없습니다. monkey 도구는 기기 또는 에뮬레이터의 adb 셸에서 직접 실행되며 사용자 및 시스템 이벤트의 의사 랜덤 스트림을 생성합니다. 이에 비해 monkeyrunner 도구는 API에서 특정 명령어와 이벤트를 전송하여 워크스테이션의 기기 및 에뮬레이터를 제어합니다.
monkeyrunner 도구는 Android 테스트를 위해 다음과 같은 기능을 제공합니다.
-
다중 기기 제어:
monkeyrunnerAPI는 여러 기기나 에뮬레이터에 하나 이상의 테스트 모음을 적용할 수 있습니다. 모든 기기를 실제로 연결하거나 모든 에뮬레이터(또는 둘 다)를 한 번에 시작하고 차례로 프로그래매틱 방식으로 각각에 연결한 다음 하나 이상의 테스트를 실행할 수 있습니다. 에뮬레이터 구성을 프로그래매틱 방식으로 시작하고 하나 이상의 테스트를 실행한 다음 에뮬레이터를 종료할 수도 있습니다. -
기능 테스트:
monkeyrunner는 Android 앱의 자동 시작-완료 테스트를 실행할 수 있습니다. 키 입력이나 터치 이벤트로 입력값을 제공하고 스크린샷으로 결과를 확인합니다. -
회귀 테스트:
monkeyrunner는 앱을 실행하고 출력 스크린샷을 올바르다고 알려진 스크린샷 세트와 비교하여 앱 안정성을 테스트할 수 있습니다. -
확장 가능한 자동화:
monkeyrunner는 API 도구 키트이므로 Android 기기를 제어하기 위해 Python 기반 모듈 및 프로그램 시스템을 개발할 수 있습니다.monkeyrunnerAPI 자체를 사용하는 것 외에도 표준 Pythonos및subprocess모듈을 사용하여 Android 디버그 브리지와 같은 Android 도구를 호출할 수 있습니다.자체 클래스를
monkeyrunnerAPI에 추가할 수도 있습니다. 자세한 내용은 플러그인으로 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
# 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는 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에서는 monkeyrunner 플래그와 인수를 설명합니다.
표 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 파일의 매니페스트에 추가하세요. 값에는 시작 시 실행할 클래스 이름을 사용합니다. 다음 스니펫은 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
}
}
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;
}
}