1.apk重签名

 

在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法。

首先将被测APK的签名去掉,然后用debug keystore重新进行签名,Eclipse也是使用debug keystore为默认的keystore为应用签名的,这样就可以保证被测应用和测试应用拥有同样的签名了。

 

Eclipse默认的debug keystore可以在这个地方设置,Window-> Preferences-> Android -> Build

去掉APK的签名,然后为之重新签名,可通过re-sign.jar这个jar来进行,下载地址:   

链接: http://pan.baidu.com/s/1eS0PBwe 密码: itjs

安装包下载地址:链接: http://pan.baidu.com/s/1hs33wBa 密码: rrya

 

双击打开re-sign.jar,把要测试的apk拖到界面内

 

点击保存按钮

稍等片刻就会得到这个包的Package.name和Main activity

 

2.创建基于apk测试的测试工程

 

新建一个Android Test Project

 

工程命名为YrhxTest

 

选择This project

新建libs目录,将robotium的jar添加进去,然后将该jar包添加到build path中

 

3.编写第一个基于apk测试自动化用例

 

新建一个包, com.yrhx.test,新建第一个测试类FirstYrhxTest,继承ActivityInstrumentationTestCase2,具体代码如下:

package com.yrhx.yrhxClient.test;

import com.robotium.solo.*;

import android.test.ActivityInstrumentationTestCase2;

@SuppressWarnings("rawtypes")

public class login_1 extends ActivityInstrumentationTestCase2 {

      private Solo solo;

      private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.yrhx.yrhxClient.activity.WelcomeActivity";

    private static Class<?> launcherActivityClass;

    static{

        try {

            launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);

        } catch (ClassNotFoundException e) {

           throw new RuntimeException(e);

        }

    }

      @SuppressWarnings("unchecked")

    public login_1() throws ClassNotFoundException {

        super(launcherActivityClass);

    }

      public void setUp() throws Exception {

        super.setUp();

        solo = new Solo(getInstrumentation());

        getActivity();

      }

       @Override

       public void tearDown() throws Exception {

        solo.finishOpenedActivities();

        super.tearDown();

      }

    public void testRun() {

        // Wait for activity: 'com.yrhx.yrhxClient.activity.WelcomeActivity'

        solo.waitForActivity("WelcomeActivity", 2000);

        // Wait for activity: 'com.yrhx.yrhxClient.activity.MainActivity'

        assertTrue("MainActivity is not found!", solo.waitForActivity("MainActivity"));

        // Click on 账户

        solo.clickOnView(solo.getView("rb_tab_user"));

        // Wait for activity: 'com.yrhx.yrhxClient.activity.NewLoginActivity'

        assertTrue("NewLoginActivity is not found!", solo.waitForActivity("NewLoginActivity"));

        // Scroll View to the right side

        solo.scrollViewToSide(solo.getView("vp_login"), Solo.RIGHT);

        // Click on 15629171568

        solo.clickOnView(solo.getView("et_user_mobile", 1));

        // Enter the text: '1562917xxxx'

        solo.clearEditText((android.widget.EditText) solo.getView("et_user_mobile", 1));

        solo.enterText((android.widget.EditText) solo.getView("et_user_mobile", 1), "1562917xxxx");

        // Click on Empty Text View

        solo.clickOnView(solo.getView("et_user_password"));

        // Enter the text: 'xxxxxx' ,input yours password

        solo.clearEditText((android.widget.EditText) solo.getView("et_user_password"));

        solo.enterText((android.widget.EditText) solo.getView("et_user_password"), "xxxxxx");

        // Click on 登 录

        solo.clickOnView(solo.getView("bt_login", 1));

        // Click on ImageView

        solo.clickOnView(solo.getView("ib_exit"));

    }

}

 

4.安装应用,运行自动化用例

 

通过adb install安装重签名的apk

修改AndroidMainfest.xml里instrumentation的targetPackage的值为上面re-sign.jar获得的package name,即com.yrhx.yrhxClient

鼠标右击FirstQunarTest,选择Run As -> Android JUnit Test,注意观察屏幕,被测应用就会被启动起来。

 

5.基于源码测试 vs 基于APK测试

 

