ابزار قدیمی monkeyrunner یک API برای نوشتن برنامههایی ارائه میدهد که دستگاه یا شبیهساز Android را از خارج از کد Android کنترل میکنند.
ابزار monkeyrunner دراصل برای آزمایش برنامهها و دستگاهها در سطح چارچوب/عملکرد و برای اجرای مجموعه آزمونهای واحد طراحی شده است، اما میتوانید از آن برای اهداف دیگر نیز استفاده کنید. با monkeyrunner، میتوانید برنامه Python بنویسید
که برنامه Android یا بسته آزمایشی را نصب کند، آن را اجرا کند، کلیدهای فشردهشده را به آن ارسال کند،
از میانای کاربر آن نماگرفت بگیرد، و نماگرفتها را در ایستگاه کاری ذخیره کند.
احتیاط: میانای برنامهسازی کاربردی monkeyrunner نگهداری نمیشود. توصیه میکنیم بهجای آن از چارچوب آزمایشی
UI Automator
استفاده کنید.
ابزار monkeyrunner با
UI/Application Exerciser Monkey،
که با نام ابزار monkey نیز شناخته میشود، مرتبط نیست. ابزار monkey در پوسته adb مستقیماً روی دستگاه یا شبیهساز اجرا میشود و جریانهای شبهتصادفی از رویدادهای کاربر و سیستم تولید میکند. درمقابل،
ابزار monkeyrunner دستگاهها و شبیهسازها را از ایستگاه کاری با ارسال
فرمانها و رویدادهای خاص از میانای برنامهسازی کاربردی کنترل میکند.
ابزار monkeyrunner این ویژگیها را برای آزمایش Android ارائه میدهد:
-
کنترل چند دستگاه:
monkeyrunnerAPI میتواند یک یا چند مجموعه آزمون را در چندین دستگاه یا شبیهساز اعمال کند. میتوانید همه دستگاهها را بهصورت فیزیکی متصل کنید یا همه شبیهسازها (یا هر دو) را همزمان راهاندازی کنید، بهصورت برنامهنویسیشده به هرکدام بهنوبت متصل شوید، و سپس یک یا چند آزمایش را اجرا کنید. همچنین میتوانید پیکربندی شبیهساز را بهصورت برنامهنویسیشده راهاندازی کنید، یک یا چند آزمایش را اجرا کنید، و سپس شبیهساز را خاموش کنید. -
آزمایش کارکردی:
monkeyrunnerمیتواند آزمایش خودکار شروع تا پایان را برای برنامه Android اجرا کند. مقادیر ورودی را با کلیدزنی یا رویدادهای لمسی ارائه میدهید و نتایج را بهصورت نماگرفت مشاهده میکنید. -
آزمایش رگرسیون:
monkeyrunnerمیتواند پایداری برنامه را با اجرای برنامه و مقایسه نماگرفتهای خروجی آن با مجموعهای از نماگرفتهایی که درست بودن آنها مشخص است آزمایش کند. -
خودکارسازی قابلتوسعه: ازآنجاییکه
monkeyrunnerیک جعبهابزار میانای برنامهسازی کاربردی است، میتوانید سیستمی از برنامهها و ماژولهای مبتنی بر Python برای کنترل دستگاههای Android توسعه دهید. علاوهبر استفاده از خودmonkeyrunnerAPI، میتوانید از ماژولهای استانداردosوsubprocessPython برای فراخوانی ابزارهای Android، مانند Android Debug Bridge استفاده کنید.همچنین میتوانید کلاسهای خودتان را به میانای برنامهسازی کاربردی
monkeyrunnerاضافه کنید. این موضوع با جزئیات بیشتر در بخش گسترش monkeyrunner با افزونهها شرح داده شده است.
ابزار monkeyrunner از
Jython استفاده میکند که پیادهسازی Python است و از زبان برنامهنویسی Java استفاده میکند. Jython به
monkeyrunner API اجازه میدهد بهراحتی با چارچوب Android تعامل داشته باشد. با Jython، میتوانید از نحو Python برای دسترسی به ثابتها، کلاسها، و روشهای API استفاده کنید.
برنامه monkeyrunner ساده
در اینجا یک برنامه ساده monkeyrunner وجود دارد که به دستگاه متصل میشود و یک شیء
MonkeyDevice
ایجاد میکند. بااستفاده از شیء 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')
The monkeyrunner API
monkeyrunner API در سه ماژول در بسته com.android.monkeyrunner قرار دارد:
-
MonkeyRunner: کلاسی از روشهای سودمند برای برنامههایmonkeyrunner. این کلاس روشی برای اتصالmonkeyrunnerبه دستگاه یا شبیهساز ارائه میدهد. همچنین روشهایی برای ایجاد واسطهای کاربر برای برنامهmonkeyrunnerو نمایش راهنمای داخلی ارائه میدهد. -
MonkeyDevice: نشاندهنده دستگاه یا شبیهساز است. این کلاس روشهایی برای نصب و حذف نصب بستهها، شروع یک فعالیت، و ارسال رویدادهای صفحهکلید یا لمسی به یک برنامه ارائه میدهد. همچنین از این کلاس برای اجرای بستههای آزمایشی استفاده میکنید. -
MonkeyImage: تصویر ضبطشده از صفحهنمایش را نشان میدهد. این کلاس روشهایی برای ضبط صفحهنمایش، تبدیل تصاویر نقشه بیتی به قالبهای مختلف، مقایسه دو شیءMonkeyImage، و نوشتن تصویر در فایل ارائه میدهد.
در برنامه Python، به هر کلاس بهعنوان یک واحد Python دسترسی دارید. ابزار monkeyrunner
این ماژولها را بهطور خودکار وارد نمیکند. برای وارد کردن ماژول، از
عبارت Python from استفاده کنید:
from com.android.monkeyrunner import <module>
که <module> نام کلاسی است که میخواهید وارد کنید. میتوانید بیشاز یک ماژول را در یک عبارت from وارد کنید. برای این کار، نام ماژولها را با کاما از هم جدا کنید.
اجرای monkeyrunner
میتوانید برنامههای monkeyrunner را از فایل یا با وارد کردن
عبارتهای monkeyrunner در
جلسه تعاملی اجرا کنید. هر دو کار را با فراخوانی فرمان monkeyrunner انجام میدهید،
که در زیرفهرست راهنمای tools/ در فهرست راهنمای کیت توسعه نرمافزار شما قرار دارد.
اگر نام فایلی را بهعنوان آرگومان ارائه دهید، فرمان monkeyrunner
محتوای فایل را بهعنوان برنامه Python اجرا میکند؛ درغیراینصورت، جلسه تعاملی را شروع میکند.
در زیر نحو فرمان monkeyrunner آمده است:
monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>
جدول ۱ پرچمها و متغیرهای مستقل monkeyrunner را توضیح میدهد.
جدول ۱. monkeyrunner پرچم و آرگومان
| متغیر مستقل | شرح |
|---|---|
-plugin <plugin_jar>
|
(اختیاری) فایل JAR حاوی افزایه برای
monkeyrunner را مشخص میکند.
برای کسب اطلاعات بیشتر درباره افزایههای monkeyrunner، به بخش
گسترش monkeyrunner با افزایهها مراجعه کنید.
برای مشخص کردن بیشاز یک فایل، متغیر مستقل را چند بار اضافه کنید.
|
<program_filename>
|
اگر این آرگومان را ارائه دهید، فرمان monkeyrunner محتوای فایل را بهعنوان برنامه Python اجرا میکند. درغیراینصورت، فرمان یک جلسه تعاملی را شروع میکند.
|
<program_options>
|
(اختیاری) پرچمها و آرگومانهای برنامه در <program_file> |
راهنمای داخلی monkeyrunner
میتوانید با اجرای دستور زیر، مرجع میانای برنامهسازی کاربردی برای monkeyrunner تولید کنید:
monkeyrunner help.py <format> <outfile>
متغیرهای مستقل عبارتاند از:
-
<format>یاtextبرای برونداد نوشتار ساده یاhtmlبرای برونداد HTML است. -
<outfile>نامی با مسیر مشخص برای فایل خروجی است.
گسترش دادن monkeyrunner با افزایهها
میتوانید monkeyrunner API را با کلاسهایی که در Java مینویسید گسترش دهید
و در یک یا چند فایل JAR بسازید. میتوانید از این ویژگی برای گسترش دادن
monkeyrunner API با کلاسهای خودتان یا گسترش دادن کلاسهای موجود استفاده کنید. همچنین میتوانید از این ویژگی برای مقداردهی اولیه محیط monkeyrunner استفاده کنید.
برای ارائه افزونه به monkeyrunner، فرمان monkeyrunner را با آرگومان -plugin <plugin_jar> شرحدادهشده در جدول ۱ فراخوانی کنید.
در کد افزایه، میتوانید کلاسهای اصلی monkeyrunner
MonkeyDevice، MonkeyImage، و MonkeyRunner را در
com.android.monkeyrunner وارد و گسترش دهید (بخش مربوط به میانای برنامهسازی کاربردی monkeyrunner را ببینید).
توجه داشته باشید که افزونهها به شما دسترسی به کیت توسعه نرمافزار Android را نمیدهند. نمیتوانید بستههایی مثل com.android.app را وارد کنید. دلیل این امر این است که monkeyrunner با دستگاه یا شبیهساز در سطحی پایینتر از میاناهای برنامهسازی کاربردی چارچوب تعامل دارد.
کلاس راهاندازی افزونه
فایل 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> را پیادهسازی کند. برای مثال، این
کلاس چند متغیر را در فضای نام پیشفرض تنظیم میکند:
کاتلین
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; } }