Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> gradle 編譯環境下進行android單元測試

gradle 編譯環境下進行android單元測試

編輯:關於Android編程

====== android 單元測試介紹 ======
JUnit是一個開源的java單元測試框架,android的測試套件是基於JUnit 3的(不完全兼容JUnit 4),Junit4只需簡單了解即可,可以使用普通的junit來進行測試,推薦使用android的Junit測試框架進行高效全面的進行測試。
====== Android 單元測試框架UML ======
{{:dolphin_news:share:androidjunituml.png?300 |}}


====== eclipse下的andriod項目單元測試 ======
使用AndroidJunit來做單元測試,大致可以分以下幾個步驟:
- 新建Android Test Project
- 新建Junit test case
- 新建Junit test suite
- 運行Junit test
===== 新建 Android Test Project =====
這部分內容是在eclipse中導入了shell_en_aglie的基礎上的完成的,請首先確保你已經成功導入了shell_en_agile工程(其它工程也是一樣)。新建Android Test Project方法:
- 在eclipse中File->New->Other->Android->AndroidTestProject, 輸入測試工程名, 如輸入dolphin_junit_test。
- 下一步選擇被測試的工程, 如選擇測試DolphinBrowerEn, 這一步就完成了。
此時我們打開AndroidManifest.xml看一下



package="com.dolphin.browser.core.test"
android:versionCode="1"
android:versionName="1.0" >

android:name="android.test.InstrumentationTestRunner"
android:targetPackage="mobi.mgeek.TunnyBrower" />
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >




可以看到, 已經自動生成了一些內容, 如uses-library和instrumentation已經自動生成了,這裡需要注意一下包名,因為前面我們選擇了被測試的工程為DolphinBrowerEn,所以這裡的自動為我們指定了targetPackage="mobi.mgeek.TunnyBrowser", 並且為測試工程包名package="mobi.mgeek.TunnyBrowe.test",這裡的包名因需要可以修改, 但targetPackage="com.dolphin.browser.core"為被測工程的包名,不能修改。
===== 新建 Junit Test Case =====
新建Junit Test Case方法:
- 在eclipse中File->New->Other->Junit->Junit Test Case
- 在彈出的Junit Test Case 對話框中選擇New Junit 3 test,Superclass 選擇AndroidTestCase,並選擇 Class under test 被測試類,輸入Name類名,點擊下一步後。
- 選擇需要被測試的方法,這裡根據實際情況選擇需要被測試的方法, 點擊完成。
===== 新建 Junit Test Suite =====
新建 Junit Test Suite方法:
- 在eclipse中File->New->Other->Junit->Junit Test Suite
- 在彈出的Junit Test Case 對話框中選擇需要測試的類。
- 選擇需要被測試的方法,這裡根據實際情況選擇需要被測試的方法, 輸入Name後點擊完成。
- 編寫TestSuite代碼
- 編寫TestSuite後, 需要在AndroidManifest中添加一項instrumentation, 添加後的AndroidManifest就變成了


package="com.dolphin.browser.core.test"
android:versionCode="1"
android:versionName="1.0" >

android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.dolphin.browser.core" />

android:name="com.dolphin.browser.core.test.Testall"
android:targetPackage="com.dolphin.browser.core" />
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >




TestSuite代碼完成後如下, 代碼中使用了繼承InstrumentationTestRunner,主要是通過addTestSuite來添加測試類,這裡我只有一個測試類,當有多個測試類時,就可以把它們都加進去。

public class TestAll extends InstrumentationTestRunner{


private static final String TAG = "TestAll";


public TestSuite getAllTests(){
Log.i(TAG, "Junit test, testsuite");
TestSuite suite = new InstrumentationTestSuite(this);
suite.addTestSuite(NewsRequestWrapperTest.class);
return suite;
}
}

===== 運行 Junit =====
可以參考 http://blog.csdn.net/xianming01/article/details/7463066 ,由於被測試工程較大, 在eclipse中導致不能通過圖形化界面運行Junit,所以我們可以采用adb shell am 的方式運行生成的junit apk 來測試。具體方法是:
- 將被測apk安裝到手機中
- 將junit程序生成後的apk安裝到手機中
- 輸入adb shell pm list instrumentation, 會顯示類似以下信息,下面顯示了有兩個instruementation, 第一個test case, 第二個是test suite.


instrumentation:com.dolphin.browser.junittest/android.test.InstrumentationTestRunner (target=mobi.mgeek.TunnyBrowser)\\
instrumentation:com.dolphin.browser.junittest/.testall.TestAll (target=mobi.mgeek.TunnyBroer)

按鏈接中的說明, 可以輸入adb shell am instrument -w com.dolphin.browser.junittest/android.test.InstrumentationTestRunner執行單條測試用例, 也可以
輸入adb shell am instrument -w com.dolphin.browser.junittest/.testall.TestAll來執行test suite。


