測試前奏 之 Robotium使用Eclipse和ADT對apk進行黑盒測試
測試的基本概念
曝光兩個概念:黑盒測試、白盒測試
- 黑盒測試
- 功能測試、資料驅動測試或基於規格說明的測試,是通過使用整個軟體或某種軟體功能來嚴格地測試, 而並沒有通過檢查程式的原始碼或者很清楚地瞭解該軟體的原始碼程式具體是怎樣設計的。(無原始碼基於apk的測試)
- 白盒測試
- 通過程式的原始碼進行測試而不使用使用者介面。這種型別的測試需要從程式碼句法發現內部程式碼在演算法,溢位,路徑,條件等等中的缺點或者錯誤,進而加以修正。(基於原始碼的測試)
測試準備
對安卓應用進行測試,測試工具和測試環境的配置、測試工具配置準備是必不可少的。
測試環境的搭建和工具的配置
1)JDK 環境搭建
2)安卓的SDK環境的搭建
3)Eclipse安裝,配置ADT和SDK
至於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被起,並自動執行測試!
相關文章
- 黑盒測試和白盒測試
- 黑盒測試
- 對於黑盒測試、白盒測試、灰盒測試你瞭解多少?
- 軟體測試技術-黑盒測試
- 黑盒測試方法之因果圖和判定表——一
- 黑盒測試、白盒測試與灰盒測試方法
- 使用 Spring Boot 和 @SpringBootTest 進行測試Spring Boot
- 【黑盒測試】測試用例的常用方法
- 知識普及:黑盒測試、白盒測試、灰盒測試之間的區別
- 如何對Mac進行基礎檢測和速度測試Mac
- 黑盒測試方法之邊界值分析
- 測試前奏 之 dos字元頁面執行 monkeyrunner 命令報錯字元
- 軟體測試之網站測試如何進行?測試小攻略走起!網站
- 使用Angular CLI進行單元測試和E2E測試Angular
- 黑盒測試策略及測試範圍(web端)Web
- 使用python對oracle進行簡單效能測試PythonOracle
- 【SWINGBENCH】使用SwingBench對Oracle進行壓力測試Oracle
- 隨行付微服務測試之介面測試和契約測試微服務
- APP黑盒測試總結APP
- 測試方法-白盒/黑盒
- 黑盒測試用例二
- 使用PostMan進行API測試PostmanAPI
- 使用 HTTPie 進行 API 測試HTTPAPI
- 使用Loadrunner進行效能測試
- 【軟體測試】(三)黑盒測試綜合策略概述
- 軟體測試中的黑盒測試是什麼?
- 【星雲測試】開發者測試-採用精準測試工具對SpringBoot應用進行測試Spring Boot
- 使用springboot對各層的程式碼進行測試!Spring Boot
- 使用Sysbench對滴滴雲MySQL進行基準測試MySql
- 使用 jMeter 對 SAP Spartacus 進行併發效能測試JMeter
- 測試前奏 之 ADB無限連線除錯模式除錯模式
- 【星雲測試】開發者測試-採用精準測試工具對Spring Boot應用進行測試Spring Boot
- 使用JUnit進行單元測試
- 使用jest進行單元測試
- 使用 MeterSphere 進行 Dubbo 介面測試
- 使用JMeter進行壓力測試JMeter
- 使用 Sysbench 進行 Linux 效能測試Linux
- 使用Wiremock進行整合測試 - kubilayREMMock