淺談 Android 開發文化

jopen 8年前發布 | 20K 次閱讀 單元測試 安卓開發

Hello,親愛的讀者朋友們(希望你們是 Android 開發者,或者正在成為 Androider 的路上…)!

質量從用戶反饋很清涼然后我們就只能看 CPU 原來的想法是但是事實上不是這些但是我們可以把數據收集上來,從長遠角度來說,我們呢很簡單,怎樣擺脫這種要辭職的想法,那我能去哪,要干啥,任何團隊都有一定的問題,如果他走,我覺得我還可以接受缺一個告警什么叫我們的團隊當時是

Android 開發現在陷入了困境(快陷入七年了…)。大部分程序都沒有測試功能(單元測試、集成測試和功能測試);也都忽略了編譯和 lint 警告;并且代碼都看起來像意大利面(但愿是有反應的意大利面…)等等等等。

壞消息:在 Android 開發文化的源頭, Google 就直接參與了這一切。

質量為王

是的,Google 以 #執行為王 著稱,但 #質量為王 其實是更應該先做到的重要事項。

對質量水平不高的代碼進行優化,會造成不成熟的優化,而不成熟的優化也被成為萬惡之源(雖然并非絕對,但大多情況下是這樣的)。

好消息:像 Square、SoundCloud、推ter 這樣的企業和一些開發者正通過發表演講、撰寫博客,讓 Android 開發變得更好,感謝他們!此外, Google 似乎終于對提高 Android 應用程序的質量產生興趣了!近期, Google 參加了 Android 開發峰會(AndroidDevSummit)和一些其他會議,我們看到了一些關于測試的內容,請繼續保持!

現在是時候來提高 Android 開發的質量了。

Android 開發文化暨說明文檔。

0. Fail fast 機制:盡快宕機,盡早放棄。

為什么這么說呢?— 因為你要在產品到達用戶之前找到問題,那么越快、越早的宕機,對你就越有利,其實這也是你該做的。

本文每一項都會遵循這個基本原則。

1. Pull 請求、代碼審核和持續集成

項目開發應該在版本控制系統內完成。開發過程應該通過Pull請求(以下全文簡稱 PRs),并經過代碼審核,否則任何代碼都不能直接推送到主開發分支上。每次 PR 會應該觸發持續集成(以下全文簡稱 CI)系統,并構建項目。構建應該是可重復的,每一個隊伍里的成員都應該可以輕松地構建項目。

Fail early:如果 PR 的構建在 CI 系統中失敗了,在修復完成之前,PR 不要進行合并。

2. 代碼質量

你的代碼應該是堅實的 或者結實的。如何做到這一點,完全取決于你自己。代碼質量并不只和 MVP/MVVM/MVC 有關,同時也和 App 中每個組件的每一行代碼有關。筆者更傾向使用純函數和不可變對象。

Fail early:不要成為項目中唯一編寫可維護的代碼的開發者,確保其他成員也可以寫高質量的代碼(和他們聊天,一起討論本文即可激勵他們!),從而防止審核時出現糟糕的代碼。

3. 靜態代碼/資源分析

靜態代碼分析讓你在進入生產環境之前找到代碼中的問題。同時,也對代碼審核大有裨益。比如使用 Android Lint、FindBugs、PMD、SonarQube 和 FB Infer 等工具。

Fail early:在 CI 中運行靜態分析,安裝配置后,如果項目中出現警告(不僅僅是錯誤信息),盡早放棄項目。

4. 單元測試

是的!是測試沒錯!單元測試通常會檢查某個函數/對象是否正確地完成它的工作。項目里的測試越多,代碼覆蓋率越高, App 在發布后的性能,會更好更穩定。事實上,單元測試可以發現大多數愚蠢的 bug。當然,如果你的 App 會進行數據處理的話,單元測試還將幫助你保證代碼工作正常。

Android 項目單元測試的簡易指南

  1. 筆者傾向于在 JVM 上運行單元測試,因為它比在設備/模擬器上運行快得多。

  2. Android 的 Gradle 插件可以運行在JVM上的單元測試。只要把測試加至 test/ java_or_other_lang 即可。

  3. 你可以從 IDE 運行測試(右鍵點擊測試->運行)或者從 ./gradlew test 終端。

  4. 你很快就會發現,如果在 JVM 運行單元測試,Android SDK 的類會被清除,觸發他們時會拋出異常。這固然可悲,但是是可修復的。如果需要 Android SDK 類的話,可以在 Robolectric 測試運行器下運行,Robolectric 提供了大部分實現 Android SDK 類的方法。

  5. JUnit 提供了很棒的測試工具和相當不錯的 Rules 概念,但是 JUnit 的斷言很不好用。 AssertJ 和 Truth 等工具對斷言的支持很好,并且可以在 JUnit (或 TestNG/Spock 等)下運行。

  6. 如果你需要檢查行為和復制某些對象,你可以使用 Mockito 之類的復制庫。

TDD 與否,取決于你,但絕對值得一試!

Fail early: 在 CI 中運行單元測試,如果有一些測試失敗了,則盡早放棄。

5. 代碼覆蓋率

一旦開始編寫單元測試,你便需要知道代碼覆蓋率是否足夠好。 像 Jacoco 這樣的工具可以幫助你檢查測試程序所走的代碼路徑。如果你測試的代碼表現依賴于條件語句,代碼覆蓋率就尤為重要,因為你需要確保代碼執行中的所有可能都得到檢查。