===== 注意事項 =====
- 創建工程時, 注意package 和 targetPackage 的關系。
- 由於我測試的是DolphinBrowserEn,在eclipse中無法編譯,所以使用了生成測試apk,然後安裝到手機中,使用adb shell am 方式進行測試。
- 如何寫測試方法, 這裡不做說明, 需要注意被測試方法為異步方法時,如http,需要用到線程同步去等待異步任務的完成。
- 我們也可以寫一個activity,畫一個簡單的界面,通過點擊button觸發單元測試, 也可以對界面進行單元測試。




====== gradle環境下進行android單元測試方法一 ======
這部分內容以AOSP 裡的development/samples/NotePad為例,NotePad工程下的單元測試代碼在它的tests文件夾裡。
步聚:
* 先新建一個文件夾testJunit(名字任意),將development/samples/NotePad項目復制到裡面。
* 現在文件結構是 testJunit 裡面是NotePad工程,工程下就是src, res, tests, AndroidManifest等。
* 在testJunit裡新建三個文件,build.gradle, common.gradle, settings.gradle.
build.gradle 內容如下:

def gradle = project.getGradle()
gradle.beforeProject { project ->


if (project.file('build.gradle').exists()) {
project.buildscript {
repositories {
maven {
name = "Baina Maven Proxy"
url = "http://mirrors.baina.com:8080/archiva/repository/internal"
}
}


dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
}
}

common.gradle內容如下:

tasks.withType(JavaCompile) {
options.fork = true
options.forkOptions.setMemoryMaximumSize("4096m")
options.forkOptions.setMemoryInitialSize("1024m")
options.encoding = "UTF-8"
}


android {
compileSdkVersion 17
buildToolsVersion "18.0.1"


sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest {
java.srcDirs = ['tests/src']
resources.srcDirs = ['tests/src']
aidl.srcDirs = ['tests/src']
renderscript.srcDirs = ['tests/src']
res.srcDirs = ['tests/res']
assets.srcDirs = ['tests/assets']
}


//instrumentTest.setRoot('tests')
}
}

此處instrumentTest也可以另一種方式寫成
instrumentTest.setRoots('tests'), 這樣的話,需把NotePad裡的src改為java, 為了在eclipse中能運行,建議采用分別指明目錄的方式。


settings.gradle內容如下:

include ':NotePad'



* 在NotePad 文件夾裡新建build.gradle, 內容如下:

apply plugin: 'android'
apply from: "$project.rootDir/common.gradle"


android {
compileSdkVersion 16


buildTypes {
release {
runProguard true
proguardFile 'proguard.cfg'
}


debug {
runProguard true
proguardFile 'proguard-debug.cfg'
}
}

defaultConfig {
testPackageName "com.example.android.notepad.tests"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
}
}

}

說明:以上四個gradle文件我是從shell_en_agile裡的復制過來的, 參考它的結構並修改而來的。
* 編譯
在 testJunit 運行 gradle --daemon assembleDebug 會生成NotePad工程的apk, 運行 gradle --daemon assembleTest 會生成單元測試工程的apk。
* 運行
安裝test apk, 運行 adb shell am instrument -w com.dolphin.browser.junittest/android.test.InstrumentationTestRunner。


====== gradle 環境下做android單元測試的配置方法二 ======
實現工作中,為了使tests工程與被測工程的git commit message相關不干擾,可以將單元測試獨立出來管理,這樣與被測工程相對獨立,tests工程不會影響NotePad工程。在方法一的基礎上繼續下面的操作。
步聚:
* 將NotePad 裡的 tests剪切出來放到NotePad 平行的位置, 現在文件結構是 testJunit 裡有兩個文件夾,NotePad 及tests, NotePad裡面只剩下了src, res等。
* cd NotePad , 將測試工程通過軟鏈接的方式鏈接進來: ln -s ../tests tests。
* 編譯:
在testJunit下編譯 gradle --deamon installTest, 編譯完成後, 可以查看build下是否生成了對應的單測測試文件的class文件,確認編譯沒有問題。
* 運行:
參照測試工程tests, 具體命令可參考AOSP/development/samples/ApiDemos/tests 裡的 AllTests.java。


To run all suites found in this apk: adb shell am instrument -w com.dolphin.browser.junittest/android.test.InstrumentationTestRunner \\
To run just this suite from the command line: adb shell am instrument -w -e class com.dolphin.browser.junittest.TestAll com.dolphin.browser.junittest/android.test.InstrumentationTestRunner \\
To run an individual test case: adb shell am instrument -w -e com.dolphin.browser.junittest.xxxtest com.dolphin.browser.junittest/android.test.InstrumentationTestRunner \\
To run an individual testcase: adb shell am instrument -w -e class com.dolphin.browser.junittest.news.test.NewsRequestWrapperTest com.dolphin.browser.junittest/android.test.InstrumentationTestRunner \\


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved