在上一篇文章《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;
- }
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/代码实例
<span class="kwd" style="color: rgb(0, 0, 136);">public</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">class</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">ContactAdderTest</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">extends</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">ActivityInstrumentationTestCase2</span><span class="pun" style="color: rgb(102, 102, 0);"><</span><span class="typ" style="color: rgb(102, 0, 102);">ContactAdder</span><span class="pun" style="color: rgb(102, 102, 0);">></span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">private</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln"> NUM_EVENTS </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102);">1000</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">public</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">ContactAdderTest</span><span class="pun" style="color: rgb(102, 102, 0);">()</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">super</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="str" style="color: rgb(0, 136, 0);">"com.example.android.contactmanager"</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">ContactAdder</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="kwd" style="color: rgb(0, 0, 136);">class</span><span class="pun" style="color: rgb(102, 102, 0);">);</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102);">@Override</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">protected</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pln"> setUp</span><span class="pun" style="color: rgb(102, 102, 0);">()</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">throws</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">Exception</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">super</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">setUp</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln"> setActivityInitialTouchMode</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">false</span><span class="pun" style="color: rgb(102, 102, 0);">);</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">public</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">void</span><span class="pln"> testMonkeyEvents</span><span class="pun" style="color: rgb(102, 102, 0);">()</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">Display</span><span class="pln"> display </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> getActivity</span><span class="pun" style="color: rgb(102, 102, 0);">().</span><span class="pln">getWindowManager</span><span class="pun" style="color: rgb(102, 102, 0);">().</span><span class="pln">getDefaultDisplay</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">Instrumentation</span><span class="pln"> inst </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> getInstrumentation</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">PackageManager</span><span class="pln"> pm </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> getActivity</span><span class="pun" style="color: rgb(102, 102, 0);">().</span><span class="pln">getPackageManager</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">Monkey</span><span class="pln"> monkey </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">new</span><span class="pln"> </span><span class="typ" style="color: rgb(102, 0, 102);">Monkey</span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="pln">display</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> </span><span class="str" style="color: rgb(0, 136, 0);">"com.example.android.contactmanager"</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> inst</span><span class="pun" style="color: rgb(102, 102, 0);">,</span><span class="pln"> pm</span><span class="pun" style="color: rgb(102, 102, 0);">);</span><span class="pln"> </span><span class="com" style="color: rgb(136, 0, 0);">// Generate and fire a random event. </span><span class="pln"> </span><span class="kwd" style="color: rgb(0, 0, 136);">for</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">(</span><span class="kwd" style="color: rgb(0, 0, 136);">int</span><span class="pln"> i </span><span class="pun" style="color: rgb(102, 102, 0);">=</span><span class="pln"> </span><span class="lit" style="color: rgb(0, 102, 102);">0</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln"> i </span><span class="pun" style="color: rgb(102, 102, 0);"><</span><span class="pln"> NUM_EVENTS</span><span class="pun" style="color: rgb(102, 102, 0);">;</span><span class="pln"> i</span><span class="pun" style="color: rgb(102, 102, 0);">++)</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">{</span><span class="pln"> monkey</span><span class="pun" style="color: rgb(102, 102, 0);">.</span><span class="pln">nextRandomEvent</span><span class="pun" style="color: rgb(102, 102, 0);">();</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span><span class="pln"> </span><span class="pun" style="color: rgb(102, 102, 0);">}</span>
官方原文: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();
- }
- }