一個待測試頁面對應多個業務單元,每一個業務單元對應一個測試用例,每一個測試用例都是一條鏈路(好比點擊一個按鈕後產生的一系列直接影響如頁面跳轉等),實現條件覆蓋和路徑覆蓋。
在Android單元測試中,測試用例不須要覆蓋全部的方法邏輯(這也是不太現實的),應該專一於本身編寫的業務邏輯等代碼的測試覆蓋,像 Android SDK 裏的方法回調是不須要測試的。html
編寫單元測試時調用這個方法,驗證返回值是否符合預期android
調用該方法,而後驗證方法改變的對象的(屬性||狀態)是否符合預期git
調用該方法,而後驗證其行爲,好比按鈕的點擊事件,驗證是否彈出Toast、是否有彈框、是否有頁面跳轉等瀏覽器
JUnit
斷言Mockito
mock數據,數據解耦Robolectric
在JVM上運行單測,不須要模擬器or真機Jacoco
統計測試覆蓋率,便於補充完善單測Robolectric
,由於它直接運行於JVM之上,運行單測時速度更快,不須要準備Android環境,不用使用真機||Android模擬器運行測試。當須要進行依賴解耦時,可使用Mock框架app/src/test
目錄下app/build.gradle
中引入dependencies {
XXXXXX
testCompile 'junit:junit:4.10'
testCompile 'org.robolectric:robolectric:3.2.2'
testCompile 'org.robolectric:shadows-multidex:3.2.2'
XXXXXX
}
複製代碼
app/build.gradle
中引入dependencies {
XXXXXX
testCompile "org.mockito:mockito-core:1.+"
XXXXXX
}
複製代碼
app/build.gradle
中引入apply from: 'http://git.caimi-inc.com/client/jacoco-plugin/raw/master/jacoco-plugin.gradle'
複製代碼
docs/單元測試
下:好比是WacaiLoginActivity
頁面的單測,則文檔名爲WacaiLoginActivity用例列表
./gradlew jacocoTestReport
app/build/reports/jacoco
生成詳細的覆蓋率報告,使用瀏覽器打開index.html
便可查看APP_VERSION
表示當前應用的版本號versionCode
爲了介紹單元測試的實施過程,下面以挖財寶挖財帳號登陸頁做爲單元測試實踐案例。該案例的開發和測試涉及到了TextView, EditText, Button, Checkbox, ImageView,包含了各類點擊、頁面跳轉等邏輯。頁面以下圖所示bash
對頁面進行單元測試的時候,咱們首先須要分析頁面,針對頁面提取出業務邏輯,提取出的業務邏輯如上圖所示。根據這些邏輯來設計單元測試的case(帶有Test註解的被測試方法),業務邏輯包括需求中的業務以及其餘的須要維護的代碼邏輯。爲了減小單元測試case的維護成本,業務流程不容許跨頁面,以頁面爲基本單位。架構
挖財帳號登陸頁的單元測試case設計以下:app
目標頁面 | 業務覆蓋 | 界面元素 | 邏輯描述 | 最小斷言數 | case名稱 |
---|---|---|---|---|---|
挖財帳號登陸頁 WacaiLoginActivity | 點擊左上角返回 | 1. 左上角TextView控件 | 1. 點擊左上角TextView控件,關閉結束登陸頁 | 1 | testGoBack |
輸入帳號、密碼 | 1. 帳號輸入框(手機/郵箱/帳號) 2. 帳號輸入框右側清空圖標ImageView 3. 密碼輸入框EditText 4. 密碼輸入框右側隱藏密碼圖標ImageView |
1. 向帳號輸入框輸入內容 2. 向密碼輸入框輸入內容 3. 當帳號輸入框沒有內容時,帳號輸入框右側清空圖標ImageView隱藏 4. 當帳號輸入框有內容時,帳號輸入框右側清空圖標ImageView顯示 5. 當密碼輸入框沒有內容時,隱藏密碼圖標隱藏 6. 當密碼輸入框有內容時,隱藏密碼圖標顯示 7. 點擊清空圖標,帳號輸入框文本清空 8. 點擊隱藏密碼圖標,密碼輸入框文本清空 |
6 | testInputAccountAndPassword | |
點擊登陸 | 1. 登陸按鈕 2. 帳號輸入框 3. 密碼輸入框 |
1. 點擊登陸按鈕 2. 帳號密碼輸入框爲空,則彈出Toast,頁面不跳轉 3. 帳號不爲空,密碼爲空,彈出Toast,頁面不跳轉 4. 帳號密碼均不爲空,正常登陸邏輯 |
4 | testLogin | |
自動填充上次登陸用戶的用戶名 | 1. 帳號輸入框 2. 密碼輸入框 | 當用戶曾經登陸過期,進入頁面會自動在帳號輸入框填充上一次登陸成功用戶的用戶名: 1. 填充帳號輸入框 2. 填充以後,密碼輸入框得到焦點 |
2 | testPastePreAccount | |
直接點擊跳轉 | 1. 右上角註冊TextView控件 2. 忘記密碼TextView控件 3. 挖財平臺註冊協議TextView控件 4. 挖財隱私權政策TextView控件 |
1. 點擊註冊跳轉到手機號註冊登陸頁面 2. 點擊忘記密碼跳轉到找回密碼頁面 3. 點擊挖財平臺註冊協議或者挖財隱私權政策,跳轉到對應的WebView |
4 | testJumpDirectly | |
點擊切換是否贊成挖財註冊協議 | 1. 贊成挖財註冊協議Checkbox勾選框 2. 登陸按鈕 |
1. 勾選贊成挖財註冊協議,則登陸按鈕可點擊;不然不可點擊 2. 進入頁面時默認勾選贊成挖財註冊協議 |
3 | testAgreeRegisterProtocol |
接下來須要在單元測試的工程中實現上述case。最小斷言數是從業務邏輯考慮的一個數值,並非代碼的邊界條件,真實的case須要考慮代碼的各類邊界狀況,好比空指針等,所以,通常實際斷言數會大於最小斷言數。實際斷言數=最小斷言數(業務需求斷言)+技術需求斷言。框架
寫完case以後須要跑一遍單測獲得單測報告,根據單測報告不斷完善單測,提升單測覆蓋率。ide
Activity
中,那麼,你最須要的可能不是單測,而是對項目的重構,各個模塊進行解耦、UI和邏輯解耦等以上就是文檔式單測
的內容,目前正在實踐之工具