1. 程式人生 > >測試前奏 之 Robotium使用Eclipse和ADT對apk進行黑盒測試

測試前奏 之 Robotium使用Eclipse和ADT對apk進行黑盒測試

測試的基本概念

曝光兩個概念:黑盒測試、白盒測試

黑盒測試
功能測試、資料驅動測試或基於規格說明的測試,是通過使用整個軟體或某種軟體功能來嚴格地測試, 而並沒有通過檢查程式的原始碼或者很清楚地瞭解該軟體的原始碼程式具體是怎樣設計的。(無原始碼基於apk的測試)
白盒測試
通過程式的原始碼進行測試而不使用使用者介面。這種型別的測試需要從程式碼句法發現內部程式碼在演算法,溢位,路徑,條件等等中的缺點或者錯誤,進而加以修正。(基於原始碼的測試)

測試準備

對安卓應用進行測試,測試工具和測試環境的配置、測試工具配置準備是必不可少的。

測試環境的搭建和工具的配置

1)JDK 環境搭建
2)安卓的SDK

環境的搭建
3)Eclipse安裝,配置ADTSDK

至於jdk的環境搭建,我想於大家而言 so easy 嘍。
sdk的配置活兒,或許被非安卓移動開發人員遇到,倒是一個難點!
但是也不要捉急,就是下載eclipse嘛,而最方便的方式是adt-bundle的下載!
連結: https://pan.baidu.com/s/1TgkFk6q7nqSaCzx0QjLVAQ 密碼: uqsq
當然你也可以不使用這裡的adt-bundle中的eclipse、adt和sdk,使用你之前安卓開發中安裝配置過的也是ok的。。。。。但是,有可能你會遇到很多的坑,各式各樣,像我一樣。因為我就是這麼倔強,這麼過來的!
當前,先依照正確方式走下去,一下是我的正確便準配置(目前這個IDE在我的配置下使用是沒有問題的)
在這裡插入圖片描述


那麼有了這個adt-bundle,基本的配置方式就不再贅述,可檢視這裡進行配置
由於在配置adt和sdk過程有些地方需要注意,所以這裡簡單提個醒,防止入炕!

ADT安裝

多擷取幾張圖,“清晰明瞭” 送給你
在這裡插入圖片描述
ADT的安裝過程第6步、第5步,按照上面的勾選處理,避免浪費配置按章的寶貴時間。

SDK安裝

安裝sdk時,於國內網路安裝基本無效,因此需要"科學上網"才行,或者配置下國內的專門跨域代理。下面是我使用過的,覺得還行,可用的代理服務
HTTP Proxy Server : mirrors.neusoft.edu.cn
HTTP Proxy Port   : 80
由於對sdk的安裝是非常耗時間的,所以建議晚上下載,或許第二天就下載完了呢,也說不定!
在這裡插入圖片描述

這裡可能會有朋友遇到這種問題?? 為什麼我點選 SDK Manager.exe 並不能看到象上圖一樣展示那麼多的Package Android API版本!!
在這裡插入圖片描述
原因是你和我,擁有一樣的好奇心,勾選了不該勾選的選項,哈哈。取消紅色框框箭頭指向的複選框即可。
在這裡插入圖片描述
這裡在配置代理的時候,這個Use downlaod cache 的選項是不能夠勾選的,不然在你執行 SDK Manager.exe的時候,一直會使用已有的版本,而不去拉取並展示更多的API版本。
多一嘴,當SDK安裝完成之後,不要忘記新增到系統環境變數中進行配置哦。

測試工具robotium.jar

對於測試工具嘛,這是使用的是Robotium進行的測試工作。所以呢,點選這裡進行Robotium和Junit4的jar包下載
當然也可以拋棄使用re-signer對apk進行重簽名,我喜歡的操作方式則是命令列執行(不要問我為什麼,我喜歡逼格高一點的)。簡單飄一個我的執行命令

//重簽名
jarsigner -keystore C:\Users\YJH\.android\debug.keystore -storepass android -keypass android D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid.apk androiddebugkey

//重新打包
zipalign 4 D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid.apk D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid-debug.apk

//安裝
adb install D:\Android-Testing\robotium-solo-5.6.1\resign-tools\SampAndroid-debug.apk

在這裡插入圖片描述

