robotium从入门到放弃 三 基于apk的自动化测试
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的测试,只是灵活度方面可能不如基于源码方式而已。