Java单元测试的意义_关于java单元测试的作用和必要性?
我覺(jué)得不是 java 單元測(cè)試的必要性,而是工程的單元測(cè)試必要性,和語(yǔ)言無(wú)關(guān)。
當(dāng)你的項(xiàng)目小的時(shí)候,簡(jiǎn)單的時(shí)候,當(dāng)然單元測(cè)試沒(méi)什么用。但是如果是寫(xiě)底層框架或者一些很大的項(xiàng)目時(shí),單元測(cè)試對(duì)于提高生產(chǎn)力很有用。單元測(cè)試的好處是給人的,不是給機(jī)器的。
而且從程序設(shè)計(jì)的角度上看:單元測(cè)試可以讓你更好的拆分程序?yàn)樽钚卧?#xff0c;幫助你更好的解耦。
用到單元測(cè)試則必不可少的會(huì)用一些自動(dòng)單元測(cè)試框架,對(duì)完成工程的自動(dòng)化測(cè)試很有用。
光說(shuō)沒(méi)什么意思,我們可以舉例子:
場(chǎng)景一:你有一個(gè)底層的方法,業(yè)務(wù)邏輯上有幾十上百個(gè)功能在使用這個(gè)方法。有一天,你想要給這個(gè)方法添加新的功能,添加之后到底好不好用呢?有沒(méi)有 bug 呢?如果不用單元測(cè)試,你需要把幾十上百個(gè)功能都跑一遍來(lái)驗(yàn)證方法的正確性。而使用單元測(cè)試的思路,則是對(duì)這個(gè)最小單元(即這個(gè)方法)進(jìn)行測(cè)試,模擬可能的輸入,看是否獲得相應(yīng)的輸出,對(duì)參數(shù)的邊界做判斷等等,這就是一個(gè)簡(jiǎn)單的單元測(cè)試了,你可以不用任何單元測(cè)試框架,自己寫(xiě)就行。
場(chǎng)景二:你在寫(xiě)一個(gè)單元(方法),而這個(gè)單元依賴(lài)其它的方法,而這個(gè)方法的執(zhí)行結(jié)果是不受控制的,我們想要可控的測(cè)試,想要這個(gè)依賴(lài)的方法的幾種執(zhí)行模式都能按照預(yù)期進(jìn)行,那么樁件(stub)和仿件對(duì)象(Mock)的思路就出現(xiàn)了 ,我們對(duì)這個(gè)依賴(lài)的方法進(jìn)行仿造,使其執(zhí)行后得到我們預(yù)期的結(jié)果,這樣測(cè)試過(guò)程中即使出了錯(cuò),也可以斷定不是依賴(lài)方法導(dǎo)致的錯(cuò)誤,為開(kāi)發(fā)人員減少了一部分找 bug 的時(shí)間。現(xiàn)在大多數(shù)的單元測(cè)試軟件、框架都有很方便的 stub、mock 接口,能很好的實(shí)現(xiàn)大多數(shù)測(cè)試需求。
場(chǎng)景三:擴(kuò)展場(chǎng)景一的情況,你的程序架構(gòu)是分層的,比如分了兩層,上層是應(yīng)用層,下層是驅(qū)動(dòng)層。應(yīng)用層依賴(lài)于驅(qū)動(dòng)層的若干方法,而且依賴(lài)關(guān)系錯(cuò)綜復(fù)雜。如一個(gè)應(yīng)用功能依賴(lài)了十幾個(gè)底層方法(底層方法間也有互相依賴(lài)的情況),那么,如果這個(gè)應(yīng)用功能有了 bug,那么是這個(gè)應(yīng)用功能本身的代碼的問(wèn)題呢,還是依賴(lài)的這十幾個(gè)方法的問(wèn)題呢?還是說(shuō)這十幾個(gè)方法各自依賴(lài)的其他方法的問(wèn)題呢?如果人工去找,累個(gè)半死。就算找到,修改好后,發(fā)現(xiàn)新的修改雖然修復(fù)了原有 bug,但又引起了其他 bug,那么這個(gè)新 bug 要繼續(xù)找么?使用單元測(cè)試后,為驅(qū)動(dòng)層的所有劃分為最小單元的方法都編寫(xiě)測(cè)試,以最大程度(高測(cè)試覆蓋率)保證這些單元可以獨(dú)立運(yùn)行成功,那么即使出了錯(cuò),修改了某個(gè)方法,也能快速的定位到 bug 和修改后對(duì)程序的影響。
拋去一大堆理論,其實(shí)單元測(cè)試最直觀(guān)的一個(gè)好處就是:當(dāng)你在改了一個(gè)方法之后,跑一遍所有的單元測(cè)試,能快速的發(fā)現(xiàn)你有沒(méi)有把程序改成傻逼。
你可能說(shuō)這個(gè)項(xiàng)目都是你自己寫(xiě)的,你對(duì)這些程序了如指掌。但是加入別人接手你的項(xiàng)目,或者你接手了別人的項(xiàng)目呢?找 bug 時(shí)你會(huì)不會(huì)罵那個(gè)沒(méi)寫(xiě)單元測(cè)試的人sb?很多的時(shí)候工程并不是一個(gè)人的玩具,需要為多人協(xié)作做一些妥協(xié)。
這么說(shuō)理解了嗎?
順便這里推一下我自己的框架 WorkerA, 框架的核心部分 WorkerF 中就使用了 phpunit 做單元測(cè)試,幫我開(kāi)發(fā)省了很多的時(shí)間。
總結(jié)
以上是生活随笔為你收集整理的Java单元测试的意义_关于java单元测试的作用和必要性?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何使用AnyGantt创建和配置3D图
- 下一篇: 武汉工程大学计算机考研资料汇总