單元測試與編程的關(guān)系就好比學(xué)習(xí)高中數(shù)學(xué)你得要知道最基礎(chǔ)的三角函數(shù)是什么。這只是一個(gè)片面的比喻。但大致能說明單元測試和編程的關(guān)系。就如檢驗(yàn)畫程序框圖是否正確,也需要最后的測試才能說明程序設(shè)計(jì)是否正確,它們的邏輯性很強(qiáng)。這就是單元測試的大概意思。對于程序員來說,如果養(yǎng)成了對自己寫的代碼進(jìn)行單元測試的習(xí)慣,不但可以寫出高質(zhì)量的代碼,而且還能提高編程水平。
其實(shí)我們每天都在做單元測試。你寫了一個(gè)函數(shù),除了極簡單的外,總是要執(zhí)行一下,看看功能是否正常,有時(shí)還要想辦法輸出些數(shù)據(jù),如彈出信息窗口什么的,這,也是單元測試,把這種單元測試稱為臨時(shí)單元測試。只進(jìn)行了臨時(shí)單元測試的軟件,針對代碼的測試很不完整,代碼覆蓋率要超過70%都很困難,未覆蓋的代碼可能遺留大量的細(xì)小的錯(cuò)誤,這些錯(cuò)誤還會互相影響,當(dāng)BUG暴露出來的時(shí)候難于調(diào)試,大幅度提高后期測試和維護(hù)成本,也降低了開發(fā)商的競爭力。可以說,進(jìn)行充分的單元測試,是提高軟件質(zhì)量,降低開發(fā)成本的必由之路。
對于程序員來說,如果養(yǎng)成了對自己寫的代碼進(jìn)行單元測試的習(xí)慣,不但可以寫出高質(zhì)量的代碼,而且還能提高編程水平。
要進(jìn)行充分的單元測試,應(yīng)專門編寫測試代碼,并與產(chǎn)品代碼隔離。我認(rèn)為,比較簡單的辦法是為產(chǎn)品工程建立對應(yīng)的測試工程,為每個(gè)類建立對應(yīng)的測試類,為每個(gè)函數(shù)(很簡單的除外)建立測試函數(shù)。首先就幾個(gè)概念談?wù)勎业目捶ā?/p>
一般認(rèn)為,在結(jié)構(gòu)化程序時(shí)代,單元測試所說的單元是指函數(shù),在當(dāng)今的面向?qū)ο髸r(shí)代,單元測試所說的單元是指類。以我的實(shí)踐來看,以類作為測試單位,復(fù)雜度高,可操作性較差,因此仍然主張以函數(shù)作為單元測試的測試單位,但可以用一個(gè)測試類來組織某個(gè)類的所有測試函數(shù)。單元測試不應(yīng)過分強(qiáng)調(diào)面向?qū)ο螅驗(yàn)榫植看a依然是結(jié)構(gòu)化的。單元測試的工作量較大,簡單實(shí)用高效才是硬道理。
有一種看法是,只測試類的接口(公有函數(shù)),不測試其他函數(shù),從面向?qū)ο蠼嵌葋砜矗_實(shí)有其道理,但是,測試的目的是找錯(cuò)并最終排錯(cuò),因此,只要是包含錯(cuò)誤的可能性較大的函數(shù)都要測試,跟函數(shù)是否私有沒有關(guān)系。對于C++來說,可以用一種簡單的方法區(qū)隔需測試的函數(shù):簡單的函數(shù)如數(shù)據(jù)讀寫函數(shù)的實(shí)現(xiàn)在頭文件中編寫(inline函數(shù)),所有在源文件編寫實(shí)現(xiàn)的函數(shù)都要進(jìn)行測試(構(gòu)造函數(shù)和析構(gòu)函數(shù)除外)。
總體來說,單元測試是提高軟件質(zhì)量,降低開發(fā)成本的必經(jīng)之路。單元測試對程序員來講是提高自己編程水準(zhǔn)的方法。想要了解更多單元測試的信息,請繼續(xù)關(guān)注中培偉業(yè)。