基于Instrumentation Framework的开源项目AndroidMonkey简介

来源:互联网 发布:淘宝客源码7.0破解版 编辑:程序博客网 时间:2024/06/14 21:25

在上一篇文章《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是绝对跨进程的!

[java] view plaincopy
  1. @Override  
  2. public int fireEvent(Instrumentation testRuner) {  
  3.     String note;  
  4.     if (mAction == KeyEvent.ACTION_UP) {  
  5.         note = "ACTION_UP";  
  6.     } else {  
  7.         note = "ACTION_DOWN";  
  8.     }  
  9.   
  10.     System.out.println(":Typing Key (" + note + "): " + mKeyCode  
  11.             + "    // ");  
  12.     try {  
  13. /           testRuner.sendKeySync(getEvent());  
  14.         testRuner.sendKeyDownUpSync(mKeyCode);  
  15.     } catch (Exception e) {  
  16.         System.out.println("Failed to send key (" + note + "): " + mKeyCode  
  17.                 + "    // ");  
  18.         return MonkeyEvent.INJECT_FAIL;  
  19.     }  
  20.   
  21.     return MonkeyEvent.INJECT_SUCCESS;  
  22. }  
纠结了一段时间后返回下载地方看了下概览,很短,但很清楚的描述了这个不是我想要的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/代码实例

<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.使用简介

HowToUse  /使用简介

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测试类,然后加入如下的测试用例代码:

[java] view plaincopy
  1. public void testMonkeyEvents(){  
  2. Display display = getActivity().getWindowManager().getDefaultDisplay(); Instrumentation inst = getInstrumentation(); PackageManager pm = getActivity().getPackageManager();  
  3. Monkey monkey = new Monkey(display, packageToTest, inst, pm);  
  4. for (int i = 0; i < NUM_EVENTS; i++){  
  5. monkey.nextRandomEvent();  
  6. }  
  7. }  
0 0
原创粉丝点击