淺談 Android 開發(fā)文化

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

質(zhì)量從用戶反饋很清涼然后我們就只能看 CPU 原來的想法是但是事實上不是這些但是我們可以把數(shù)據(jù)收集上來反浓,從長遠(yuǎn)角度來說任内,我們呢很簡單,怎樣擺脫這種要辭職的想法牌里,那我能去哪颊咬,要干啥,任何團(tuán)隊都有一定的問題牡辽,如果他走喳篇,我覺得我還可以接受缺一個告警什么叫我們的團(tuán)隊當(dāng)時是

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

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

質(zhì)量為王

是的攀涵,Google 以#執(zhí)行為王著稱铣耘,但#質(zhì)量為王其實是更應(yīng)該先做到的重要事項。

對質(zhì)量水平不高的代碼進(jìn)行優(yōu)化以故,會造成不成熟的優(yōu)化蜗细,而不成熟的優(yōu)化也被成為萬惡之源(雖然并非絕對,但大多情況下是這樣的)怒详。

好消息:像 Square炉媒、SoundCloud、Twitter 這樣的企業(yè)和一些開發(fā)者正通過發(fā)表演講昆烁、撰寫博客吊骤,讓 Android 開發(fā)變得更好,感謝他們静尼!此外白粉, Google 似乎終于對提高 Android 應(yīng)用程序的質(zhì)量產(chǎn)生興趣了!近期鼠渺, Google 參加了 Android 開發(fā)峰會(AndroidDevSummit)和一些其他會議鸭巴,我們看到了一些關(guān)于測試的內(nèi)容,請繼續(xù)保持拦盹!

現(xiàn)在是時候來提高 Android 開發(fā)的質(zhì)量了鹃祖。

Android 開發(fā)文化暨說明文檔。

0. Fail fast 機(jī)制:盡快宕機(jī)普舆,盡早放棄恬口。

為什么這么說呢校读?— 因為你要在產(chǎn)品到達(dá)用戶之前找到問題,那么越快祖能、越早的宕機(jī)地熄,對你就越有利,其實這也是你該做的芯杀。

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

1. Pull 請求、代碼審核和持續(xù)集成

項目開發(fā)應(yīng)該在版本控制系統(tǒng)內(nèi)完成揭厚。開發(fā)過程應(yīng)該通過Pull請求(以下全文簡稱 PRs)却特,并經(jīng)過代碼審核,否則任何代碼都不能直接推送到主開發(fā)分支上筛圆。每次 PR 會應(yīng)該觸發(fā)持續(xù)集成(以下全文簡稱 CI)系統(tǒng)裂明,并構(gòu)建項目。構(gòu)建應(yīng)該是可重復(fù)的太援,每一個隊伍里的成員都應(yīng)該可以輕松地構(gòu)建項目闽晦。

Fail early:如果 PR 的構(gòu)建在 CI 系統(tǒng)中失敗了,在修復(fù)完成之前提岔,PR 不要進(jìn)行合并仙蛉。

2. 代碼質(zhì)量

你的代碼應(yīng)該是堅實的 或者結(jié)實的。如何做到這一點碱蒙,完全取決于你自己荠瘪。代碼質(zhì)量并不只和 MVP/MVVM/MVC 有關(guān),同時也和 App 中每個組件的每一行代碼有關(guān)赛惩。筆者更傾向使用純函數(shù)和不可變對象哀墓。

Fail early:不要成為項目中唯一編寫可維護(hù)的代碼的開發(fā)者,確保其他成員也可以寫高質(zhì)量的代碼(和他們聊天喷兼,一起討論本文即可激勵他們@捍隆),從而防止審核時出現(xiàn)糟糕的代碼季惯。

3. 靜態(tài)代碼/資源分析

靜態(tài)代碼分析讓你在進(jìn)入生產(chǎn)環(huán)境之前找到代碼中的問題吠各。同時,也對代碼審核大有裨益星瘾。比如使用 Android Lint走孽、FindBugs、PMD琳状、SonarQube 和 FB Infer 等工具。

Fail early:在 CI 中運行靜態(tài)分析盒齿,安裝配置后念逞,如果項目中出現(xiàn)警告(不僅僅是錯誤信息)困食,盡早放棄項目。

4. 單元測試

是的翎承!是測試沒錯硕盹!單元測試通常會檢查某個函數(shù)/對象是否正確地完成它的工作。項目里的測試越多叨咖,代碼覆蓋率越高瘩例, App 在發(fā)布后的性能,會更好更穩(wěn)定甸各。事實上垛贤,單元測試可以發(fā)現(xiàn)大多數(shù)愚蠢的 bug。當(dāng)然趣倾,如果你的 App 會進(jìn)行數(shù)據(jù)處理的話聘惦,單元測試還將幫助你保證代碼工作正常。

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

  1. 筆者傾向于在 JVM 上運行單元測試儒恋,因為它比在設(shè)備/模擬器上運行快得多善绎。

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

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

  4. 你很快就會發(fā)現(xiàn),如果在 JVM 運行單元測試牧嫉,Android SDK 的類會被清除比勉,觸發(fā)他們時會拋出異常。這固然可悲驹止,但是是可修復(fù)的浩聋。如果需要 Android SDK 類的話,可以在 Robolectric 測試運行器下運行臊恋,Robolectric 提供了大部分實現(xiàn) Android SDK 類的方法衣洁。
    
  5. JUnit 提供了很棒的測試工具和相當(dāng)不錯的 Rules 概念,但是 JUnit 的斷言很不好用抖仅。 AssertJ 和 Truth 等工具對斷言的支持很好坊夫,并且可以在 JUnit (或 TestNG/Spock 等)下運行。
    
  6. 如果你需要檢查行為和復(fù)制某些對象撤卢,你可以使用 Mockito 之類的復(fù)制庫环凿。
    

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

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