你是不是覺得,然後能愉快的寫測試程式碼了??
你錯了,問題仍然會接連不斷的出現。。

問題線上

<1>Eclipse中建立Android Application Project 無法執行

右擊專案,執行Run As/Android Application錯誤回現
在這裡插入圖片描述
錯誤日誌是這樣的

[2018-09-29 16:50:54 - Dex Loader] Failed to load D:\Android-Testing\sdk-test\android-sdk_r24.3.2-windows\android-sdk-windows\build-tools\28.0.3\lib\dx.jar
[2018-09-29 16:50:54 - SampAndroid] Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

提示的錯誤,就是在向我解釋,ta不能夠再我的sdk路徑..\build-tools\28.0.3\lib下面找到 dx.jar ?!
錯誤原因,在project.properties檔案中未指定buildtools版本,導致專案呼叫了buildtools的最高版本,但是我所使用的buildtools版本最高是25.0.0,固然是找不到的啦。
解決方案,在專案的project.properties檔案中新增配置

project.properties 檔案中配置
target=android-21
sdk.buildtools=25.0.0

<2>Eclipse中建立Android Test Project 無法執行

右擊專案,執行Run As/Android Junit Test錯誤回現
在這裡插入圖片描述
錯誤日誌是這樣的

An internal error occurred during: "Launching SampTest".
org.eclipse.jdt.internal.junit.runner.IVisitsTestTrees.visitTreeEntry(Lorg/eclipse/jdt/internal/junit/runner/ITestIdentifier;ZI)V

這個問題目前我使用百度、google,在國內、國外網站瀏覽,依然不得解決!
經過我的各種嘗試、反覆的安裝、刪除。終究讓我找到了解決方案,激戰三天,I was the winner.
錯誤原因,由於使用的IDE版本問題導致。部落格上文我就已經提早說過,我很倔強,沒有使用adt-bundle的內容。使用的是我本機上早已經安裝過的,用來做j2ee後臺開發的eclipse。以及從安卓開發中的sdk環境和單獨下載的adt包。所以讓我一步步體驗並驗證了和解決了該問題。
解決方案,換IDE
我的解決方式,更換eclipse版本從
在這裡插入圖片描述
到eclipse版本
在這裡插入圖片描述

Robotium 黑盒測試

[1]eclipse 編寫Android Application Project

new /project .../ Android /Android Application Project
在這裡插入圖片描述
在建立安卓專案的時候有兩點需要注意,
在這裡插入圖片描述
這裡特別說明下第二處,對於no.2處的填寫,要更多的依照自己已經安裝下載的sdk和android api版本進行填寫。否則可能會出現你意想不到的結果。
安卓的專案建立完之後,要配置引入Robotium.jar。通過Build Path 進行配置!
在這裡插入圖片描述
Java Build Path 目錄下Libraries目錄下,點選Add External JARs… 新增Robotium.jar
Java Build Path 目錄下Libraries目錄下,點選Add Library… 新增Junit4
至此,安卓的一個普通專案建立完畢!
我是做安卓開發滴,所以寫個安卓功能會很快哦!接下來簡單實現一個功能,開啟app進入主頁,頁面從上到下有三個view(TextView、Button、Button)。點選第一個Button,TextView顯示一行文字;點選第二個Button,彈出Toast提示。
現畫一個時序圖,著重解釋操作流程
在這裡插入圖片描述

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		final TextView tvDisplay = (TextView) findViewById(R.id.tvDisplay);
		findViewById(R.id.btnDisplay).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				tvDisplay.setText("public class MainActivity extends Activity");
			}

		});
		
		findViewById(R.id.btnToast).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(v.getContext(), "吃糖 吃糖", Toast.LENGTH_LONG).show();
			}
		});
	}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ztman.androidtest.MainActivity" >

    <TextView
        android:id="@+id/tvDisplay"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    
    <Button 
        android:id="@+id/btnDisplay"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/tvDisplay"
        android:layout_marginTop="20dp"
        android:layout_width="100dp"
        android:layout_height="43dp"
        android:text="點選顯示"
        android:textSize="15sp"
        android:gravity="center"
        />
    
    <Button 
        android:id="@+id/btnToast"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/btnDisplay"
        android:layout_marginTop="20dp"
        android:layout_width="150dp"
        android:layout_height="43dp"
        android:text="點選彈出Toast"
        android:textSize="15sp"
        android:gravity="center"
        />