Robotium既支持基于源码的测试也支持基于APK的测试,其实原理是一样的,只要确保被测应用与测试应用具有相同的签名即可。如果有源码的情况下建议进行基于源码的测试,因为你可以直接方便的引用源码中的一些现成的方法来帮助开展自动化测试,控件定位也比较方便,可以直接引用源码R文件的id来进行定位,如果某个控件的显示文本变了,但其id仍然保持不变,如果是通过id定位的,这时候就无需修改测试代码了。如果在没用源码的情况下,又想替代一些手工测试,还是可以采用基于APK的测试,只是灵活度方面可能不如基于源码方式而已。

robotium从入门到放弃 三 基于apk的自动化测试的更多相关文章

  1. Kafka从入门到放弃(三) —— 详说生产者

    上一篇对Kafka做了简单介绍,还没看的朋友可以点击下方链接. Kafka从入门到放弃(一) -- 初识别Kafka 消息中间件必须与生产者和消费者一起存在才有意义,这次先来聊聊Kafka的生产者. ...

  2. hive从入门到放弃(三)——DML数据操作

    上一篇给大家介绍了 hive 的 DDL 数据定义语言,这篇来介绍一下 DML 数据操作语言. 没看过的可以点击跳转阅读: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--D ...

  3. robotium从入门到放弃 二 第一个实例

    1.导入被测试的源码 我们先下载加你计算器源码,下载地址: https://robotium.googlecode.com/files/AndroidCalculator.zip 如果地址被墙无法现在 ...

  4. robotium从入门到放弃 四 Robotium常用API

      获取控件 getText() getEditText() getButton() getImage() getImageButton() getEditText() getView() getWe ...

  5. robotium从入门到放弃 一 测试开发环境搭建

    1.JDK的安装及环境变量的配置    配置JAVA的运行环境,添加完环境变量后,可以打开Windows命令处理程序窗口,通过执行命令java -version验证环境变量是否添加成功.如果添加成功会 ...

  6. storm从入门到放弃(三),放弃使用《StreamId》特性。

    序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...

  7. Go语言从入门到放弃(三) 布尔/数字/格式化输出

    本章主要介绍Go语言的数据类型 布尔(bool) 布尔指对或者错,也就是说bool只有两个值, True 或 False 两个类型相同的值可以使用比较运算符来得出一个布尔值 当两个值是完全相同的情况下 ...

  8. MyBatis从入门到放弃三:一对一关联查询

    前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是使用association属性和resultM ...

  9. storm从入门到放弃(三),放弃使用 StreamId 特性

    序:StreamId是storm中实现DAG有向无环图的重要一个特性,但是从实际生产环境来看,这个功能其实蛮影响生产环境的稳定性的,我们系统在迭代时会带来整体服务的不可用. StreamId是stor ...

随机推荐

  1. mysql建表: 主键,外键约束

    CREATE DATABASE db_studentinfo; USE db_studentinfo ; DROP TABLE IF EXISTS t_student ; CREATE TABLE t ...

  2. Redis 从数据库配置

    通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据.但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失.为了避免单点故障,我们希望将数 ...

  3. 这丫头也的还真清楚,但是跑不通呢,换3.0.3的mybatis也不行

    http://java.dzone.com/articles/ibatis-mybatis-handling-joins http://mybatis.github.io/spring/mappers ...

  4. Fox And Names

    Description Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce ...

  5. Android音频系统之AudioPolicyService

    地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...

  6. Delphi引用C对象文件(转)

    源:http://blog.csdn.net/henreash/article/details/7357618 C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小, ...

  7. js timer

    <html><head lang="en"> <meta charset="UTF-8"> <title>< ...

  8. [算法] trie树实现

    小写字母的字典树 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 1 ...

  9. 【supervisord】部署单进程服务的利器

    最近听了一场分享,里边同事介绍了一些python开发环境常用到的几种工具,其中之一就supervisord,分享后自己做了些功课,概括一下supervisord是一个什么东西呢 1. 它是一个独立的常 ...

  10. 建立一个属于自己的AVR的RTOS

    建立一个属于自己的AVR的RTOS(序) 建立一个属于自己的AVR的RTOS(第一篇:函数的运行) 建立一个属于自己的AVR的RTOS(第二篇:人工堆栈) 建立一个属于自己的AVR的RTOS(第三篇: ...