5. 代碼覆蓋率

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

你可以通過apply plugin: ‘jacoco’語句啟用 Jacoco忍抽。你可以通過jacocoReport Gradle 任務(wù)配置哪些類/包應(yīng)該被檢查。

如果覆蓋率不夠高董朝,配置代碼覆蓋工具使之放棄構(gòu)建項目鸠项。如果你剛剛開始在一個已存在的項目中使用單元測試,除了非測試類益涧,一旦測試代碼可以覆蓋這些類锈锤,就將它們從排除列表中刪除。這個規(guī)則可以保證新代碼的覆蓋率闲询。根據(jù)覆蓋報告久免,你可以使用 jacoco-coverage 插件放棄構(gòu)建。

Fail early:確保在 CI 環(huán)境中檢查代碼覆蓋率扭弧,如果代碼覆蓋率不夠高阎姥,盡早放棄構(gòu)建。

6. 功能(UI)測試

沒錯鸽捻!更多的測試呼巴。功能測試會從用戶的角度檢查 APP 的功能。功能測試啟動應(yīng)用程序后御蒲,會驗證某些功能衣赶,比如在 UI 界面中加載出的數(shù)據(jù)是否正確顯示。QA 團(tuán)隊進(jìn)行的大部分工作可以通過功能測試達(dá)到自動化厚满,但這并不意味著你不需要 QA 團(tuán)隊府瞄。

運行功能測試有兩種基本的方法,在 Android Instrumentation 或 UIAutomator 里運行碘箍。最主要的區(qū)別是遵馆,在 Android Instrumentation 里運行功能測試時只能與應(yīng)用程序交互,并可以接觸到程序代碼丰榴。在 UIAutomator 里進(jìn)行的測試會運行在系統(tǒng)進(jìn)程中货邓,并通過Accessibility API(相比于 Android Intrumentation,此方式的功能十分有限)和應(yīng)用程序進(jìn)行交互四濒。如果你需要進(jìn)行應(yīng)用程序和其他應(yīng)用間的交互測試 — 可以使用 UIAutomater换况。但是通常情況下职辨,你可以通過 Android Instrmentation 模擬這類交互并進(jìn)行測試,而且這種測試無需依賴外部因素复隆。

建議:

  • 優(yōu)先選擇 Android Instrumentation 和 Espresso拨匆。
    
  • 測試中的頁導(dǎo)向架構(gòu)會幫助你更加方便快捷地編寫和維護(hù)程序(比如姆涩,當(dāng)你有一個描述應(yīng)用的屏幕或部分屏幕的 Page 類時)挽拂。
  • 與后端模擬交互會完全孤立測試程序,進(jìn)而并行運行測試骨饿,但同時也要確保不要共享測試間的狀態(tài)亏栈。推薦 MockWebServer,非常好用宏赘。
  • 開發(fā)者應(yīng)該編寫功能測試绒北,是的,你沒看錯察署。
  • 教 QA 團(tuán)隊編寫功能測試 — 通常 QA 們和開發(fā)者想的不一樣闷游,并知道需要檢查什么樣的情況。
  • 檢查功能測試的代碼覆蓋率贴汪。

Fail early:在 CI 中運行功能測試脐往,如果一些測試失敗的話,則放棄構(gòu)建項目扳埂。

7. 集成測試

是的业簿。依舊是測試。通常情況下阳懂,集成測試檢查應(yīng)用程序的不同組件如何協(xié)同工作梅尤,包括:HTTP 層、REST API 層和執(zhí)行層(RxJava 等)等等岩调。

設(shè)想一個使用了一堆其他類的類巷燥,它從后端加載數(shù)據(jù),然后進(jìn)行處理并存儲在數(shù)據(jù)庫中号枕。雖然你應(yīng)該先用單元測試覆蓋每個類缰揪,但是,你也可以用集成測試來覆蓋這種成分復(fù)雜的測試堕澄。

此處邀跃,與單元測試最主要區(qū)別在于,你并不是在使用模擬環(huán)境蛙紫,而是對象在測試中的真實實現(xiàn)拍屑。你可以模擬數(shù)據(jù)傳輸(MockWebServer)和數(shù)據(jù)庫狀態(tài),然后運行真實代碼坑傅,看看它們?nèi)绾喂ぷ鳌?/p>

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

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