你可以通過 apply plugin: ‘jacoco’ 語句啟用 Jacoco。你可以通過 jacocoReport Gradle 任務配置哪些類/包應該被檢查。

如果覆蓋率不夠高,配置代碼覆蓋工具使之放棄構建項目。如果你剛剛開始在一個已存在的項目中使用單元測試,除了非測試類,一旦測試代碼可以覆蓋這些類,就將它們從排除列表中刪除。這個規則可以保證新代碼的覆蓋率。根據覆蓋報告,你可以使用 jacoco-coverage 插件放棄構建。

Fail early:確保在 CI 環境中檢查代碼覆蓋率,如果代碼覆蓋率不夠高,盡早放棄構建。

6. 功能(UI)測試

沒錯!更多的測試。功能測試會從用戶的角度檢查 APP 的功能。功能測試啟動應用程序后,會驗證某些功能,比如在 UI 界面中加載出的數據是否正確顯示。QA 團隊進行的大部分工作可以通過功能測試達到自動化,但這并不意味著你不需要 QA 團隊。

運行功能測試有兩種基本的方法,在 Android Instrumentation 或 UIAutomator 里運行。最主要的區別是,在 Android Instrumentation 里運行功能測試時只能與應用程序交互,并可以接觸到程序代碼。在 UIAutomator 里進行的測試會運行在系統進程中,并通過Accessibility API(相比于 Android Intrumentation,此方式的功能十分有限)和應用程序進行交互。如果你需要進行應用程序和其他應用間的交互測試 — 可以使用 UIAutomater。但是通常情況下,你可以通過 Android Instrmentation 模擬這類交互并進行測試,而且這種測試無需依賴外部因素。

建議:

  • 優先選擇 Android Instrumentation 和 Espresso。
  • 測試中的頁導向架構會幫助你更加方便快捷地編寫和維護程序(比如,當你有一個描述應用的屏幕或部分屏幕的 Page 類時)。
  • 與后端模擬交互會完全孤立測試程序,進而并行運行測試,但同時也要確保不要共享測試間的狀態。推薦 MockWebServer,非常好用。
  • 開發者應該編寫功能測試,是的,你沒看錯。
  • 教 QA 團隊編寫功能測試 — 通常 QA 們和開發者想的不一樣,并知道需要檢查什么樣的情況。
  • 檢查功能測試的代碼覆蓋率。

Fail early:在 CI 中運行功能測試,如果一些測試失敗的話,則放棄構建項目。

7. 集成測試

是的。依舊是測試。通常情況下,集成測試檢查應用程序的不同組件如何協同工作,包括:HTTP 層、REST API 層和執行層(RxJava 等)等等。

設想一個使用了一堆其他類的類,它從后端加載數據,然后進行處理并存儲在數據庫中。雖然你應該先用單元測試覆蓋每個類,但是,你也可以用集成測試來覆蓋這種成分復雜的測試。

此處,與單元測試最主要區別在于,你并不是在使用模擬環境,而是對象在測試中的真實實現。你可以模擬數據傳輸(MockWebServer)和數據庫狀態,然后運行真實代碼,看看它們如何工作。

你可以在 Android Instrumentation 或 JVM 的設備/模擬器上運行集成測試,因為在 JVM 上的測試運行更快 — 筆者更喜歡 JVM。

Fail early:在 CI 中運行集成測試,如果有部分測試失敗的,則盡早放棄項目。

8. 開發人員設置菜單(又名:調試抽屜)

調試版本中的開發人員設置菜單允許你啟用/禁用 Sthetho、LeakCanary 和 TinyDancer 之類的工具,模擬/改變一些應用程序的行為等等。

在應用運行時更改和檢查應用程序,而無需改寫代碼,會為你和 QA 團隊節省大量時間。

Fail early: LeakCanary 這樣的工具可以幫助你收到真實用戶發來的崩潰報告之前,偵測到問題所在。教你的 QA 團隊使用類似的工具,在每次發版前進行驗收測試。

That's it.正文完。

請考慮你的開發文化,并和團隊成員討論這個話題,如此一來,你們正在打造的開發流程和產品質量都可能得到顯著改善。

QualityMatters app

所以,你是不是想看看遵循以上原則打造的示例應用呢?點擊此處下載 Jake Wharton 遵循以上原則打造的 U2020。以下是令一波遵循了以上原則的 QualityMatters app。

希望你能發現一些新意:

  • 單元測試;
  • 集成測試;
  • 功能測試;
  • 靜態代碼分析;
  • 代碼覆蓋率;
  • 開發人員設置菜單;
  • MVP、RxJava、Dagger 2 和 Retrofit 2 等等。

淺談 Android 開發文化 QualityMatters app 將會一直維護更新下去。

一封致 Google 的公開信

正如之前所說,#質量 > #表現

  • 請多發些關于測試的內容!
  • 請測試(單元測試、集成測試和功能測試)庫和示例應用程序。
  • Android 需要的是 Simulator,而不是 Emulator,因為 Robolectric…雖然毋庸置疑,非常有用,但應該有更好的辦法。
  • Google 與開發社區結合,可以改進 Android 開發的文化氛圍。

所以,我們需要 Android 開發文化!

來自: http://news.oneapm.com/android-development-culture/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!