未名企鵝極客|軟體單元測試的基本原則

2020-12-25 騰訊網

計算機世界裡軟體產品通常是由模塊組合而成的,模塊又可以分成諸多子模塊,子模塊還可以繼續往下拆分,拆分到最終的子模塊是由不可再分的程序單元組成。

對於這些程序單元的測試,即稱為單元測試。本期未名企鵝極客欄目,研發工程師給大家分享的是一些單元測試的基本原則。

單元測試的粒度要根據實際情況判定,可能是類、方法等,在面向對象編程中,通常認為最小的單元就是方法。

在很多人看來,快速完成業務功能開發才是王道,如果開發工程師說需要額外的時間來寫單元測試,並因此延長項目工期,估計有些項目經理就按捺不住了。其實單元測試是一件有情懷、有技術素養、有長遠收益的工作,它是保證項目質量和效率的重要手段之一

單元測試的好處

(包括但不限於以下幾點):

1、提升軟體質量

優秀的單元測試可以保障開發質量。在研發過程中執行測試用例,運行失敗的的單元測試能幫助我們快速排查和定位問題,使問題被帶到線上之前完成修復。越早發現的缺陷,其修復成本越低。

2、促進代碼優化

在編寫單元測試的時候,會不斷重新審視自己的代碼,白盒的思考代碼邏輯,更好地對代碼進行設計,甚至想方設法的優化測試用例的執行效率。

3、提升研發效率

編寫單元測試表面上佔用了項目研發時間,但磨刀不誤砍柴工,在後續的聯調、集成、回歸測試階段,單元測試覆蓋率高的代碼通常缺陷少、問題易修復,有助於提升項目整體研發效率。

4、增加重構自信

代碼重構往往是牽一髮而動全身的,有時候只是簡單地修改一個欄位名稱,就會引起一系列的錯誤,但是在有單元測試保障的前提下,可以放心的進行重構。

單元測試需要遵循的基本原則

1、自動化

單元測試應該是全自動執行的。測試用例通常會被頻繁的觸發執行,執行過程必須完全自動化才有意義。如果單元測試需要人工介入檢查,那麼他一定是不及格的。單元測試中不允許使用System.out來進行人工驗證,而必須使用斷言來驗證。

2、獨立性

為了保證單元測試穩定可靠且便於維護,需要保證其獨立性。用例之間不允許互相調用,也不允許出現執行次序的先後依賴。

3、可重複性

單元測試時可以重複執行的,不能受到外界環境的影響。

4、測試顆粒度要足夠小

編寫單元測試時要保證測試粒度足夠小,這樣有助於精確定位問題,單元測試用例默認是方法級別的。單元測試不負責檢查跨類或者跨系統的交互邏輯,那是集成測試需要覆蓋的範圍。

5、測試應該快速

理論上, 任何代碼提交前都應該完整跑一遍所有單元測試,保持測試代碼執行快能夠縮短迭代開發周期。

6、BCDE原則

B:Border,邊界值測試,包括循環邊界、特殊取值、特殊時間點、數據順序等。

C:Correct,正確的輸入,並得到預期的結果。

D:Design,與設計文檔相結合,來編寫單元測試。

E:Error,單元測試的目標是證明程序有錯,而不是程序無錯。為了發現代碼中潛在的錯誤,我們需要在編寫測試用例時有一些強制錯誤信息輸入(如:非法數據、異常流程、非業務允許輸入等)來得到預期的錯誤結果。

7、使用覆蓋率工具

覆蓋率工具能回報你測試策略中的缺口。使用覆蓋率工具能更容易地找到測試不足的模塊、類、和函數。多數IDE都給出直觀的指示,用綠色標記測試覆蓋了的代碼行,而未覆蓋的代碼行則是紅色。這樣就能又快又容易地找到尚未檢測過的if或catch語句。

8、測試覆蓋率的模式有啟發性

查看被或未被已通過的測試執行的代碼,往往能發現失敗的測試為何失敗的線索。

9、立即修正失敗的測試

每個開發人員在提交前都應該保證新的測試用例執行成功, 當有代碼提交時, 現有測試用例也都能跑通。

10、100%測試覆蓋率不是目標

100%的覆蓋率並不能確保沒有缺陷——它只能保證你所有的代碼都執行了,不論程序的行為是否滿足要求。與其追求代碼覆蓋率,不如將重點關注在確保寫出有意義的測試。

總結

單元測試的好處不言而喻,同時我們也要摒棄諸如:單元測試是測試人員的工作,單元測試代碼不需要維護等常見誤解。

