一、Android JUnit Runner介紹
1.Android JUnit Runner
1)是一個測試運行器,用於運行Junit3和Junit4的Android測試包
2)替換Instrumentation Test Runner(一個比較舊的測試運行器)
3)支持Instrumentation Test Runner所有特性,但又進行了擴展
4)保持了所有Instrumentation Test Runner的命令格式
2.繼承關系
java.lang.Object
android.app.Instrumentation
android.support.test.runner.MonitoringInstrumentation
android.support.test.runner.AndroidJUnitRunner
二、Instrument測試命令
1.命令格式:
am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w] [--user <USER_ID>|CURRENT] [--no-window-animation] [--abi <ABI>] <COMPONENT> //COMPONENT:包名/運行Runner
- 運行所有測試用例命令的例子:
adb shell am instrument
-w com.testDemo.test/android.support.test.runner.AndroidJUnitRunner
2.測試命令
參數 |
說明 |
-r |
打印原始結果(如果不加測試結果信息會很少) 使用[-e perf true]生成原始輸出性能度量 |
-e |
設置參數 為測試運行器常見的形式是: [-e [,…]] |
將profiling數據寫入到文件中 注:需要先建立一個trace文件 |
|
-w |
等待測試完成(這是一個必需參數) |
–user | |
指定用戶運行,如果不指定則使用當前用戶運行 |
–no-window-animation | 關掉窗口動畫(相當於開場動畫)再運行 |
–abi |
通過所選的ABI啟動進程,選擇支持的CPU架構 可以使用(adb shell getprop |
3.實例(使用Android Studio):
1)在github中搜索android-testing選中googlesamples/android-testing點進去,然后下載.zip壓縮包
2)下載完成后進行解壓,所有的依賴都在android-testing-master\ui\espresso\BasicSampleBundled\libs路徑下
3)file–new–new project(等待工程創建完成)–app–java–[packageName右鍵]–new–java class
注:點開java后會有兩個選項,上面的一個是apk代碼,下面是測試代碼,我們寫測試用例一般都寫在測試代碼包內
4)復制android-testing-master\ui\espresso\BasicSampleBundled\libs目錄下除android-support-v4.jar以外的全部文件到創建的工程的libs文件夾中
5)選中copy進去的所有文件右鍵—add as library—在彈出的提示窗口中選擇app—OK
6)增加完成后可以切換到Android視圖,在Gradle Scripts/build.gradle(Module:app)中進行查看,並且注釋掉第一行*(注釋的那一行表示它會把libs下面所有的jar包編譯進去,因為我們已經手動把它添加進去了所以就不需要了),代碼顯示如下:
dependencies { //compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/espresso-contrib-2.2-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/espresso-core-2.2-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/espresso-idling-resource-2.2-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/espresso-intents-2.2-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/espresso-web-2.2-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/exposed-instrumentation-api-publish-0.3-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/guava-18.0.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/hamcrest-core-1.3.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/hamcrest-integration-1.3.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/hamcrest-library-1.3.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/javawriter-2.1.1.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/javax.annotation-api-1.2.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/javax.inject-1.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/jsr305-2.0.1.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/junit-4.12.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/rules-0.3-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/runner-0.3-release-no-dep.jar') compile files('C:/Users/xuzhonghui/AndroidStudioProjects/RunnerDemo/libs/uiautomator-v18-2.1.1-release-no-dep.jar') }
5)點擊導航欄Run—Edit Configurations…—點擊彈出界面左上角的+號—Android Tests,配置參考下圖
-
截圖說明:
a.name可以自行設置
b.Target選項請根據實際情況設置,我這邊是拿模擬器進行調試的
6)在Gradle Scripts/build.gradle(Module:app)文件的defalutConfig中增加調試器,增加后的代碼顯示如下:
android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.example.xuzhonghui.runnerdemo" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" //引號中的內容為剛剛創建的運行器 testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
7)至此,基本的配置完成了,然后在剛剛創建的類中寫測試代碼了,代碼如下:
package com.example.xuzhonghui.runnerdemo; import android.app.Instrumentation; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.UiDevice; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; //下面一行一定要的,就是指定哪個運行器運行 @RunWith(AndroidJUnit4.class) //測試用例 public class RunnerTest { //初始化設備 UiDevice device; @Before public void setip{ device=UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) } //用例1 @Test public void test1(){ device.pressMenu(); } //用例2 @Test public void test2(){ device.pressBack(); } //用例3 @Test public void test3(){ device.pressMenu(); } //用例4 @Test public void test4(){ device.pressBack(); } }
8)代碼寫好后需要重新配置一下運行器,配置圖如下:
-
配置說明:
a.在Test中選中測試類,然后將剛剛寫好測試代碼的那個類添加進去,也就是標紅的位置了
b.show device chooser Dialog表示彈出一個選擇目標設備的對話框
9)然后運行即可
- 注意事項:
我第一次按照上述步驟運行的時候就出現了問題,具體原理暫時還沒搞清楚,以后明白了補上,問題和解決方案請參考這里:http://blog.csdn.net/qq_26967883/article/details/50477071的第一條:Excution faild for task ‘:app:transformResourcesWithMergeJavaResForDebug’
4.Instrument命令簡單使用
#列出手機中所有已安裝的包,界面中可以看到剛剛使用Android Studio安裝的包 adb shell pm list instrumentation #該命令中不打印詳細日志,-e后面的參數是剛剛Android Studio中創建用例的<packageName>.<className> adb shell am instrument -w -e class com.example.xuzhonghui.runnerdemo.RunnerTest com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #跟上一條命令相比,只是多了一個<-r>參數,是讓他輸出詳細的運行日志,相當於eclipes調試uiautomator的時候輸出的日志 adb shell am instrument -w -r -e class com.example.xuzhonghui.runnerdemo.RunnerTest com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #跟上一條相比多了一個-p+file的參數,目的是為了將運行日志保存到.trace文件中。使用該命令要先在adb shell 模式下在設備中使用命令"touch runner.trace"創建一個自定義名稱的.trace文件 adb shell am instrument -w -r -p /data/local/tmp/runner.trace -e class com.example.xuzhonghui.runnerdemo.RunnerTest com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner
三、Android JUnit Runner過濾與例子
1.過濾器
過濾參數 |
說明 |
-e testFile | 運行文件中指定的用例 |
-e package | 運行這個包中的所有用例 |
-e size [small|medium|large] | 運行注釋Small/MediumTest/largeTest的用例 |
-e annotation | 運行指定注釋的用例 |
-e notAnnotation | 運行不包含指定注釋的用例 |
-e numShards | 將用例分割成不同的切片 |
-e shardIndex | 運行指定切片id的用例 |
2.例子
3.實例
1)首先修改一下上面使用Android Studio創建的用例代碼,多加幾個測試方法,我這里加了10個,都是按鍵信息,加完后記得先跑一次,把包push到手機中
#列出手機中所有已安裝的包找到com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner就是我們使用Android創建並安裝到手機中的包 adb shell pm list instrumentation #運行全部用例,沒有日志信息 C:\Users\xuzhonghui>adb shell am instrument -w com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行全部用例,有日志信息 C:\Users\xuzhonghui>adb shell am instrument -w -r com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行指定類的用例(指定類=包名.類名) C:\Users\xuzhonghui>adb shell am instrument -w -r -r class com.example.xuzhonghui.runnerdemo.RunnerTest com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行指定類中的某一條用例(在指定類后面加一個"#用例名") C:\Users\xuzhonghui>adb shell am instrument -w -r -r class com.example.xuzhonghui.runnerdemo.RunnerTest#test3 com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行多個類的用例,運行前先在之前先在Android Studio中多創建一個類並復制幾條用例進去方便(這里只演示兩個類,多個類同理,加個逗號即可) C:\Users\xuzhonghui>adb shell am instrument -w -r -r class com.example.xuzhonghui.runnerdemo.RunnerTest,com.example.xuzhonghui.runnerdemo.RunnerTest2 com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner
創建一個.txt文檔,文檔內容如下圖,然后使用命令”adb push F:\testFile.txt /data/local/tmp”將文檔push到手機中
#運行剛剛.txt文件中指定的用例 adb shell am instrument -w -r -e testFile /data/local/tmp/testFile.txt com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行com.example.xuzhonghui.runnerdemo包里的所有用例 adb shell am instrument -w -r -e package com.example.xuzhonghui.runnerdemo com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner
修改一下之前在Android Studio中創建的用例,增加幾個注釋,結果如下圖(記得修改完后先在手機上運行一下):
#運行剛剛注釋為small的用例 adb shell am instrument -w -r -e size small com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行剛剛注釋為medium的用例 adb shell am instrument -w -r -e size medium com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行剛剛注釋為large的用例 adb shell am instrument -w -r -e size large com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner
修改AndroidStudio中的用例,上一步中的smallText注釋的Import找到注釋方法的編寫,然后根據這個自己來編寫注釋方法,編寫好的方法如下圖:
編寫好后,按照上一步的方式將注釋加入到用例中,修改好用例后記得先運行一次
#運行指定自定義注釋SmokeAnnotation的用例(這里需要注意的是annotation后面的跟的是自己編寫的注釋的<包名>.<類名>) adb shell am instrument -w -r -e annotation com.example.xuzhonghui.runnerdemo.SmokeAnnotation com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner #運行除指定自定義注釋SmokeAnnotation的所有其他用例 adb shell am instrument -w -r -e notAnnotation com.example.xuzhonghui.runnerdemo.SmokeAnnotation com.example.xuzhonghui.runnerdemo.test/android.support.test.runner.AndroidJUnitRunner
四、Android JUnit Runner參數
主要是用在白盒測試上的,而不是UiAutomator,有興趣可以深入研究下
參數 | 說明 |
-e log true | 只在日志模式下運行 這個選項將加載和遍歷所有測試的類和方法,但會繞過實際測試執行。用於快速獲取信息要執行的測試的儀器命令 |
-e coverage true | 生成代碼覆蓋率 這需要一個EMMA的構建。默認情況下,代碼覆蓋率結果文件將被保存在/data//coverage.ec文件,除非有coverageFile標志 |
-e coverageFile | 指定代碼覆蓋率文件保存路徑 -e coverageFile /sdcard/myFile.ec |
-e listener | 指定一個或多個RunListeners觀察測試運行 -e listener com.foo.Listener,com.foo.Listener2 |
-e timeout_mse | 設置超時時間(單位:毫秒)將被應用到每一個測試 -e timeout_mec 5000 |
-e disableAnlytics true | 禁用谷歌分析 |
- 參數還可以在AndroidMainfest文件中進行指定
如何使用監聽器:
實際使用過程中,只需在AndroidManifect清單文件中加入上面代碼即可,實際使用參考下圖
- 參數通過shell命令傳入將覆蓋清單指定參數