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的測試,只是靈活度方面可能不如基於源碼方式而已。


![clipboard[1] clipboard[1]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MTkzNDMtMjgwMjkwMzAucG5n.png)
![clipboard[2] clipboard[2]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjA0MzctNTM3Mzk5ODIucG5n.png)
![clipboard[3] clipboard[3]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjE1NzctOTA0MDAyOTA0LnBuZw==.png)
![clipboard[4] clipboard[4]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjI3ODAtNzcxMTg0MzQ5LnBuZw==.png)
![clipboard[5] clipboard[5]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjQxNzEtMTc1MDk2OTA2MS5wbmc=.png)
![clipboard[6] clipboard[6]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjUyOTYtNjk4Mjc1Mzk2LnBuZw==.png)
![clipboard[7] clipboard[7]](/image/aHR0cHM6Ly9pbWFnZXMyMDE1LmNuYmxvZ3MuY29tL2Jsb2cvNTk5NDIwLzIwMTYwNS81OTk0MjAtMjAxNjA1MTAxODA5MjY0NjgtMTQyOTA2NDI4MC5wbmc=.png)