前言
? ? 5月份我從平安離職,辦完離職手續(xù)后相繼又玩了半個(gè)多月酷鸦,中途一邊玩一邊面試睹逃,也算是給自己放了個(gè)小長(zhǎng)假,直到6月中旬才入職一家新創(chuàng)業(yè)公司早直。然而這家公司有一個(gè)非常重的KPI指標(biāo)(單元測(cè)試)寥假。毋庸置疑,程序員要對(duì)自己編寫的代碼負(fù)責(zé)霞扬,你不僅要保證它能通過(guò)編譯糕韧,正常地運(yùn)行,而且要滿足需求和設(shè)計(jì)預(yù)期的效果喻圃。單元測(cè)試正是驗(yàn)證代碼行為是否滿足預(yù)期的有效手段之一萤彩。但不可否認(rèn),做測(cè)試是件很枯燥無(wú)趣的事情(至少我是很排斥的)而一遍又一遍的測(cè)試則更是讓人生畏的工作斧拍。正因?yàn)槿绱寺闊┤阜觯猿绦騿T們編寫單元測(cè)試的熱情不是很高。但是沒(méi)辦法肆汹,苦于無(wú)奈公司要求寫測(cè)試用例愚墓,只能硬著頭皮上予权,因?yàn)槟銈兪枪こ處煟瑳](méi)有什么是不可能的浪册。幸運(yùn)的是扫腺,單元測(cè)試工具 JUnit使這一切變得簡(jiǎn)單藝術(shù)起來(lái)。
調(diào)查發(fā)現(xiàn)
通過(guò)和幾個(gè)開發(fā)朋友的討論议经,和網(wǎng)上的調(diào)查斧账,主要有這幾種原因谴返,導(dǎo)致程序員對(duì)單元測(cè)試很排斥煞肾,或許說(shuō)很不以為意。
◆不知道怎么編寫單元測(cè)試
◆項(xiàng)目沒(méi)有要求嗓袱,所以不編寫
◆單元測(cè)試價(jià)值不高籍救,完全是浪費(fèi)時(shí)間
◆業(yè)務(wù)邏輯比較簡(jiǎn)單,不值得編寫單元測(cè)試
◆不管怎樣渠抹,集成測(cè)試將會(huì)抓住所有的 bug蝙昙,用不著進(jìn)行單元測(cè)試
◆在項(xiàng)目的前期還是盡量去編寫單元測(cè)試,但是越到項(xiàng)目的后期就越失控
◆為了完成編碼任務(wù)梧却,沒(méi)有足夠的時(shí)間編寫單元測(cè)試奇颠。編寫單元測(cè)試會(huì)導(dǎo)致不能按時(shí)完成編碼任務(wù),導(dǎo)致項(xiàng)目延期
◆Android 主是還是界面上的東西放航,很多業(yè)務(wù)邏輯不好模擬測(cè)試用例
很顯然烈拒,這些原因歸根結(jié)底,無(wú)外乎就是不了解單元測(cè)試广鳍,自認(rèn)為很聰明荆几,自己懶不想去測(cè)試,對(duì)項(xiàng)目的時(shí)間赊时、進(jìn)度把控不好吨铸。
JUnit4注解解釋
1. @Test : 測(cè)試方法,測(cè)試程序會(huì)運(yùn)行的方法祖秒,后邊可以跟參數(shù)代表不同的測(cè)試诞吱,如(expected=XXException.class) 異常測(cè)試,(timeout=xxx)超時(shí)測(cè)試
2. @Ignore : 被忽略的測(cè)試方法
3. @Before: 每一個(gè)測(cè)試方法之前運(yùn)行
4. @After : 每一個(gè)測(cè)試方法之后運(yùn)行
5. @BeforeClass: 所有測(cè)試開始之前運(yùn)行
6. @AfterClass: 所有測(cè)試結(jié)束之后運(yùn)行
fail方法是指測(cè)試失敗
assertEquals測(cè)試2個(gè)參數(shù)是否相等竭缝,具體參考相應(yīng)API
更多方法可參考相應(yīng)API文檔(博文末尾分享下載連接給大家)
1.新建一個(gè)工程后以如果用Eclipse還要下載相對(duì)應(yīng)的jar包房维,這里主要以Android Studio 為主,畢竟Google已經(jīng)不更新ADT了歌馍,這里不做過(guò)多的解釋握巢。 新建工程后,我們?cè)?app/build.gradle 配制如下圖:
這樣依賴就配好了松却。
2.創(chuàng)建一個(gè)Calculator類暴浦,里面主是要我們要測(cè)試的方法溅话。代碼如下:
3.打開工程結(jié)構(gòu)我們可以清楚的看到Android Studio 測(cè)試有兩個(gè)目錄,androidTest/test,androidTest測(cè)試目錄是android 自己本身的主要是測(cè)UI測(cè)試,這里主要講Junit所以我們只要關(guān)心test 里寫相對(duì)應(yīng)的測(cè)試方法即可歌焦。代碼如下:
我們只要在test/對(duì)測(cè)試類即可飞几。 細(xì)心的同學(xué)有沒(méi)有注意到,Junit其實(shí)就是注解以的方式独撇,在本文的開始前屑墨,已經(jīng)做了對(duì)應(yīng)注解的介紹。 setup();方法就是初始化對(duì)象 @Before, 拿對(duì)對(duì)象我們才可以調(diào)用Calculator類中我們寫的函數(shù)纷铣。大家有沒(méi)有看到我在setup()做了一層不為空的判斷卵史,這樣的好處就是,不用每次都創(chuàng)建新的實(shí)例(這也是性能優(yōu)化的一種體現(xiàn)搜立,提高代碼質(zhì)量)以躯。調(diào)用Calculator中的函數(shù)add()方法,這是一個(gè)加法的運(yùn)算啄踊。 通過(guò)傳參我們可以知道結(jié)果是多少忧设。Assert.assertEquals(7,sum); 其實(shí)就是一個(gè)預(yù)期值與實(shí)際值的一個(gè)對(duì)比。(注:別忘了在方法前加下 @Test颠通,這樣Junit才知道這是一個(gè)測(cè)試方法)接下來(lái)址晕,我們可以測(cè)試了。
到這里就結(jié)束了顿锰,源碼大家可以從github下載谨垃。
https://github.com/KnightOneAdmin/android_junit_tutorial.git