</RelativeLayout>

[2]eclipse 編寫Android Text Project

建立測試專案Android Text Project,過程於建立被測試專案過程是相似的,只是在new project建立時選擇Android Text Project
貼下測試程式碼

public class TestAPK extends ActivityInstrumentationTestCase2{

	private Solo solo;
	private static final String MainActivity="com.example.sampandroid.MainActivity";
	private static Class launchActivityClass;
	
	static {
		try {
			launchActivityClass=Class.forName(MainActivity);
		}catch (ClassNotFoundException e) {
			throw new RuntimeException(e);
		}
	}
	
	public TestAPK() throws ClassNotFoundException{
		super(launchActivityClass);
	}
	
	
	
	@Override
	protected void setUp() throws Exception{
		super.setUp();
		solo = new Solo(getInstrumentation(), getActivity());
		
	}
	
	public void testButton() {
		Activity act = solo.getCurrentActivity();
		int btnId = act.getResources().getIdentifier("btnDisplay", "id",act.getPackageName());
		solo.waitForView(btnId);
		solo.clickOnButton("點選顯示");
		solo.clickOnButton(0);
		
//		TextView outMsg = (TextView)solo.getView(R.id.tvDisplay);
//		assertEquals("public class MainActivity extends Activity", outMsg.getText().toString());
	}
	
	
	
	@Override
	protected void tearDown() throws Exception{
		//銷燬動作
		solo.finishOpenedActivities();
	}
	
}

[3]eclipse 執行測試

1建立測試專案

建立測試專案的時候,下圖中有兩個地方需要注意:
1* no.1指的是黑盒測試選項
2* no.2指的是白盒基於原始碼的測試選項
在這裡插入圖片描述

2取出 debug-apk 包

被測試專案執行在手機上,長這個樣子
在這裡插入圖片描述
從已建立且執行過的被測試專案中取出apk,在下圖的被測試專案目錄中可以看到
在這裡插入圖片描述

3apk 重簽名

對apk的重簽名方式有兩種,第一種使用的是一個jar工具叫做re-sign.jar,操作方便簡單,但是我不太喜歡,而我更傾向於使用命令列執行操作,因為顯得逼格很高(哈哈~)。下面的重簽名方式使用的是命令列操作。
將編譯打包的安卓apk放在一個目錄中,使用解壓縮軟體開啟
在這裡插入圖片描述
此時,可以看到紅色框框中META-INF中儲存的就是簽名校驗的資訊。刪除該目錄,退出!
然後使用命令列來完成apk的重簽名,利用java自帶的一個簽名工具—— jarsigner
通過執行jarsigner命令,你可以看到ta的使用引導
在這裡插入圖片描述
我們使用對apk的重簽名使用的是debug簽名,而該debug簽名所使用的(我的電腦)keystore位置就在C:\Users\YJH\.android\debug.keystore

執行 jarsigner 簽名的命令

jarsigner -keystore [debug keystore 路徑] -storepass android -keypass android [待重簽名apk 路徑] androiddebugkey

在這裡插入圖片描述

然後再次執行 zipalign 命令,優化重簽名之後的 apk包,讓我們重簽名之後的包執行的更有效率。
執行 zipalign 重簽名之後的優化命令

zipalign 4 [重簽名後的apk路徑] [優化後的副本目錄]

在這裡插入圖片描述
重上面執行的命令,以及命令執行的過程,能夠看到在執行命令中的一個引數"4"的作用!
到這裡就對apk重簽名且重打包執行完畢!接下來只需要拖拽到模擬器中就行了,或者使用adb命令安裝。
但是,有時候你可能會遇到這種問題。
在執行過上面操作之後,通過adb進行命令的線上安裝,但是安裝失敗並報錯
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
報錯原因, java 的jdk版本在1.8以上。java的簽名工具在使用的時候,需要指定簽名演算法。
解決方案, 在進行重簽名過程新增執行命令的紅色凸顯部分引數即jarsigner -keystore [debug keystore 路徑] -storepass android -keypass android -sigalg MD5withRSA -digestalg SHA1 [待重簽名apk 路徑] androiddebugkey

finally 測試執行成功,效果欣賞

在這裡插入圖片描述

可以看到手機中的apk被起,並自動執行測試!