Android測試代碼實驗室
- 學習目的:如何使用Android Testing Support Library即ATSL在開發(fā)中進行測試,包括:單元測試,UI測試等
- 學習資源:Google提供的一個完整的程序包和教程
- Google代碼實驗室主頁: https://codelabs.developers.google.com/
- AndroidTesting Codelab主頁:Android Testing Codelab
- 學習步驟:下載代碼包按照教程結合Androidstudio來進行學習。
學習筆記:
教程目錄:
整個教程分為了11個部分:
- 1.介紹了整個project的配置環(huán)境和項目預覽
- 2.介紹了如何獲取zip源碼以及zip包的目錄結構,和下載到Android手機號如何使用Notes。
- 3.引入了Android上的測試概念,并介紹了一個Google集成的測試包。 Android Testing Support library (ATSL)。
- ATSL:是一個專門用于Android上的集成的測試框架。
- 包含了以下幾個不同功能的測試工具包:包含了單元測試Junit 4和UI測試工具:Espresson和 UI Automator.
- It has a JUnit 4-compatible test runner (AndroidJUnitRunner) and functional UI testing through Espresso and UI Automator.
- 4.介紹了 Android的MVP架構
- 5.介紹了MVP的實踐,即如何在項目中構造MVP架構的Android項目
- 6.如何使用JUnit4 and Mockito進行單元測試
- 7.如何使用Espresso進行UI測試
- 8.Bonus: Espresso-Intents
- 9.Bonus: Espresso-Contrib
- 10.Bonus: Idling resources
- 11.Bonus: Code Coverage//代碼覆蓋
知識點筆記
上述目錄的第1節(jié)到第3節(jié)都是簡單的概念沒有特別需要注意的地方,從第四節(jié)開始記錄:
第4節(jié)介紹了MVP的設計模式:
在Android開發(fā)中,我們可以使用不同的層次結構來進行開發(fā),但是一種好的設計模式可以使得我們的APP代碼更容易測試和被人理解。MVP就是一種好的設計模式,使用MVP模式能將我們APP的數(shù)據(jù)和視圖以及邏輯進行很好的分離,提高了代碼內聚降低了耦合。
**MVP全名:Model-View-Presenter,如下圖 **
- In our app, we follow the MVP pattern, separating the internal data model, from a passive view through a presenter that handles the logic of our application.
- 將內部的數(shù)據(jù)模型與UI的View進行完全的分離,使用presenter來處理業(yè)務邏輯連接View和model.

Model
- Model為我們的數(shù)據(jù)模型,用于封裝內部數(shù)據(jù)。比如在Note筆記本這個APP中,每一條筆記都有圖片,內容和題目這些數(shù)據(jù),那么我們就可以創(chuàng)造一個Node的Model類用于存儲每一條筆記的數(shù)據(jù)。另外在創(chuàng)建一個Node的容器類NodeHolder,來管理所有的Node。這里Node和NodeHolder都是數(shù)據(jù)模型。
View - 注意這里的View不是我們Android控件里的View類。而要將其理解為用于展示我們data Model的表現(xiàn)層。比如對于一個通訊錄來說,data Model為每個聯(lián)系人的數(shù)據(jù),那么View就是ListView中的每一個Item。Data Model和View是相互映射的關系,而連接二者的就是Presenter。
Presenter - The presenter sits between the model and view: it coordinates the UI with the data, ensuring they are in sync.
- 這里的P其實有點像MVC模式中的C,控制器。用于連接數(shù)據(jù)模型和數(shù)據(jù)表現(xiàn)層,使得二者能夠同步變化。有點像ListView的Adapter。可以接受View層的操作來反饋給Model,也可以將Model的變化展現(xiàn)在View層。
第5節(jié)講了關于MVP模式的最佳實踐
- MVP的實踐的核心要點是:將代碼目錄結構以功能來進行分包,即每一個相對獨立的功能模塊為一個package。
- 這樣做的好處是:使得程序具有更高的可讀性,模塊性以及可測試性。
- 每一個功能模塊的package下的代碼以Model-View-Presenter的形式組織。見下圖。