8. 開發(fā)人員設(shè)置菜單(又名:調(diào)試抽屜)

調(diào)試版本中的開發(fā)人員設(shè)置菜單允許你啟用/禁用 Sthetho、LeakCanary 和 TinyDancer 之類的工具粉私,模擬/改變一些應(yīng)用程序的行為等等顽腾。

在應(yīng)用運行時更改和檢查應(yīng)用程序,而無需改寫代碼诺核,會為你和 QA 團(tuán)隊節(jié)省大量時間抄肖。

Fail early: LeakCanary 這樣的工具可以幫助你收到真實用戶發(fā)來的崩潰報告之前,偵測到問題所在窖杀。教你的 QA 團(tuán)隊使用類似的工具漓摩,在每次發(fā)版前進(jìn)行驗收測試。

That's it.
正文完入客。

請考慮你的開發(fā)文化管毙,并和團(tuán)隊成員討論這個話題,如此一來桌硫,你們正在打造的開發(fā)流程和產(chǎn)品質(zhì)量都可能得到顯著改善夭咬。

QualityMatters app

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

希望你能發(fā)現(xiàn)一些新意:

  • 單元測試咖驮;
  • 集成測試边器;
  • 功能測試;
  • 靜態(tài)代碼分析托修;
  • 代碼覆蓋率忘巧;
  • 開發(fā)人員設(shè)置菜單;
  • MVP睦刃、RxJava砚嘴、Dagger 2 和 Retrofit 2 等等。
淺談 Android 開發(fā)文化

QualityMatters app 將會一直維護(hù)更新下去涩拙。

一封致 Google 的公開信

正如之前所說际长,#質(zhì)量 > #表現(xiàn)

  • 請多發(fā)些關(guān)于測試的內(nèi)容!
  • 請測試(單元測試兴泥、集成測試和功能測試)庫和示例應(yīng)用程序工育。
  • Android 需要的是 Simulator,而不是 Emulator搓彻,因為 Robolectric…雖然毋庸置疑如绸,非常有用嘱朽,但應(yīng)該有更好的辦法。
  • Google 與開發(fā)社區(qū)結(jié)合怔接,可以改進(jìn) Android 開發(fā)的文化氛圍搪泳。

所以,我們需要 Android 開發(fā)文化扼脐!

相關(guān)閱讀:

原文地址:http://artemzin.com/blog/android-development-culture-the-document-qualitymatters/

OneAPM Mobile Insight 岸军,監(jiān)控網(wǎng)絡(luò)請求及網(wǎng)絡(luò)錯誤,提升用戶留存谎势。訪問 OneAPM 官方網(wǎng)站感受更多應(yīng)用性能優(yōu)化體驗凛膏,想閱讀更多技術(shù)文章杨名,請訪問 OneAPM 官方技術(shù)博客脏榆。

本文轉(zhuǎn)自 OneAPM 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市台谍,隨后出現(xiàn)的幾起案子须喂,更是在濱河造成了極大的恐慌,老刑警劉巖趁蕊,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坞生,死亡現(xiàn)場離奇詭異,居然都是意外死亡掷伙,警方通過查閱死者的電腦和手機(jī)是己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來任柜,“玉大人卒废,你說我怎么就攤上這事≈娴兀” “怎么了摔认?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宅粥。 經(jīng)常有香客問我参袱,道長,這世上最難降的妖魔是什么秽梅? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任抹蚀,我火速辦了婚禮,結(jié)果婚禮上企垦,老公的妹妹穿的比我還像新娘环壤。我一直安慰自己,他們只是感情好竹观,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布镐捧。 她就那樣靜靜地躺著潜索,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懂酱。 梳的紋絲不亂的頭發(fā)上竹习,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音列牺,去河邊找鬼整陌。 笑死,一個胖子當(dāng)著我的面吹牛瞎领,可吹牛的內(nèi)容都是我干的泌辫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼九默,長吁一口氣:“原來是場噩夢啊……” “哼震放!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驼修,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤殿遂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乙各,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨礁,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年耳峦,在試婚紗的時候發(fā)現(xiàn)自己被綠了恩静。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹲坷,死狀恐怖驶乾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冠句,我是刑警寧澤轻掩,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站懦底,受9級特大地震影響唇牧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聚唐,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一丐重、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杆查,春花似錦扮惦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浊仆。三九已至,卻和暖如春豫领,著一層夾襖步出監(jiān)牢的瞬間抡柿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工等恐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留洲劣,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓课蔬,卻偏偏與公主長得像囱稽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子二跋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,731評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理战惊,服務(wù)發(fā)現(xiàn),斷路器同欠,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • 能輸出才是有效精讀 上一講我們說了快速閱讀的技巧和需要注意的事項样傍。如果你已經(jīng)完成了快速閱讀這個步驟,這時候其實應(yīng)該...
    富蘭克林門徒閱讀 370評論 0 0
  • 命令模式 參考鏈接:https://www.ibm.com/developerworks/cn/linux/l-c...
    Mooner_guo閱讀 219評論 0 0