Instrumentation 类的框架
原文地址:http://www.netmite.com/android/mydroid/development/pdk/docs/instrumentation_framework.html
本人斗胆发一篇译文。话说:本人四级过了,但六级还没过;是计算机专业,但没上过测试课程;开始学习软件测试,但完全自学;想要系统学习软件测试,但觉得太麻烦又辛苦。。。
为了不影响各位,在我不确定的翻译后会加入原文,当前在我确定的翻译里面,也有可能是不对的。
总而言之呢,这个是给我自己凑合着看的,秉承着计算机网络的资料共享、数据通信的原则才会贴上来的,如果有什么不对,请先见谅,后发表;如果实在有问题就请看原文吧。
简介
掌握am命令
编写并运行Test Cases
浏览Test Case
难题处理
1 简介
1.1 本文档用于描述使用Instrumentation类的框架编写test cases。在此之前需要对以下几项内容:
Android Application Framework;
使用adb、am以及多种登陆函数(logging functionality);
对interest类的应用程序的初步了解,就是用于处理各种intent的类;
掌握Junit测试。
1.2 每个应用程序运行在自身的进程中。Instrumentation的作用就是杀除应用程序的进程,再用Instrumentation类重启那个进程。Instrumentation提供一个对于应用程序上下文的处理,用于poke around 应用程序 to validate test assertions,可以允许用户在一个比UI界面低很多的水平上编写用于测试应用test case。提示Instrumentation不能捕获UI的bug。
2 am命令用来通过adb shell命令启动并测试activities。如下所am命令:
比如,要开启打电话的应用程序,可以使用如下命令:
3 编写并测试Test Cases
第个Instrumentation的test case与Android的应用程序类似,只是其作用是用来开启另外一个应用程序。比如说,当你查看Contacts目录和其test目录:
a. 会有一个makefile文件和一个AndroidManifest.xml文件;
b. 测试项位于tests/Contacts/src/com/google/android/contactstests目录下;
c. Instrumentation Test Runner 的文件及目录为 teststests/Contacts/src/com/google/android/contactstests/functional/ContactsInstrumentationTestRunner.java。
假设,你有一个Contactstests 的makefile,其target如下:
a. make Contactstests:编译此test cases;
b. adb install Contactstests.apk:在设备上安装此apk包;
c. 使用adb shell命令运行这些包。
关于选项及其它细节信息,可参阅: Instrumentation Testing。
4 浏览test case的目录
test case 在添加或者测试一个新的测试项(a new contact)的时候使用到。提示:可以在其中实现发送intent,注册intent的接收等操作。
Instrumentation.java文件定义了一个帮助方法,该方法用于发送关键事件和String信息。比如:
a. getInstrumentation():向intrumentation返回handel;
b. sendCharacterSync:发送一个字符;
c. sendStringSync:向输入区(input box)发送一个字符串;
d. sendKeyDownUpSync:发送一个特定的关键定;
e. sendTrackballEventSync:发送一个trackball事件。
你可以在device/tests/Contacts目录下找到test case:
private void addNewContact(String name, int star, int phoneType, String number, String label,
String email, int emailType){
ContentValues values = new ContentValues();
Uri phoneUri = null;
Uri emailUri = null;
values.put(Contacts.People.NAME, name);
values.put(Contacts.People.STARRED, star);
//Add Phone Numbers
Uri uri = mActivity.getContentResolver().insert(Contacts.People.CONTENT_URI, values);
phoneUri = Uri.withAppendedPath(uri, Contacts.People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(Contacts.Phones.TYPE, phoneType);
values.put(Contacts.Phones.NUMBER, number);
values.put(Contacts.Phones.LABEL, label);
mActivity.getContentResolver().insert(phoneUri, values);
//Add Email
emailUri = Uri.withAppendedPath(uri, ContactMethods.CONTENT_DIRECTORY);
values.clear();
values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
values.put(ContactMethods.DATA, email);
values.put(ContactMethods.LABEL, "");
values.put(ContactMethods.TYPE, emailType);
mActivity.getContentResolver().insert(emailUri, values);
}
public void testAddSaveSingleContact(){
int previousCount = mActivity.getListView().getCount();
String message;
addNewContact(INPUT_NAME_1 + "1", "5435754532", "1" + INPUT_EMAIL_1, CONFIRM_OPTION);
message = "Added 1 to initial length=" + previousCount + ", but resulted with a count=" +
mActivity.getListView().getCount();
assertEquals(message, ++previousCount, mActivity.getListView().getCount());
// Check Content; Name; Num; Starred
assertEquals(INPUT_NAME_1 + "1", getTextFromView(0, android.R.id.text1));
assertEquals("5435754532", getTextFromView(0, android.R.id.text2));
//Check email is saved
//cursor = returnEmailCursorAtId("1");
Uri uri = Uri.parse("content://contacts/people/1");
uri = Uri.withAppendedPath(uri, ContactMethods.CONTENT_DIRECTORY);
Cursor cursor = mActivity.getContentResolver().query(uri, CONTACTS_COLUMNS, null, null, null);
assertTrue("returnEmailCursorAtId: Moving cursor to first row has failed", cursor.first());
int dataIndex = cursor.getColumnIndexOrThrow("data");
assertEquals("1" + INPUT_EMAIL_1, cursor.getString(dataIndex));
cursor.deactivate();
}
问题的解决:
如果你运行一个test case时没有任何反应,可以查看adb logcat。以下是一个常见的问题:
这个原因很有可能是你的设备中没有安装instrumentation的apk包,或者在Manifest文件中指定的包名有误。