首页 > 代码库 > 基于Instrumentation Framework的开源项目AndroidMonkey简介
基于Instrumentation Framework的开源项目AndroidMonkey简介
在上一篇文章《MonkeyRunner和Android设备通讯方式源码分析》中本人提到MonkeyRunner跟目标安卓机器交互的其中一种方式是通过在目标机器端开启‘monkey -port $port‘来跟monkeyrunner建立连接进行交互的,后来打算下载安卓机器端的monkey源代码来分析下monkey是如何处理的,在google中打入关键字“android monkey source code“后定位到以下连接”https://code.google.com/p/androidmonkey“, 看到是google的然后又是android,以为就是自己想要的monkey了,所以没有多看就直接下载进行分析。
过程中越看越糊涂,最大的一个疑问是怎么monkey是用instrumentation来注入event呢?这样的话它怎么做到跨进程应用的事件发送呢?因为根据本人的了解instrumentation框架是不能跨进程的,而monkey是绝对跨进程的!
@Override public int fireEvent(Instrumentation testRuner) { String note; if (mAction == KeyEvent.ACTION_UP) { note = "ACTION_UP"; } else { note = "ACTION_DOWN"; } System.out.println(":Typing Key (" + note + "): " + mKeyCode + " // "); try { // testRuner.sendKeySync(getEvent()); testRuner.sendKeyDownUpSync(mKeyCode); } catch (Exception e) { System.out.println("Failed to send key (" + note + "): " + mKeyCode + " // "); return MonkeyEvent.INJECT_FAIL; } return MonkeyEvent.INJECT_SUCCESS; }纠结了一段时间后返回下载地方看了下概览,很短,但很清楚的描述了这个不是我想要的monkey,而是原生monkey的一个修改后做成的android库。既然碰上了就顺便翻译下它的介绍和使用吧,反正就那么几句话,待今后有时间再来进一步研究它了,至于它是否真的如我所言不能跨进程,就留待今后或者大家来验证了。
1. 概览
官方原文:https://code.google.com/p/androidmonkey
AndroidMonkey is an Android Library. It is, in fact, a copy of the original Android Monkey Toolhttp://developer.android.com/guide/developing/tools/monkey.html and made as a library for testing and analysis (e.g. code coverage) purposes.
AndroidMonkey是一个android库。事实上它是在基于原生monkey的基础上做成的一个方便测试和分析(比如:代码覆盖率)的一个测试库。
Tester/User can easily use the library to create random test cases to test android apps with GUI.
测试人员/用户可以很方便的使用这个库来创建针对安卓gui应用的随机测试脚本
Why this library:
- You can use this library to create random test cases for your application, with just few lines of code
- 使用这个库的话你可以只用几行代码就能编写出针对你的app的随机测试用例
- You can add your assertions to access the state of the SUT (you can hardly do this with the Android Monkey Tool)
- 你可以在你的测试代码中加入断言从而很方便的去判断你的SUT(被测系统/应用)的当前情况(如果你用monkey的话是很难做到的)
- You can do Coverage analysis of random testing on Android Application, this is useful for Research Purpose (like what I‘m doing)
- 你可以通过随即测试对你的app做覆盖率分析,这对我们的研究是很有用的(像我现在所做的)(译者注:其实最后这一句话应该这样子去理解:如果你是一个公司的采购,你想去评估一个应用是否足够稳定满足你的需求,那么你就会先试用做一些前期研究)
Code example/代码实例
public class ContactAdderTest extends ActivityInstrumentationTestCase2<ContactAdder> { private int NUM_EVENTS = 1000; public ContactAdderTest() { super("com.example.android.contactmanager", ContactAdder.class); } @Override protected void setUp() throws Exception { super.setUp(); setActivityInitialTouchMode(false); } public void testMonkeyEvents() { Display display = getActivity().getWindowManager().getDefaultDisplay(); Instrumentation inst = getInstrumentation(); PackageManager pm = getActivity().getPackageManager(); Monkey monkey = new Monkey(display, "com.example.android.contactmanager", inst, pm); // Generate and fire a random event. for (int i = 0; i < NUM_EVENTS; i++) { monkey.nextRandomEvent(); } } }
官方原文:https://code.google.com/p/androidmonkey/wiki/HowToUse
2.使用简介
Introduction/简介
Here‘s how to use the library/以下是介绍如何使用这个库:
Details/详情
Create an android test project/创建android项目
An Android Test project should be created first, using Android ADT [http://developer.android.com/sdk/eclipse-adt.html] Refer the the AndroidMonkey library (jar or project)
先创建一个Android Test Project项目,通过Android ADT[http://developer.android.com/sdk/eclipse-adt.html] 添加对AndroidMonkey库的引用(引用jar或者项目)
Create a test class/创建测试类
Create a normal ActivityInstrumentationTestCase2 test class, and add the following test case:
创建一个普通的ActivityInstrumentationTestCase2测试类,然后加入如下的测试用例代码:
public void testMonkeyEvents(){ Display display = getActivity().getWindowManager().getDefaultDisplay(); Instrumentation inst = getInstrumentation(); PackageManager pm = getActivity().getPackageManager(); Monkey monkey = new Monkey(display, packageToTest, inst, pm); for (int i = 0; i < NUM_EVENTS; i++){ monkey.nextRandomEvent(); } }
基于Instrumentation Framework的开源项目AndroidMonkey简介