William Wang
Sr. Engineer
Component Unit Test
- How we start in mobile app ?
Who am i ?
• 靠寫程式混口飯吃的哲學家
Java, Android Developer
Agile Believer
Clean Code Believer
Performance Matter
王宣皓
William Wang
We all know that
Test is important ...
Problems
1. 自動化測試很重要,但不知怎麼開始
2. 寫了UI自動化測試腳本,浪費好多撰寫成本
3. UI自動化腳本走不完所有路徑
4. UI自動化測試總是跑很慢
5. RD:Unit Test綠燈了!
QA:所以呢?可以吃嗎?
My favorite talk
How about
follow suit in the app?
Tips 1
MVP Pattern
Tips 2
API Abstraction
Transforn
VIEW
PRESENTER
MODEL
API
Mobile App Workflow
分析、委任
事件及資料
業務邏輯
解析結果顯示邏輯更新畫面 業務邏輯
解析
View事件
VIEW
PRESENTER
MODEL
API
Mobile App Workflow
分析、委任
事件及資料
業務邏輯
解析結果顯示邏輯更新畫面 業務邏輯
解析
View事件
API Test in client
E2E Validation
• 確保輸入符合Server要求、回傳「格式」符合期望
How to validate
• 輸入資料打API成功(不管回傳值正不正確)
• 解析Server回傳資料「格式」正確
■ Json參數、格式無誤
■ 轉換成Model Class無誤
VIEW
PRESENTER
MODEL
API
Mobile App Workflow
分析、委任
事件及資料
業務邏輯
解析結果顯示邏輯更新畫面 業務邏輯
解析
View事件
Model Unit Test
E2E Validation
• 業務邏輯、狀態測試
How to validate
• 輸入各種Input以並驗證期望的Output
■ 模擬Presenter呼叫的狀況
■ 不呼叫API,模擬API回傳的結果
VIEW
PRESENTER
MODEL
API
Mobile App Workflow
分析、委任
事件及資料
業務邏輯
解析結果顯示邏輯更新畫面 業務邏輯
解析
View事件
Presenter Test
E2E Validation
• Presenter:Feature的高階抽象,驗證以下行為:
■ 接收View功能性事件
■ 將功能委派給一個或多個Model
■ 通知View更新畫面
How to validate
• 驗證當事件進來時有沒有呼叫正確的Model
• 驗證Model Callback時有沒有呼叫正確的View
VIEW
PRESENTER
MODEL
API
Mobile App Workflow
分析、委任
事件及資料
業務邏輯
解析結果顯示邏輯更新畫面 業務邏輯
解析
View事件
View UI Test
E2E Validation
• 操作UI、並驗證回饋正確
How to validate
• 驗證UI事件進來時呼叫到對的Presenter方法
• 模擬Callback驗證更新View是否正確
Example
認識興趣相同的人 一起做有趣的事
我們在找同伴一起去玩,你來嗎?!
Citymate 同伴
史詩級登入流程...
Success
DEMO
Espresso
2.0
How to Design ?
Sample Class Diagram
Test UI
Mock
Espresso
Test Presenter
MockMock
Mock
Junit
Runner
Test Model
Junit
Runner
Test Model
Junit
Runner
Mock Mock
Put logic into model
Account Manager
Check
Check
Check Check
Check
No Phone First FB login No Intresting First Register
Isolate
platform, library
Dependency
Injection
public AccountManager(CitytalkPreference preference, ApiFacade apiFacade) {
this.preference = preference;
this.apiFacade = apiFacade;
……
}
public LoginPresenter(AccountManager accountManager, FacebookUtils facebookUtil, TourLoginView tourLoginView) {
mAccountManager = accountManager;
mTourLoginView = tourLoginView;
mFacebookUtil = facebookUtil;
mFbLoginCallback = new FacebookLoginCallBack();
}
Class
Lifecycle
Application
Activity
Fragment
Get Static Models
Get Local Models
Get Presenter
Let's
Discussion
&Q A
Reference
https://developers.google.com/google-test-
automation-conference/2015/presentations
- GTAC 2015: Presentations Slides

Component Unit Test