考慮可讀性,對于方法名使用表達能力強的方法名,對于測試范式可以考慮使用一種規范, 如 RSpec-style。
不要使用邏輯流關鍵字(If/ese、for、do/while、switch/case),在一個測試方法中,如果需要有這些,拆分到單獨的每個測試方法里。
測試真正需要測試的內容,需要覆蓋的情況,一般情況只考慮驗證輸出(如某操作后,顯示什么,值是什么)。
考慮耗時,Android Studio默認會輸出耗時。
不需要考慮測試 private 的方法,將 private 方法當做黑盒內部組件,測試對其引用的 public 方法即可。
盡可能的解耦對于不同的測試方法,不應該存在Test A與Test B存在時序性的情況。
II. Android自帶基本的單元測試
control + shift + R (Android Studio 默認執行單元測試快捷鍵)。
1. 本地單元測試
直接在開發機上面進行運行測試。在沒有依賴或者僅僅只需要簡單的Android庫依賴的情況下,有限考慮使用該類單元測試。
代碼存儲
如果是對應不同的flavor或者是build type,直接在test后面加上對應后綴(如對應名為 myFlavor 的單元測試代碼,應該放在 src/testMyFlavor/java 下面)。
src/test/java
激活測試
在一個功能測試或驗證的測試方法前面添加 @Test 的annotation。
Google官方推薦引用
dependencies {
// Required -- JUnit 4 framework,用于單元測試,google官方推薦
testCompile 'junit:junit:4.12'
// Optional -- Mockito framework,用于模擬架構,google官方推薦
testCompile 'org.mockito:mockito-core:1.10.19'
}
2. 模擬測試
運行在Android設備或者虛擬機上的測試
主要用于測試: 單元(Android架構引用相關的單元測試)、UI、應用組件集成測試(Service、Content Provider、etc.)
代碼存儲:
src/androidTest/java
Google官方推薦引用
dependencies {
androidTestCompile 'com.android.support:support-annotations:23.0.1'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
// Optional -- Hamcrest library
androidTestCompile 'org.hamcrest:hamcrest-library:1.3'
// Optional -- UI testing with Espresso
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
// Optional -- UI testing with UI Automator
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}
常見的UI測試
需要模擬Android系統環境
主要三點:
UI加載好后展示的信息是否正確。
在用戶某個操作后UI信息是否展示正確。
展示正確的頁面供用戶操作。
III. 拓展工具
1. AssertJ Android
square/assertj-android
極大的提高可讀性。
// 一般的JUnit
assertEquals(View.GONE, view.getVisibility());
// AssertJ Android
assertThat(view).isGone();
2. Robolectric
Robolectric
讓模擬測試直接在開發機上完成,而不需要在Android系統上。
主要是解決模擬測試中耗時的缺陷,模擬測試需要安裝以及跑在Android系統上,也就是需要在Android虛擬機或者設備上面,所以十分的耗時?;旧厦看蝸韥砘鼗囟夹枰獛追昼姇r間。針對這類問題,業界其實已經有了一個現成的解決方案: Pivotal實驗室推出的 Robolectric 。通過使用Robolectrict模擬Android系統核心庫的 Shadow Classes 的方式,我們可以像寫本地測試一樣寫這類測試,并且直接運行在工作環境的JVM上,十分方便。
3. Mockito
Mockito
快速模擬控制系統架構返回參數。
不同于Roblectric,Mockito可以通過模擬并控制或修改一些方法的行為。
// 無論什么時候調用 myQueryObject.getCurrentTime,返回值都會是 1363027600
Mockito.doReturn((long) 1363027600).when(myQueryObject).getCurrentTime();
4. Robotium
RobotiumTech/robotium
(Integration Tests)模擬用戶操作,事件流測試。
通過模擬用戶的操作的行為事件流進行測試,這類測試無法避免需要在虛擬機或者設備上面運行的。是一些用戶操作流程與視覺顯示強相關的很好的選擇。
原文轉自: http://blog.dreamtobe.cn/2016/05/15/android_test/