未名企鵝內部也存在這樣一種共識:對於開發工程師來講,編寫並維護單元測試不僅僅是為了保證代碼的正確性,更是一種基本素養的體現。

文 / haiyi

編輯 / TiK

關於未名企鵝

未名企鵝以「連接健康」為使命,致力於提供生命健康領域的大數據產品和解決方案,幫助客戶實現數據驅動的業務增長。

未名企鵝中的「未名」代表北大,寓意人文精神,生命健康領域正是體現人文關懷的產業;「企鵝」象徵科技,未名企鵝的創始團隊畢業於北大,技術力量來自騰訊,公司以未名企鵝命名是希望以人文情懷加上科技力量來推動生命科學行業數位化發展。

未名企鵝,數 · 智 · 未來

相關焦點

  • 迎十四五規劃,未名企鵝鄒曉亮以創業經歷與醫藥同路人共勉
    2012年初,覆蓋城鄉全體居民的基本醫療保障制度框架初步形成,參保人數達到13億人。國家基本藥物制度初步建立。覆蓋城鄉的基層醫療衛生服務體系基本建成,2200多所縣級醫院和3.3萬多個城鄉基層醫療衛生機構得到改造完善。中醫藥服務能力逐步增強,全科醫生制度建設開始啟動。公立醫院改革試點初見成效。
  • 未名企鵝創始人鄒曉亮寄語公司成立五周年:人生海海,劈浪前行
    醫藥行業大數據產品和解決方案提供商未名企鵝迎來了其五周歲生日。砥礪五載,未名企鵝始終堅持以「連接健康」為使命,致力於提供生命健康領域更具智慧和洞察的大數據產品和解決方案,幫助客戶實現數據驅動的業務增長。未名企鵝2015年成立於未名湖畔。
  • 聊聊軟體系統測試
    在汽車控制器開發流程中,開發和測試是同樣重要的,按照ISO26262標準,在開始任何設計之前都需要可測試性,並且大篇幅的介紹了測試要求。因工作關係,對軟體測試相對熟悉點,本文就聊聊軟體測試。1. Overview        需求工程是從更高層次的抽象層向更為詳細,更具體的低層次發展。而測試是相反的。
  • 軟體測試基本方法之集成測試和系統測試
    在軟體開發中,經常會遇到這樣的情況,單元測試時確認每個模塊都能單獨工作,但這些模塊集成在一起之後會出現有些模塊不能正常工作。
  • 軟體測試課程教與學(教學大綱)
    本課程與培養目標的關係是:軟體測試工作要求學生具備軟體測試基本理論、技術方法和項目測試實施及項目測試管理等職業能力,使學生能夠設計測試用例、使用自動化工具完成完整的項目測試和項目測試管理,使學生能基本承擔起軟體測試的工作任務,具備軟體測試崗位必備的職業能力,同時為學生獲取軟體測試工程師職業資格證書奠定基礎。
  • .NET 項目中的單元測試
    單元測試單元測試的定義按照維基百科上的說法,單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟體設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在面向對象編程中,最小單元就是方法,包括基類、抽象類、或者派生類(子類)中的方法。
  • 單元測試常用的方法
    總的來說,單元就是人為規定的最小的被測功能模塊。單元測試是在軟體開發過程中要進行的最低級別的測試活動,軟體的獨立單元將在與程序的其他部分相隔離的情況下進行測試。   在一種傳統的結構化程式語言中,比如C,要進行測試的單元一般是函數或子過程。在像C++這樣的面向對象的語言中, 要進行測試的基本單元是類。
  • 凡貓軟體測試——軟體測試理論
    介紹軟體測試相關理論,軟體測試的定義、目的,軟體測試的原則,軟體質量模型,軟體測試的基本流程等。
  • 軟體測試學習教程:單元測試之UnitTest測試框架
    單元測試的概念單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,要根據實際情況去判定其具體含義。一個單元可能是功能模塊、類、方法(函數)等。單元測試工具不同的程式語言都有比較成熟的單元測試框架,語法規則有些差別,其核心思想都是相通的。
  • 【ITA】談談汽車ECU軟體測試
    無論你是從事汽車軟體工程的哪一個職位,都應該對軟體測試的基本概念和流程有一定的了解。所以我想感興趣的同學應該會不少吧。我們就以ISO26262軟體部分描述的V型開發流程為線索,舉一個實際例子來說明。我們把這個叫做「測試集」。以測試集中的輸入信號值為輸入,運行單元代碼。如果輸出信號的值和測試集中的正確輸出信號值相同,則功能測試通過。編寫測試集的一個基本原則是要把所有的代碼都覆蓋到,並且儘量測試所有判斷邏輯。上面所示的例子非常簡單,只有一個輸入變量 SafeVehSpd 和一個輸出變量 Acc_ActSt。
  • 十年測試老兵教你構建軟體測試知識體系和技能樹(附思維導圖)
    我是照著Docker的官方文檔,以容器化一個Python Web應用的實踐掌握了Docker的基本使用,大家可以參考我的另一篇博文《通過容器化Python web應用了解Docker容器的核心功能》來親手實踐一下。關於Kubernetes,我通過學習極客時間的專欄《深入剖析Kubernetes》,成功地將Kubernetes應用到了我們的持續集成和性能測試環境搭建中。
  • 聊聊單元測試
    以後如果誰說單元測試不重要的時候,你不妨問他「你敢坐沒有檢查過零件的飛機麼?」另外,單元測試除了對軟體質量有提升外,對軟體的開發效率提升也很明顯。在《實用軟體度量》一書中提到了微軟內部的統計數據,單元測試的成本效率是系統測試的3倍。在《單元測試的藝術》中也提到過一個案例,找了開發能力相近的兩個團隊,同時開發相近的需求。
  • 軟體測試江湖的神兵利器
    單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裡單元指一個類,圖形化的軟體中可以指一個窗口或一個菜單等。總的來說,單元就是人為規定的最小的被測功能模塊。單元測試是在軟體開發過程中要進行的最低級別的測試活動,軟體的獨立單元將在與程序的其他部分相隔離的情況下進行測試。
  • 如何寫好單元測試?
    本文分享三個單元測試神器及相關經驗總結。文末福利:《Linux運維學習路線》技術公開課。Q1:好代碼應具備可讀性,可測試性,可擴展性等等,那麼如何寫出好代碼?單元測試(unit testing),指由開發人員對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裡單元指一個類,圖形化的軟體中可以指一個窗口或一個菜單等。總的來說,單元就是人為規定的最小的被測功能模塊。
  • 軟體測試溝通基礎話術(一)
    比如python的變量和基本數據類型,輸入輸出語句,集合和元組操作,以及循環和條件判斷操作,還有python中的字典和set集合操作,以及python中面向對象編程,異常,單元測試這些內容,比較熟悉。自動化測試軟體:selenium和appium這兩個軟體我也使用的比較熟悉,當然也算不上精通,基本的操作,寫一些自動化測試腳本是沒有問題的。
  • 系統測試:單元測試相關知識筆記
    一、單元測試概念單元測試也成為模塊測試,在模塊編寫完成且五編譯錯誤後就可以進行。單元測試側重模塊中的內部處理邏輯和數據結構。如果採用機器測試,一般用白盒測試法。二、單元測試檢查模塊特徵1、模塊接口模塊接口保證了測試模塊數據流可以正確地流入、流出。主要檢查一下要點:測試模塊輸入參數和形式參數在個數、屬性、單位是否一致。
  • 軟體測試基礎理論知識,你確定不來圍觀?
    軟體測試的IEEE定義:使用人工或自動的手段來運行或測量軟體系統的過程,目的是檢驗軟體系統是否滿足規定的需求,並找出與預期結果之間的差異。軟體測試的發展趨勢:  ① 測試工作將進一步前移。軟體測試不僅僅是單元測試、集成測試、系統測試和驗收測試,還對需求的精確性和完整性的測試技術、對系統設計的測試技術將成為新的研究熱點。
  • SpringBoot單元測試保姆級教程,文末介紹Postman的基本使用
    文章目錄三、Spring Boot引入的MockMvc的概念八、Postman與Spring Boot 單元測試的區別一、 單元測試的概念概念:1.單元測試(unit testing),是指對軟體中的最小可測試單元進行檢查和驗證。
  • 軟體測試基礎 (三): 系統測試
    大家好,我是BugBear,一個專注於分享軟體測試乾貨的測試開發。我們已經學習了 單元測試 和 集成測試,今天我們來學習系統測試。一、系統測試定義對象不僅僅包括需測試的軟體,還要包含軟體所依賴的硬體、外設甚至包括某些數據、某些支持軟體及其接口等。比較常見的、典型的系統測試包括恢復測試、安全測試、壓力測試。 二、系統測試與集成測試
  • 極客時間最新官方下載_極客時間app官方下載_18183軟體下載
    極客時間官方下載玩法豐富,劇情也十分有趣,是一款值得玩的好軟體 極客時間,提供前沿的IT技術、產品、運營資訊及知識服務,極客邦團隊精心打造,致力於服務千萬網際網路從業者及興趣人群。晨起、睡前、通勤、運動,每天20分鐘,碎片時間提升認知,驅動思維與技能持續快速迭代。