連上設備,跑起UT,會自動啟動相應的Activity界面,做相應的操作后進行測試。
總結:Espresso好強大,而且這一層的測試站在用戶的角度,所有邏輯是黑盒,在功能層面測試輸入(用戶操作)輸出(用戶得到的界面反饋),而技術層面,由于界面是所有層的入口,得到輸出后,除了測試View層本身的邏輯之外,其實已經粗糙的覆蓋了M和P的邏輯了。
關于Model層的測試,首先要了解下該項目中,model層的設計,類層次如下圖所示:
handler.postDelayed()
延時來模擬網絡請求)根據以上分析,可見對Model層的測試要完整的覆蓋這三個類。
我們先看門面TasksRepository的測試,先看看這個類中有關獲取待辦任務列表的流程圖:
所以對于TasksRepository來講,測試的內容主要是驗證1,2,3的邏輯是否在相應的輸入下覆蓋到位,對于1,2,3的數據準確性無需關心,由各自DataSource去驗證,因此它的測試與Android環境無關,用Junit+Mockito測試。要完整覆蓋的話,需要多個測試case,篇幅有限,這里只講第2種。這個測試類是TasksRepositoryTest
,代碼如下:
@Test
public void getTasksWithDirtyCache_tasksAreRetrievedFromRemote() {
//將數據設置為臟數據
mTasksRepository.refreshTasks();
//數據為臟數據,因此此時需要從網絡獲取
mTasksRepository.getTasks(mLoadTasksCallback);
//驗證第2種情況:用TasksRemoteDataSource調用getTasks()獲取數據后返回
setTasksAvailable(mTasksRemoteDataSource, TASKS);
//驗證第1種情況沒有發生
verify(mTasksLocalDataSource, never()).getTasks(mLoadTasksCallback);
//驗證TasksRemoteDataSource執行了回調函數
verify(mLoadTasksCallback).onTasksLoaded(TASKS);
}
其中,setTasksAvailable()
代碼如下:
private void setTasksAvailable(TasksDataSource dataSource, List<Task> tasks) {
//驗證第2種情況:使用TasksRemoteDataSource調用getTasks()
verify(dataSource).getTasks(mTasksCallbackCaptor.capture());
//執行回調 函數
mTasksCallbackCaptor.getValue().onTasksLoaded(tasks);
}
接下來是是TasksLocalDataSource的測試。該測試與數據庫有關,因此依賴于Android環境,且要驗證數據存取的準確性,因此需要做一些斷言,使用AndroidJUnitRunner進行測試,這個類是TasksLocalDataSourceTest
,代碼如下:
@Test
public void getTasks_retrieveSavedTasks() {
//事先往DB中插入兩條數據
final Task newTask1 = new Task(TITLE, "");
mLocalDataSource.saveTask(newTask1);
final Task newTask2 = new Task(TITLE, "");
mLocalDataSource.saveTask(newTask2);
原文轉自:http://www.jianshu.com/p/cf446be43ae8