之前看小米的"一塊鋼板的旅程"播急,我就想從代碼的旅程展開說說。不同于從項(xiàng)目流程展開尼夺,測試流程展開,那么如果產(chǎn)品大部分bugs都代碼引入的产园,我們不妨就從代碼的角度展開來說汞斧。而工具是提煉了規(guī)則,流程什燕,能力的粘勒,所以我會用工具來說明能做的事情。通過這個(gè)角度屎即,不是想說庙睡,大家就用那些工具吧, 而是工具的思路技俐,我們除了在測試環(huán)節(jié)去建設(shè)工具之外乘陪,還能做什么。
源碼開發(fā)雕擂,對于代碼來說啡邑,應(yīng)該就是它出生的一刻。能做的事情無非兩樣井赌,1谤逼,組件:用現(xiàn)成代碼來減少問題, 優(yōu)化代碼質(zhì)量,2仇穗,自測:用工具在本地測試新代碼來保證沒問題流部。先說組件,現(xiàn)成的代碼能提供什么纹坐?1.快速可維護(hù)的代碼枝冀,如butterknife; 2.更佳的性能,如Fresco更高性能的圖片緩存和展示機(jī)制, okhttp支持spdy耘子,io性能更佳的http操作api?;android-Iconics 在android使用iconfont果漾,svg,減少安裝包大泄仁摹跨晴;3. 集中管理,eventbus提供更佳的回調(diào)機(jī)制片林,當(dāng)然它不算是集中管理的經(jīng)典,但是因?yàn)槠涫褂玫姆绞揭财鸬搅思泄芾淼淖饔谩N腋胫傅募泄芾硎抢绶逊猓覀兛梢越⒁粋€(gè)線程管理器焕妙,全部的線程實(shí)例都從這里獲取,如果某些優(yōu)先級極高的操作弓摘,我們可以統(tǒng)一降低其他線程優(yōu)先級; 4.避免錯(cuò)誤, 如android-weak-handler焚鹊。
然后就是自測,因?yàn)槭窃创a開發(fā)階段韧献,所以最好要跟IDE結(jié)合末患,在ide輸出結(jié)果。這類東西android studio就提供了跟lint靜態(tài)檢查的能力锤窑,分析cyclic的能力等等璧针。像微軟這類公司,如果沒有跑fxcop渊啰,stylecop連check in都不行探橱,甚至結(jié)合svn hook來做強(qiáng)制檢查,不符合就不讓check in绘证。當(dāng)然這種自測還包括了借助工具的code review隧膏, 這里就不多介紹了。
補(bǔ)充一句嚷那,源碼開發(fā)是最容易被忽略的環(huán)節(jié)胞枕,無論是開發(fā)集成到ide的插件,高性能的庫都會非常高效率地提升質(zhì)量魏宽,而且會有以點(diǎn)打面的作用腐泻。
集成編譯
,這個(gè)階段有什么特別的湖员?有贫悄,它是代碼與功能信息連接的地方。除了編譯打包工具娘摔,如gradle窄坦,ant,NativeLibCompression等優(yōu)化打包壓縮工具之外凳寺,還能做測試鸭津,這里的測試跟后面的測試調(diào)試大有不同。正如上面提到的肠缨,代碼與功能信息連接的地方逆趋,利用測試工具來測試功能,配合代碼信息晒奕,就能更佳精準(zhǔn)地執(zhí)行測試闻书,定位問題名斟。舉個(gè)簡單的例子,這里可以做基于代碼增量信息的instrument單元測試魄眉,uiautomator等自動化測試砰盐,lint、findbugs坑律、infer等靜態(tài)檢查岩梳,也可以讓剛剛提到的測試結(jié)果與svn diff的結(jié)果結(jié)合,進(jìn)而定位問題晃择。這時(shí)冀值,不得不說所謂“天下武功唯快不破”也在這里可以體現(xiàn),如果可以做到每ci就編譯集成(持續(xù)集成)宫屠,每次集成測試都可以在10分鐘(人的注意力高度集中時(shí)間就是10分鐘)內(nèi)完成測試列疗,那么定位就可以在每個(gè)check in,甚至可以做到?jīng)]有集成通過就不讓check in激况。要做這個(gè)事情作彤,這些編譯,測試乌逐,靜態(tài)檢查都必須快起來竭讳,什么分布式,并行計(jì)算等等都不是理想浙踢,而是真真切切的需要绢慢。再拓展下大家的想象力,哪怕是Monkey測試洛波,如果能快起來胰舆,5分鐘完全上百個(gè)界面的遍歷,那么它也能被持續(xù)集成容納蹬挤,也能利用版本之間的svn diff信息來強(qiáng)化問題定位了缚窿。
測試調(diào)試,這個(gè)階段時(shí)是大家最不容易遺忘的焰扳,80%的精力都在這里倦零,建設(shè)的工具也最多。這里的工具兩類吨悍,度量類的和分析類的扫茅。之前我寫過一篇《假如不是BAT,專項(xiàng)測試怎么做》,里面就提到過育瓜。這里不想多說葫隙,簡單介紹幾個(gè)特別的,思路可以借鑒和拓展的躏仇,
1. tPacketCapture手機(jī)無root抓包恋脚,這個(gè)應(yīng)用的特點(diǎn)就是用了vpn的方式來配合抓包腺办,大家仔細(xì)想像,當(dāng)大家頭痛為什么要root了才能抓包的時(shí)候慧起,有木有想過這個(gè)思路呢菇晃? 在這個(gè)思路底下,純手機(jī)端的無root的弱網(wǎng)模擬蚓挤,蓋包,丟包驻子,都不是夢呀灿意。
2. MAT,LeakCanary崇呵,AllocationTracer缤剧,android-hprof-tools,dumpsys meminfo這些都是內(nèi)存測試分析的工具域慷。一大堆工具荒辕,能給我們什么思路呢?我們不妨從程序犹褒,代碼抵窒,時(shí)間,規(guī)則這三個(gè)維度來看待我們的工具叠骑,android-hprof-tools優(yōu)化抓取hrof速度的李皇,與MAT快照分析配合使用,獲取的信息是靜態(tài)的代碼信息宙枷,例如MAT獲取是類名掉房,對象數(shù),引用關(guān)系等慰丛,這里沒有時(shí)間的概念和信息卓囚,但是在代碼之上,可以分析問題诅病。而AllocationTracer就是在代碼信息上哪亿,加上了時(shí)間的概念,可以稱為動態(tài)的代碼信息睬隶,這里分析的問題就必須跟時(shí)間是相關(guān)的锣夹,例如GC, 垃圾回收觸發(fā)的時(shí)機(jī)對程序流暢度的影響。另外一個(gè)維度苏潜,隱匿了代碼的信息银萍,那就是程序的信息,這里top恤左,meminfo贴唇,gc日志是代表搀绣,主要用來發(fā)現(xiàn)問題,因?yàn)橄鄬p量戳气,持續(xù)時(shí)間可以更長链患。最后就是規(guī)則,在代碼信息之上融合了規(guī)則的測試工具瓶您,會自動發(fā)現(xiàn)問題麻捻,最經(jīng)典的就是leakcanary了。按照這個(gè)思路呀袱,大家不妨可以想想其他的專項(xiàng)工具贸毕,不要覺得沒得想,最起碼現(xiàn)在看來“代碼+時(shí)間+規(guī)則” = allocation tracer + 規(guī)則的工具夜赵,起碼我至今還沒有發(fā)現(xiàn)明棍。
發(fā)布運(yùn)營,發(fā)布就是研發(fā)流程外了寇僧,我們的質(zhì)量保證不是應(yīng)該在研發(fā)流程內(nèi)徹底保證么摊腋?事實(shí)上,臣妾做不到呀嘁傀。用戶環(huán)境很復(fù)雜的兴蒸,就以上次有個(gè)同學(xué)問我,國際網(wǎng)絡(luò)測試要怎么辦心包。我也只能厚著臉皮說类咧,發(fā)布運(yùn)營上做文章,做可以定位問題的數(shù)據(jù)上報(bào)蟹腾。沒錯(cuò)痕惋,研發(fā)流程內(nèi)可以做一些相關(guān)質(zhì)量保障,但投入產(chǎn)出比太低了娃殖,想想值戳,難不成你要飛去美國做測試,當(dāng)然炉爆,方便一點(diǎn)的就是買deviceanywhere的服務(wù)來做測試堕虹。如果能考慮灰度發(fā)布,那事情就簡單多了芬首。一方面赴捞,可以用applause提供的眾測服務(wù)。另一方面郁稍,光“測”不夠赦政,因?yàn)樵谶h(yuǎn)端定位問題是充滿悲劇的事情,必須要有遠(yuǎn)程定位問題的能力。定位信息有了恢着,那征服“自定定位分析”桐愉,那為什么不動態(tài)運(yùn)營一把呢? 最經(jīng)典的就是網(wǎng)絡(luò)路由出口的問題掰派,不同出口的網(wǎng)速到不同的地方从诲,不同的運(yùn)營商,天差地別靡羡,如果發(fā)現(xiàn)a出口不行系洛,是不是自動動態(tài)劃同一區(qū)域同一運(yùn)營商可以試一下b出口呢?如果可以略步,是不是可以動態(tài)調(diào)整過來呢碎罚?這里有太多太多事情可以做了。上面說的必經(jīng)是網(wǎng)絡(luò)策略纳像,那除了網(wǎng)絡(luò)之外,對于功能拯勉,可以用ABTest, 如facebook的airlock, 監(jiān)控工具可以用眾多的APM(此處不列舉)竟趾, 有bug可以用hotfix工具nuwa。
總結(jié)宫峦,容易遺忘的源碼開發(fā):效率最高岔帽;唯快不破的編譯集成:聯(lián)合代碼信息;用力最多的測試調(diào)試:時(shí)間+代碼+程序+規(guī)則导绷;發(fā)布運(yùn)營:創(chuàng)造最接近用戶的測試調(diào)試環(huán)境犀勒。
PS: qcon2016, 再次去了,分享的題目就是大家遺忘已久但大有可為的Monkey, 大家多多關(guān)注