现在的位置: 首页 > 综合 > 正文

Instrumentation 类的框架

2013年04月11日 ⁄ 综合 ⁄ 共 3952字 ⁄ 字号 评论关闭

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文件中指定的包名有误。

抱歉!评论已关闭.