通過Google官方Android App架構(gòu)藍圖看測試

Android測試.png

上周和大家分享了《Google官方Android App架構(gòu)藍圖》,內(nèi)容比較簡單,沒想到卻收到了我在簡書里面最多的喜歡,非常感謝大家。后來反思了一下,可能是因為借了Google大名,而內(nèi)容雖然簡單卻很實用,很接地氣,接下來我也盡量寫一些接地氣的文章,還望大家多多支持。其實上次寫完了《Google官方Android App架構(gòu)藍圖》,覺得有很重要的東西沒有寫到,憋屈了一周,這個東西就是里面的單元測試和UI測試。好的架構(gòu)里面最重要的一點就是易于測試,接下來就讓我們來八一八Google官方Android App架構(gòu)藍圖Sample里面的單元測試。本文按照todo-mvp來寫。

工程結(jié)構(gòu)

工程結(jié)構(gòu).png

我們可以看到這個Sample里面有3個測試目錄:androidTest,androidTestMock和test。

androidTest

測試工具:espresso和hamcrest
目的:進行UI層測試,例如點擊,跳轉(zhuǎn)到某個頁面
例子:

    @Test
    public void clickAddTaskButton_opensAddTaskUi() {
        // Click on the add task button
        onView(withId(R.id.fab_add_task)).perform(click());

        // Check if the add task screen is displayed
        onView(withId(R.id.add_task_title)).check(matches(isDisplayed()));
    }
androidTestMock

測試工具:espresso和hamcrest
目的:UI層測試mock數(shù)據(jù)支持
例子:

    @Test
    public void activeTaskDetails_DisplayedInUi() throws Exception {
        loadActiveTask();

        // Check that the task title and description are displayed
        onView(withId(R.id.task_detail_title)).check(matches(withText(TASK_TITLE)));
        onView(withId(R.id.task_detail_description)).check(matches(withText(TASK_DESCRIPTION)));
        onView(withId(R.id.task_detail_complete)).check(matches(not(isChecked())));
    }

    private void loadActiveTask() {
        startActivityWithWithStubbedTask(ACTIVE_TASK);
    }

    private void startActivityWithWithStubbedTask(Task task) {
        // Add a task stub to the fake service api layer.
        TasksRepository.destroyInstance();
        FakeTasksRemoteDataSource.getInstance().addTasks(task);

        // Lazily start the Activity from the ActivityTestRule this time to inject the start Intent
        Intent startIntent = new Intent();
        startIntent.putExtra(TaskDetailActivity.EXTRA_TASK_ID, task.getId());
        mTaskDetailActivityTestRule.launchActivity(startIntent);
    }
test

測試工具:mockito
目的:業(yè)務(wù)層單元測試,包括Data,Presenter等
例子:

    @Test
    public void saveNewTaskToRepository_showsSuccessMessageUi() {
        // Get a reference to the class under test
        mAddEditTaskPresenter = new AddEditTaskPresenter("1", mTasksRepository, mAddEditTaskView);

        // When the presenter is asked to save a task
        mAddEditTaskPresenter.createTask("New Task Title", "Some Task Description");

        // Then a task is saved in the repository and the view updated
        verify(mTasksRepository).saveTask(any(Task.class)); // saved to the model
        verify(mAddEditTaskView).showTasksList(); // shown in the UI
    }

測試工具

Espresso

Android自動化測試框架

Mockito

模擬測試框架,使我們可以在不涉及依賴關(guān)系的情況下測試代碼

遠程數(shù)據(jù)mock

客戶端在開發(fā)過程中可能會遇到和服務(wù)端并行開發(fā)的情況,這時候就需要mock遠程數(shù)據(jù),但打包過程中就可能手動再把mock數(shù)據(jù)去除,非常麻煩,Sample里面就通過productFlavors來處理。

遠程數(shù)據(jù)Mock.png
productFlavors {
        mock {
            applicationIdSuffix = ".mock"
        }
        prod {}
    }

    // Remove mockRelease as it's not needed.
    android.variantFilter { variant ->
        if(variant.buildType.name.equals('release')
                && variant.getFlavors().get(0).name.equals('mock')) {
            variant.setIgnore(true);
        }
    }

我們可以看到,在開發(fā)過程中,使用mock過程下的FakeTasksRemoteDataSource,在release下會去除mock的包,只打出prod的包,這樣就能避免mock的代碼在release下被打入包內(nèi)。

測試命令

test目錄:用test命令
androidTest目錄:用connectedAndroidTest命令

參考資料

todo-mvp
Mockito官網(wǎng)
Mockito介紹
Espresso官網(wǎng)

歡迎關(guān)注我的微博

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容