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

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

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(); } }


Item

Description

Warning

Author

天地会珠海分舵

转载请注明出处!

更多精彩文章请查看本人博客!

Blog Address

http://blog.csdn.net/zhubaitian



你可能感兴趣的:(MonkeyRunner,monkey,AndroidMonkey)