เครื่องมือ monkeyrunner รุ่นเดิมมี API สำหรับเขียนโปรแกรมที่ควบคุมอุปกรณ์ Android หรือโปรแกรมจำลองจากภายนอกโค้ด Android
monkeyrunner เครื่องมือนี้ออกแบบมาเพื่อทดสอบแอปและอุปกรณ์เป็นหลัก
ที่ระดับฟังก์ชัน/เฟรมเวิร์ก และสำหรับการเรียกใช้ชุดการทดสอบหน่วย แต่คุณสามารถใช้
เครื่องมือนี้เพื่อวัตถุประสงค์อื่นๆ ได้ monkeyrunner ช่วยให้คุณเขียนโปรแกรม Python
ที่ติดตั้งแอป Android หรือแพ็กเกจทดสอบ รันแอป ส่งการกดแป้นไปยังแอป
ถ่ายภาพหน้าจอของอินเทอร์เฟซผู้ใช้ และจัดเก็บภาพหน้าจอในเวิร์กสเตชันได้
คำเตือน: monkeyrunner API ไม่ได้รับการบำรุงรักษา เราขอแนะนำให้ใช้เฟรมเวิร์กการทดสอบ UI Automator แทน
monkeyrunner เครื่องมือนี้ไม่เกี่ยวข้องกับ
UI/Application Exerciser Monkey
หรือที่เรียกว่าเครื่องมือ monkey monkey เครื่องมือจะทํางานในเชลล์ adb โดยตรงบนอุปกรณ์หรือโปรแกรมจำลอง และสร้างสตรีมเหตุการณ์ของผู้ใช้และระบบแบบสุ่มเทียม ในทางตรงกันข้าม
เครื่องมือ monkeyrunner จะควบคุมอุปกรณ์และโปรแกรมจำลองจากเวิร์กสเตชันโดยการส่ง
คำสั่งและเหตุการณ์ที่เฉพาะเจาะจงจาก API
monkeyrunner มีฟีเจอร์ต่อไปนี้สำหรับการทดสอบ Android
-
การควบคุมอุปกรณ์หลายเครื่อง:
monkeyrunnerAPI สามารถใช้ชุดการทดสอบอย่างน้อย 1 ชุดในอุปกรณ์หรือโปรแกรมจำลองหลายเครื่องได้ คุณสามารถเชื่อมต่ออุปกรณ์ทั้งหมด หรือเปิดโปรแกรมจำลองทั้งหมด (หรือทั้ง 2 อย่าง) พร้อมกัน เชื่อมต่อกับแต่ละโปรแกรมตามลำดับ โดยใช้โปรแกรม จากนั้นเรียกใช้การทดสอบอย่างน้อย 1 รายการ นอกจากนี้ คุณยังเริ่มโปรแกรมกำหนดค่าโปรแกรมจำลอง โดยอัตโนมัติ เรียกใช้การทดสอบอย่างน้อย 1 รายการ แล้วปิดโปรแกรมจำลองได้ด้วย -
การทดสอบฟังก์ชันการทํางาน:
monkeyrunnerสามารถเรียกใช้การทดสอบแบบอัตโนมัติตั้งแต่ต้นจนจบ ของแอป Android ได้ คุณระบุค่าอินพุตด้วยการกดแป้นหรือเหตุการณ์การแตะ และดู ผลลัพธ์เป็นภาพหน้าจอ -
การทดสอบถดถอย:
monkeyrunnerสามารถทดสอบความเสถียรของแอปได้โดยการเรียกใช้แอปและเปรียบเทียบภาพหน้าจอเอาต์พุตกับชุดภาพหน้าจอที่ทราบว่าถูกต้อง -
การทำงานอัตโนมัติที่ขยายได้: เนื่องจาก
monkeyrunnerเป็นชุดเครื่องมือ API คุณจึง พัฒนาระบบของโมดูลและโปรแกรมที่ใช้ Python เพื่อควบคุมอุปกรณ์ Android ได้ นอกเหนือจากการใช้monkeyrunnerAPI เองแล้ว คุณยังใช้โมดูล Pythonosและsubprocessมาตรฐาน เพื่อเรียกใช้เครื่องมือ Android เช่น Android Debug Bridge ได้ด้วยนอกจากนี้ คุณยังเพิ่มชั้นเรียนของคุณเองลงใน
monkeyrunnerAPI ได้ด้วย ซึ่งอธิบายไว้อย่างละเอียดในส่วนขยาย monkeyrunner ด้วยปลั๊กอิน
monkeyrunner เครื่องมือนี้ใช้
Jython ซึ่งเป็นการใช้งาน Python ที่ใช้ภาษาโปรแกรม Java Jython ช่วยให้
monkeyrunner API โต้ตอบกับเฟรมเวิร์ก Android ได้อย่างง่ายดาย Jython ช่วยให้คุณใช้ไวยากรณ์ Python เพื่อเข้าถึงค่าคงที่ คลาส และเมธอดของ API ได้
โปรแกรม monkeyrunner อย่างง่าย
ต่อไปนี้เป็นmonkeyrunnerโปรแกรมง่ายๆ ที่เชื่อมต่อกับอุปกรณ์เพื่อสร้างออบเจ็กต์
MonkeyDevice
โปรแกรมจะติดตั้งแพ็กเกจแอปพลิเคชัน Android โดยใช้ออบเจ็กต์ MonkeyDevice
เรียกใช้กิจกรรมอย่างใดอย่างหนึ่ง และส่งเหตุการณ์สำคัญไปยังกิจกรรม
จากนั้นโปรแกรมจะจับภาพหน้าจอของผลลัพธ์เพื่อสร้างออบเจ็กต์ 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')
API ของ monkeyrunner
monkeyrunner API อยู่ใน 3 โมดูลในแพ็กเกจ
com.android.monkeyrunner ดังนี้
-
MonkeyRunner: คลาสของเมธอดยูทิลิตีสำหรับโปรแกรมmonkeyrunnerคลาสนี้มีเมธอดสำหรับเชื่อมต่อmonkeyrunnerกับอุปกรณ์หรือโปรแกรมจำลอง นอกจากนี้ ยังมี วิธีการสร้าง UI สำหรับmonkeyrunnerโปรแกรมและแสดง ความช่วยเหลือในตัวด้วย -
MonkeyDevice: แสดงถึงอุปกรณ์หรือโปรแกรมจำลอง คลาสนี้มีเมธอดสำหรับการติดตั้งและ ถอนการติดตั้งแพ็กเกจ การเริ่มกิจกรรม และการส่งเหตุการณ์แป้นพิมพ์หรือการสัมผัสไปยัง แอป นอกจากนี้ คุณยังใช้คลาสนี้เพื่อเรียกใช้แพ็กเกจทดสอบได้ด้วย -
MonkeyImage: แสดงรูปภาพที่จับภาพหน้าจอ คลาสนี้มีเมธอดสำหรับการจับภาพหน้าจอ แปลงรูปภาพบิตแมปเป็นรูปแบบต่างๆ เปรียบเทียบออบเจ็กต์ 2 รายการ และ เขียนรูปภาพลงในไฟล์MonkeyImage
ในโปรแกรม Python คุณจะเข้าถึงแต่ละคลาสเป็นโมดูล Python monkeyrunner
เครื่องมือจะไม่นำเข้าโมดูลเหล่านี้โดยอัตโนมัติ หากต้องการนำเข้าโมดูล ให้ใช้คำสั่ง
Python from
from com.android.monkeyrunner import <module>
โดยที่ <module> คือชื่อชั้นเรียนที่ต้องการนำเข้า คุณสามารถนำเข้าโมดูลมากกว่า 1 โมดูลในคำสั่ง from เดียวกันได้โดยคั่นชื่อโมดูลด้วย
คอมมา
เรียกใช้ monkeyrunner
คุณสามารถเรียกใช้โปรแกรม monkeyrunner จากไฟล์หรือโดยการป้อนคำสั่ง monkeyrunner ในเซสชันแบบอินเทอร์แอกทีฟก็ได้ คุณทำทั้ง 2 อย่างได้โดยเรียกใช้คำสั่ง monkeyrunner
ซึ่งอยู่ในไดเรกทอรีย่อย tools/ ของไดเรกทอรี SDK
หากคุณระบุชื่อไฟล์เป็นอาร์กิวเมนต์ คำสั่ง monkeyrunner จะ
เรียกใช้เนื้อหาของไฟล์เป็นโปรแกรม Python หรือไม่เช่นนั้นก็จะเริ่มเซสชันแบบอินเทอร์แอกทีฟ
ไวยากรณ์ของคำสั่ง monkeyrunner มีดังนี้
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
ตารางที่ 1 อธิบายmonkeyrunnerแฟล็กและอาร์กิวเมนต์
ตารางที่ 1 monkeyrunner แฟล็กและอาร์กิวเมนต์
| อาร์กิวเมนต์ | คำอธิบาย |
|---|---|
-plugin <plugin_jar>
|
(ไม่บังคับ) ระบุไฟล์ JAR ที่มีปลั๊กอินสำหรับ
monkeyrunner
ดูข้อมูลเพิ่มเติมเกี่ยวกับmonkeyrunnerปลั๊กอินได้ที่ส่วนขยาย monkeyrunner ด้วยปลั๊กอิน
หากต้องการระบุไฟล์มากกว่า 1 ไฟล์ ให้รวมอาร์กิวเมนต์หลายครั้ง
|
<program_filename>
|
หากคุณระบุอาร์กิวเมนต์นี้ คำสั่ง monkeyrunner จะเรียกใช้เนื้อหา
ของไฟล์เป็นโปรแกรม Python ไม่เช่นนั้น คำสั่งจะเริ่ม
เซสชันแบบอินเทอร์แอกทีฟ
|
<program_options>
|
(ไม่บังคับ) แฟล็กและอาร์กิวเมนต์สำหรับโปรแกรมใน <program_file> |
ความช่วยเหลือในตัวของ monkeyrunner
คุณสร้างเอกสารอ้างอิง API สำหรับ monkeyrunner ได้โดยเรียกใช้คำสั่งต่อไปนี้
monkeyrunner help.py <format> <outfile>
อาร์กิวเมนต์มีดังนี้
-
<format>คือtextสำหรับเอาต์พุตข้อความธรรมดา หรือhtmlสำหรับเอาต์พุต HTML -
<outfile>คือชื่อที่มีคุณสมบัติของเส้นทางสำหรับไฟล์เอาต์พุต
ขยาย monkeyrunner ด้วยปลั๊กอิน
คุณขยาย monkeyrunner API ด้วยคลาสที่เขียนใน Java
และสร้างเป็นไฟล์ JAR อย่างน้อย 1 ไฟล์ได้ คุณสามารถใช้ฟีเจอร์นี้เพื่อขยาย
monkeyrunner API ด้วยคลาสของคุณเองหรือขยายคลาสที่มีอยู่ นอกจากนี้ คุณยังใช้ฟีเจอร์นี้เพื่อเริ่มต้นสภาพแวดล้อม monkeyrunner ได้ด้วย
หากต้องการระบุปลั๊กอินให้กับ monkeyrunner ให้เรียกใช้คำสั่ง monkeyrunner
ด้วยอาร์กิวเมนต์ -plugin <plugin_jar> ที่อธิบายไว้ใน
ตารางที่ 1
ในโค้ดปลั๊กอิน คุณสามารถนำเข้าและขยายmonkeyrunnerคลาสหลัก
MonkeyDevice, MonkeyImage และ MonkeyRunner ใน
com.android.monkeyrunner (ดูส่วนเกี่ยวกับ API ของ monkeyrunner)
โปรดทราบว่าปลั๊กอินไม่ได้ให้สิทธิ์เข้าถึง Android SDK คุณนำเข้าแพ็กเกจไม่ได้
เช่น com.android.app เนื่องจาก monkeyrunner โต้ตอบกับ
อุปกรณ์หรือโปรแกรมจำลองที่ต่ำกว่าระดับของ Framework API
คลาสเริ่มต้นของปลั๊กอิน
ไฟล์ JAR สำหรับปลั๊กอินสามารถระบุคลาสที่สร้างอินสแตนซ์ก่อนเริ่มการประมวลผลสคริปต์ได้
หากต้องการระบุคลาสนี้ ให้เพิ่มคีย์
MonkeyRunnerStartupRunner ลงใน
Manifest ของไฟล์ 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; } }