- Each feature package (shown in bold above) contains a Contract interface - this defines the interface for the View andPresenter callbacks of each feature.
-
每一個功能包中都包含一個Contract的接口其中定義了兩個子接口:分別用于View和Presenter的回調。
各包下文件.png - 如上圖,可以看出以下幾點:
- 所有的數(shù)據(jù)模型放在/data包下
- 所有的工具類放在/util包下。這兩個和之前開發(fā)的項目文件組織相同
- 每一個小的功能都放在一個獨立的包下,view層和邏輯處理層的代碼都位于包下。除此之外,還有一個后綴為Contract的接口用于連接View的類和presenter的類。
- NoteDetailContract 接口下有兩個子接口:interface View和interface UserActionsListener 分別處理View層和presenter層。如圖


注意:想學習MVP更多知識請參考其他文章。
- 選擇proDebug運行程序,查看我們的測試效果:
- Open the Build Variants window and choose the prodDebug variant for your app module. (The option to open the Build Variants screen is on the lower, left hand side in Android Studio.)
Paste_Image.png
第6節(jié):使用JUnit4 和 Mockito進行單元測試
基礎概念:
- 單元測試:
- 單元測試是指測試的最小模塊,通常指函數(shù)。
- 打包時單元測試的代碼不會被編譯進入APK中。
- Android中單元測試使用JUnit
- 與Java單元測試相同,Android單元測試也是維護代碼邏輯的白盒工程,但由于Android運行環(huán)境的不同,Android單元測試的環(huán)境配置以及實施流程均有所不同。
-
Mockito:
在實際的工程項目中,類中必然存在各種依賴。若在單元測試時想要消除依賴,只測試待測試類相關的內容,或者依賴對象比較難拿到,此時可以使用Mockito框架mock出一個依賴對象。
注意:以上工具都需要添加依賴。
最佳實踐
- 1.第一步:為我們的程序配置Test環(huán)境
- 在開始寫測試程序之前需要為我們的Project配置Local Test的環(huán)境。
- 切換project的目錄結構視圖,Tests在src/下的test和androidTest目錄下。我們會發(fā)現(xiàn)Android Studio已經(jīng)自動為我們創(chuàng)建好了這兩個文件夾。
- test包下為與Android環(huán)境無關的代碼測試,androidTest為Android環(huán)境有關的代碼測試,比如使用了Android的JDK。

補充知識:
如上下圖所示:在project視角下的src/文件夾下,有test,AndroidTest,Main等若干個目錄,根據(jù)Google文檔的說法,每一個目錄代表了一個不同的產(chǎn)品口味。我們定義了四種不同的文件集,用于不同編譯和測試的流程,用于不同代碼的測試,這樣做使得我們開發(fā)測試變得簡單了很多。
另外:所有的單元測試的代碼都在test目錄下。

為我們的開發(fā)環(huán)境添加JUnit4的依賴:
<code>
dependencies {
// Required -- JUnit 4 framework
testCompile 'junit:junit:4.12' //01
// Optional -- Mockito framework
testCompile 'org.mockito:mockito-core:1.10.19' //02
}
</code>
解釋:
- 01:依賴JUnit應該會最新版本,必須添加
- 02:依賴Mockito 框架,不是必選的
- 當項目中依賴的庫較少的時候,用JUnit4進行本地單元測試已經(jīng)足夠,但是項目中若依賴較多的庫的話需要使用Mockito框架來模擬,一般還是推薦加上Mockito的依賴。
添加完依賴后,就可以寫測試用例了
比如需要測試一個是否為郵箱地址的方法是否正確:test/文件夾下代碼如下
<pre>
import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class EmailValidatorTest {
@Test
public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
assertThat(EmailValidator.isValidEmail("name@email.com"), is(true));
}
...
}
</pre>
- JUnit4采用注解的形式
- assertThat(),is()的語法
單元測試參考文檔:

