單元測(cè)試的重要性不言而喻,自我開(kāi)發(fā)生涯以來(lái),從很少注釋過(guò)過(guò)場(chǎng)場(chǎng),到非常重視。愛(ài)掏網(wǎng) - it200.com
單元測(cè)試為什么會(huì)讓人忽視呢?
通常情況像一些查詢(xún)或者增刪改之類(lèi),拿我來(lái)說(shuō),即便報(bào)錯(cuò)我大概一掃,我就知道錯(cuò)誤是什么了,該如何排查,因?yàn)榫湍肧pringMVC來(lái)說(shuō)或者M(jìn)yBatis等,再不濟(jì)就是Spring的依賴(lài)注入問(wèn)題,拿MyBatis來(lái)說(shuō),要么就是sql問(wèn)題,要么就是參數(shù)問(wèn)題,再不濟(jì)就是與Spring動(dòng)態(tài)掃描有關(guān)或者是mybatis中專(zhuān)門(mén)寫(xiě)sql的配置文件某個(gè)地方語(yǔ)法錯(cuò)誤等,這些錯(cuò)誤都是可預(yù)見(jiàn)的,說(shuō)句不好聽(tīng)的話(huà),再不濟(jì)百度一搜,頓時(shí)分分秒就KO了。愛(ài)掏網(wǎng) - it200.com但是大家有沒(méi)有想過(guò)這樣一個(gè)問(wèn)題?為什么我們老是在犯這些重復(fù)性錯(cuò)誤呢?原因是什么呢?
不重視測(cè)試。愛(ài)掏網(wǎng) - it200.com
當(dāng)然了就專(zhuān)業(yè)來(lái)說(shuō),我們是軟件開(kāi)發(fā)工程師,專(zhuān)注于開(kāi)發(fā),至于測(cè)試方面,我們又不是專(zhuān)門(mén)的測(cè)試,管我們什么事。愛(ài)掏網(wǎng) - it200.com
我只能說(shuō):此言差異。愛(ài)掏網(wǎng) - it200.com
為什么呢?
坦白的說(shuō),程序的Bug基本都是由于我們這些開(kāi)發(fā)人員導(dǎo)致的,比如說(shuō)代碼風(fēng)格亂七八糟,寫(xiě)完代碼看到功能實(shí)現(xiàn)了,就什么都不管了,也不多測(cè)測(cè),以至于每次都是測(cè)試人員來(lái)測(cè),發(fā)現(xiàn)誰(shuí)的錯(cuò)誤就通知誰(shuí),而誰(shuí)誰(shuí)就開(kāi)始改了。愛(ài)掏網(wǎng) - it200.com
我認(rèn)真想了下,其實(shí)很多錯(cuò)誤是可以避免的。愛(ài)掏網(wǎng) - it200.com
就拿我公司來(lái)說(shuō),我們沒(méi)有測(cè)試沒(méi)有前端沒(méi)有運(yùn)維,而我作為Java后臺(tái)開(kāi)發(fā),同時(shí)兼任前端、測(cè)試、運(yùn)維,記得在第一個(gè)項(xiàng)目初期時(shí),為了加快項(xiàng)目進(jìn)度,盡快讓老板看到對(duì)應(yīng)的效果,我們快速開(kāi)發(fā),能粘貼復(fù)制盡量不手寫(xiě),遇到問(wèn)題百度搜索,找到對(duì)應(yīng)的解決方案,代碼復(fù)制過(guò)來(lái),看能不能跑起來(lái),能跑起來(lái),就不管了,功能實(shí)現(xiàn)就好,跑不起來(lái),繼續(xù)百度或者Google,當(dāng)然一般情況百度比較多。愛(ài)掏網(wǎng) - it200.com
前期項(xiàng)目急,甚至表單校驗(yàn)懶得寫(xiě),甚至有些代碼注釋都不寫(xiě),命名的話(huà)想到規(guī)范就規(guī)范,想不起,湊合吧,對(duì)于那時(shí)的我來(lái)說(shuō),這些都不是最重要的,最重要的是,每周完成工作任務(wù),提交代碼,功能實(shí)現(xiàn)。愛(ài)掏網(wǎng) - it200.com當(dāng)然欲速則不達(dá),再怎么快,總會(huì)因?yàn)檫@樣的錯(cuò),那樣的錯(cuò)導(dǎo)致項(xiàng)目進(jìn)度延遲。愛(ài)掏網(wǎng) - it200.com而且這些錯(cuò)誤是可以完全避免的。愛(ài)掏網(wǎng) - it200.com
比如我們使用的框架是Spring+MyBatis+SpringMVC,采用的表現(xiàn)層技術(shù)是JSP,數(shù)據(jù)庫(kù)為MySQL。愛(ài)掏網(wǎng) - it200.com
JSP對(duì)于廣大的Java同行們,并不陌生。愛(ài)掏網(wǎng) - it200.com
話(huà)走的有點(diǎn)偏。愛(ài)掏網(wǎng) - it200.com本篇著重與凸顯單元測(cè)試之重要性。愛(ài)掏網(wǎng) - it200.com
進(jìn)入正題:
無(wú)論是前后端分離開(kāi)發(fā),還是想我上述列出的前后端不是特別分離的jsp技術(shù)等,單元測(cè)試起到不可估量的作用。愛(ài)掏網(wǎng) - it200.com
我總結(jié)到,為什么表現(xiàn)層方面就會(huì)出現(xiàn)這樣的那樣的錯(cuò)誤,關(guān)鍵在于控制層代碼有問(wèn)題,也就是Controller層。愛(ài)掏網(wǎng) - it200.com
通常情況下,像我現(xiàn)在開(kāi)發(fā),通常Controller代碼,我會(huì)通過(guò)單元測(cè)試測(cè)試好幾遍,當(dāng)然也做條件,這樣的話(huà),可以避免一些簡(jiǎn)單的錯(cuò)誤,什么空指針,參數(shù)問(wèn)題等等。愛(ài)掏網(wǎng) - it200.com而且對(duì)于表單提交方面的,例如注冊(cè)、添加用戶(hù)、批量增加或者修改等,都是可以通過(guò)單元測(cè)試測(cè)試是否正常。愛(ài)掏網(wǎng) - it200.com
記得某位朋友曾經(jīng)說(shuō)過(guò),從單元測(cè)試到業(yè)務(wù)測(cè)試再到UI測(cè)試(WEB測(cè)試),越底層,花費(fèi)的時(shí)間成本越小,很容易找到錯(cuò)誤,越到高層越不易排錯(cuò),當(dāng)然了,排錯(cuò)的方式也很重要。愛(ài)掏網(wǎng) - it200.com
這里我想說(shuō)的是,盡量能在單元測(cè)試可以預(yù)見(jiàn)錯(cuò)誤的前提下,盡量排錯(cuò)錯(cuò)誤的可能性,因?yàn)榈絎EB階段是非常讓人痛苦的。愛(ài)掏網(wǎng) - it200.com
越簡(jiǎn)單的事情往往都會(huì)讓人忽略的,坦白的說(shuō)吧,我發(fā)現(xiàn)一個(gè)很貼近現(xiàn)實(shí)的情況,就是我們開(kāi)發(fā)人員,就我個(gè)人而言,有的時(shí)候覺(jué)得存在Bug,除非其他同事發(fā)現(xiàn)了,說(shuō)了下,或者實(shí)際業(yè)務(wù)出問(wèn)題,不然我不會(huì)改的,也懶得改。愛(ài)掏網(wǎng) - it200.com我想這是我半年前的心理。愛(ài)掏網(wǎng) - it200.com現(xiàn)在的我以寫(xiě)的代碼讓人盡可能容易讓同事看的懂,盡量簡(jiǎn)潔,同時(shí)現(xiàn)在我對(duì)于我寫(xiě)的代碼,我可以清楚的知道它是如何跑起來(lái)的,會(huì)出現(xiàn)哪些問(wèn)題。愛(ài)掏網(wǎng) - it200.com當(dāng)然了,對(duì)于一些簡(jiǎn)單的低級(jí)錯(cuò)誤,我現(xiàn)在已經(jīng)通過(guò)單元測(cè)試排除掉了。愛(ài)掏網(wǎng) - it200.com而且再加上嚴(yán)格的表單校驗(yàn)。愛(ài)掏網(wǎng) - it200.com統(tǒng)一規(guī)范的js書(shū)寫(xiě)和每天十到十五分鐘早會(huì)的匯報(bào)和簡(jiǎn)單交流及其加強(qiáng)溝通的情況下,我們的Bug越來(lái)越少了,代碼整體的性能也越來(lái)越好,簡(jiǎn)潔優(yōu)美,當(dāng)然了,這還遠(yuǎn)遠(yuǎn)不夠,相對(duì)于第一個(gè)項(xiàng)目而言,我們的第二個(gè)項(xiàng)目一直到現(xiàn)在的第三個(gè)項(xiàng)目,越來(lái)越好了。愛(ài)掏網(wǎng) - it200.com希望繼續(xù)努力保持下去。愛(ài)掏網(wǎng) - it200.com
?
另外補(bǔ)充到:
對(duì)于前后端交互,無(wú)論是AJAX或者vue.js等等,SpringMVC的Controller代碼,基本上都是可以通過(guò)單元測(cè)試得到結(jié)果的,單元測(cè)試過(guò)了,自然出錯(cuò)率會(huì)減少很多。愛(ài)掏網(wǎng) - it200.com
當(dāng)然了,我說(shuō)的單元測(cè)試,不是簡(jiǎn)單的運(yùn)行就可以了,而是有條件的列出實(shí)際情況,這需要根據(jù)實(shí)際業(yè)務(wù)情況而定,當(dāng)然了也不能總是在單元測(cè)試了,畢竟開(kāi)發(fā)進(jìn)度要保持增長(zhǎng)。愛(ài)掏網(wǎng) - it200.com
?
總結(jié):
上面的描述,也許不好理解,也許重點(diǎn)不突出。愛(ài)掏網(wǎng) - it200.com下面我要列出我認(rèn)為重要的幾點(diǎn)?
(1)小公司而言,后臺(tái)兼任前后臺(tái)開(kāi)發(fā),確保后臺(tái)參數(shù),可以在前臺(tái)校驗(yàn)的,盡量放在前臺(tái),這對(duì)于減輕服務(wù)器負(fù)載非常有幫助;
(2)controller代碼中的各個(gè)@RequestMapping下的代碼是可以通過(guò)單元測(cè)試避免很多錯(cuò)誤的,例如空指針或者sql有誤或者傳參類(lèi)型問(wèn)題或者resultType或resultMap常見(jiàn)的問(wèn)題等,這些是可以避免的;
(3)寫(xiě)代碼,無(wú)論是js或者Java代碼,一定要清楚的知道它是如何運(yùn)行的,這里說(shuō)的,并不是要你知道非常清晰的每一步,因?yàn)槟鞘怯?jì)算機(jī)底層原理,這個(gè)底層原理我也不懂,正在學(xué)習(xí)中。愛(ài)掏網(wǎng) - it200.com我所說(shuō)的知道它是如何運(yùn)行的,是指,你能通過(guò)大腦想象,描述它是怎么走了,比如這個(gè)參數(shù)傳到這個(gè),但是參數(shù)值有誤,會(huì)出現(xiàn)什么情況等等這樣的情況,這樣可以確保你的思維是清楚,思維的清楚,也代表代碼邏輯的清楚。愛(ài)掏網(wǎng) - it200.com作為開(kāi)發(fā)人員,連自己的代碼都不知道怎么描述,說(shuō)個(gè)所以然來(lái),那么他的代碼是非常糟糕的;
(4)代碼,以追求簡(jiǎn)單易懂,清楚明了為主,讓維護(hù)的人易維護(hù),讓幾個(gè)月后的自己感謝自己。愛(ài)掏網(wǎng) - it200.com更讓整體系統(tǒng)性能更好。愛(ài)掏網(wǎng) - it200.com其實(shí),很多簡(jiǎn)單的事情堆積起來(lái)就是一件不平凡的事情。愛(ài)掏網(wǎng) - it200.com
?
以上就說(shuō)這么多了,歡迎編程的友友們不吝賜教。愛(ài)掏網(wǎng) - it200.com
?