一起學習測試Android(1) — 前言

Andy Lu
5 min readFeb 27, 2019
Image by 472301 on Pixabay

開發者常常會遇到以下的狀況:
1. 明明只有改一點點,怎麼其他部分也壞了?
2. 以真實的環境執行,卻無法完全複製出可能發生的情況,所以不確定解法是否有效或是有涵蓋到所有情況。
3. 手動測試的測試步驟會有盲點,每一個人測試的手法不完全相同,常常會發生RD沒有做出來的行為,到了QA階段卻被檢驗出來。
4. 軟體只有在進入QA階段的時候,才開始測試。

從事開發軟體至今,一直以來都是有Bug就改,有需求就修,但是直覺式的思考讓我在修改Bug/修改需求的時候也常讓我越改越多Bug,這讓我反思,要如何才能夠提升軟體開發的水準呢?究竟是開發的水平不足,還是有更好的方法沒有採用呢?

身為一個Android開發者,清楚了解Android裝置是如此多,而每間公司的發行的Android裝置,雖然都是基於Android平台來開發,常常遇到這台裝置沒問題,同樣的解法在別台裝置卻有問題。到底要如何涵蓋所有可能發生的情況呢?

測試驅動開發(Test-Driven Development— TDD)

測試驅動開發(TDD),是一種先思考如何完成測試的一種開發方式,這種開發的方式與直接編寫程式碼的差別在於,當我們是以測試為導向時,所有實作的方法都會有相對應的單元測試。換句話說,功能實作後才去編寫單元測試,就是先射箭再畫靶。

TDD 三定律
(
http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd)

1. You are not allowed to write any production code unless it is to make a failing unit test pass.(你不能編寫任何程式碼,除非你的單元測試失敗)

2. You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. (單元測試已剛好正確測試一個失敗項目時,你不允許編寫更多的單元測試;編譯失敗也算無法通過)

3. You are not allowed to write any more production code than is sufficient to pass the one failing unit test. (單元測試可以正確測試一個失敗項目時,你不允許編寫更多程式碼)

由上方的定律可以感受到,程式碼的編寫應該是能少盡量少,不需要多餘的程式碼,每一行程式碼都應該通過單元測試,這邊可以呼應敏捷開發(Scrum)所提倡的"以終為始",這裡的"終"代表著完成一段程式碼搭配一個單元測試,那"始"自然就是朝這個方向邁進。

圖1: 迭代測試, Ref

產品開發階段,很容易落入一個陷阱,就是只完成表面上所看的到的事情,而忽略細節,這句話怎麼說呢?
以開發相機App為例子,這些事就是(1)打開相機,(2)拍照,(3)儲存相片。往往實作完這些功能之後,稍做測試,該功能就認定正常。但是若是以TDD做為開發的方式,則會思考打開相機會發生什麼事,有什麼錯誤需要被處理,除了思考以外,並且還必須編寫單元測試以供驗證,如此一來便可以對於該解法更有信心了。

測試Android App吧!

在Google I/O 2017中,有一場演講是討論Test-Driven Development 在Android如何實作,有興趣的朋友可以上去看看。

下方的圖片為測試金字塔,由上至下為UI Tests(Large Test), Integration Tests(Medium Test), Unit Tests(Small Test)。

花費:UI Tests>Integration Tests > Unit Tests

速度:Unit Tests > Integration Tests > Unit Tests

圖2. 測試金字塔, Ref

Small Test:

可以與產品系統隔絕的單元測試,通常會模擬每一個主要的元件並且可以快速的執行。

Medium Test:

整合多個元件在真實裝置或是模擬器上的測試。

Large Test:

採用完整的UI工作流程來整合及執行UI測試。確保使用者在真實的裝置或是模擬器上如預期般的操作。

小結

為了讓開發出來的軟體更有品質,更符合自己/客戶的需求,發行前勢必都必須要測試,初入軟體業時,公司有專門的QA部門在測試軟體,所以在正式推出前,都必須要經過QA的檢驗,若是發現有任何異常,或是不符需求,則就會被退回修改後重新發一版。這樣不僅會浪費許多時間,許多可以在提交之際就可以發現的問題如果到了最後一刻才被發現,影響的可不是自己一個人,有可能是影響整個專案的進行。

對App開發來說,測試絕對是有其存在的必要性的,那麼我們該如何測試我們的App呢? 我將在下次的文章繼續討論。

謝謝各位,如果有任何錯誤或是任何疑問,都歡迎跟我連絡討論。

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

No responses yet