Component Unit Test

Post on 16-Jan-2017

1.385 views 2 download

Transcript of Component Unit Test

William WangSr. 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 ...

Problems1. 自動化測試很重要,但不知怎麼開始

2. 寫了UI自動化測試腳本,浪費好多撰寫成本

3. UI自動化腳本走不完所有路徑

4. UI自動化測試總是跑很慢

5. RD:Unit Test綠燈了!

QA:所以呢?可以吃嗎?

My favorite talk

How aboutfollow suit in the app?

Tips 1

MVP Pattern

Tips 2

API Abstraction

Transforn

V

I

E

W

PR

ES

EN

TER

M O

D E

L

A

P

I

Mobile App Workflow

分析、委任事件及資料

業務邏輯

解析結果顯示邏輯更新畫面 業務邏輯

解析View事件

V

I

E

W

PR

ES

EN

TER

M O

D E

L

A

P

I

Mobile App Workflow

分析、委任事件及資料

業務邏輯

解析結果顯示邏輯更新畫面 業務邏輯

解析View事件

API Test in clientE2E Validation• 確保輸入符合Server要求、回傳「格式」符合期望

How to validate• 輸入資料打API成功(不管回傳值正不正確)

• 解析Server回傳資料「格式」正確

■ Json參數、格式無誤

■ 轉換成Model Class無誤

V

I

E

W

PR

ES

EN

TER

M O

D E

L

A

P

I

Mobile App Workflow

分析、委任事件及資料

業務邏輯

解析結果顯示邏輯更新畫面 業務邏輯

解析View事件

Model Unit Test

E2E Validation• 業務邏輯、狀態測試

How to validate• 輸入各種Input以並驗證期望的Output

■ 模擬Presenter呼叫的狀況

■ 不呼叫API,模擬API回傳的結果

V

I

E

W

PR

ES

EN

TER

M O

D E

L

A

P

I

Mobile App Workflow

分析、委任事件及資料

業務邏輯

解析結果顯示邏輯更新畫面 業務邏輯

解析View事件

Presenter TestE2E Validation• Presenter:Feature的高階抽象,驗證以下行為:

■ 接收View功能性事件

■ 將功能委派給一個或多個Model■ 通知View更新畫面

How to validate• 驗證當事件進來時有沒有呼叫正確的Model• 驗證Model Callback時有沒有呼叫正確的View

V

I

E

W

PR

ES

EN

TER

M O

D E

L

A

P

I

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

MockEspresso

Test Presenter

MockMock

MockJunit

Runner

Test ModelJunit

Runner

Test ModelJunit

Runner

Mock Mock

Put logic into model

Account Manager

CheckCheck

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