基于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.htmlRefer 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();
}
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。