成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

都100%代碼覆蓋了,還會有什么問題?

開發 開發工具
很多人看到這個標題時,都會想“你都100%代碼覆蓋了,怎么還會有問題呢?”

[[206360]]

引言

很多人看到這個標題時,都會想“你都100%代碼覆蓋了,怎么還會有問題呢?”

讓我們看一下代碼例子:

  1. public class TestCalculator { 
  2.  
  3.   public Double add(Double a, Double b) { 
  4.  
  5.     return a + b;} 
  6.  

再看看用junit寫出的測試代碼:

  1. @Test 
  2. public void testAdd() { 
  3.  
  4.   Double a = new Double(1); 
  5.         
  6.   Double b = new Double(2); 
  7.         
  8.   Double c = new Double(3); 
  9.         
  10.   assertEquals(c, testCalculator.add(a, b)); 
  11.  

當我們使用EclEmma或者Jacoco來進行覆蓋測試時,對于這個類,我們將得到100%測試覆蓋率。

使用EclEmma或者Jacoco來進行覆蓋測試

一切看起來都那么的***,真是這樣的嗎?

好吧,讓我們來來看看另一個測試,當其中一個變量為null時,返回值將會是什么?

  1. @Test 
  2. public void testAddNullPointerException() { 
  3.  
  4.   Double a = new Double(1); 
  5.  
  6.   Double b = null
  7.  
  8.   Double c = new Double(3); 
  9.  
  10.   assertEquals(c, testCalculator.add(a, b)); 
  11.  

好了,你會發現盡管覆蓋率為100%,但程序卻拋出了NullPointerException。

那么肯定有人會問,這樣的話單元測試覆蓋率的高低都不能作為衡量項目代碼質量的指標,那么我們要單元測試還有什么用?

首先,我想我們可能搞錯了測試覆蓋的定義。

我們先聽聽Martin Fowler對于測試覆蓋的定義:

Test coverage is a useful tool for finding untested parts of a codebase. Test coverage is of little use as a numeric statement of how good your tests are.

 Martin Fowler對于測試覆蓋的定義

(圖片來自:http://t.cn/R06jK5U)

他認為:把測試覆蓋作為質量目標沒有任何意義,我們應該把它作為一種發現未被測試覆蓋的代碼的手段。

所以100%的代碼覆蓋率還值得追求嗎?

當然,這應該是每個程序員畢生的追求之一,但是如果從項目角度考慮ROI(投入產出比),對于需要快速上線的短期項目,需要注重的是讓測試覆蓋核心功能代碼。如果你的項目是一個長期項目,那么高覆蓋率是非常有必要的,它意味著高可維護性,以及更少的bug。(前提是你的測試采用TDD/BDD方式編寫,我見過將測試代碼寫的一團糟的人,看著他的代碼,我寧愿重新寫一遍。)

那么對于一個項目來說,覆蓋率應該達到多少?

其實沒有適用于所有項目的數值,每個項目都應有自己的閾值,但共性是,測試必須覆蓋主要業務場景,代碼的邏輯分支也必須盡可能的覆蓋。

如何改進你的項目代碼覆蓋率?

首先我們要閱讀和理解項目代碼,找出其中需要測試并且與業務強相關的代碼,結合sonar等代碼質量管理平臺,從代碼編寫規范、復雜度、重復代碼等方面進行代碼重構,進一步提高項目的可維護性與可讀性。

這也意味著重構,重構的同時,你需要更多的測試來保證你重構代碼的正確性。

其次要對code coverage進行度量分析,那么我們應該怎么度量code coverage?

一般來說我們從以下四個維度來度量,如上圖所示:

  • 行覆蓋率(line coverage):度量被測代碼中每個可執行語句是否都被執行到,但不包括java import,空行,注釋等。
  • 函數覆蓋率(function coverage):度量被測代碼中每個定義的函數是否都被調用。
  • 分支覆蓋率(branch coverage):度量被測代碼中每一個判定的分支是否都被測試到。
  • 語句覆蓋率(statement coverage):度量被測代碼是否每個語句都被執行。

所以行覆蓋率的高低不能說明項目的好壞,我們要從多方面進行思考,一般我們遵循的標準應是:函數覆蓋率 > 分支覆蓋率 > 語句覆蓋率。

代碼覆蓋率最重要的意義在于:

  • 閱讀分析之前項目中未覆蓋部分的代碼,進而反推在前期QA以及相關測試人員在進行黑盒測試設計時是否考慮充分,沒有覆蓋到的代碼是否是測試設計的盲點,為什么沒有考慮到?是需求或者UX設計不夠清晰,還是測試設計的理解有誤。
  • 檢測出程序中的廢代碼,可以逆向反推代碼設計中不合理的地方,提醒設計/開發人員理清代碼邏輯關系,提升代碼質量。
  • 代碼覆蓋率高不能說明代碼質量高,但是反過來看,代碼覆蓋率低,代碼質量絕對不會高到哪里去,可以作為測試自我審視的重要工具之一。

結束語

單元測試的覆蓋率并不只是為了取悅客戶或者管理層的數據,它能夠實實在在反應項目中代碼的健康程度,幫助我們更好的改善了代碼的質量,增加了我們對所編寫代碼的信心。

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2020-11-02 13:25:45

Redis數據庫開源

2020-06-15 08:06:25

ES數據

2025-01-10 09:13:36

2023-05-12 07:35:43

ChatGPT代碼字符串

2022-02-18 10:46:28

FirefoxChrome瀏覽器

2019-04-26 13:01:16

ServiceMesh微服務架構

2022-04-04 07:51:32

Web框架

2021-07-16 06:56:50

邊緣計算分布式

2022-12-09 14:34:40

程序員工資離職

2023-05-08 11:57:24

索引數據庫IO

2022-04-06 12:32:28

云計算云計算支出

2021-02-08 08:04:52

JavaScript語言OOP

2021-03-23 18:32:46

JavaScript編程開發

2021-10-16 12:52:17

Builder模式生成器

2020-05-22 10:02:43

Python語言編程

2024-09-12 09:34:32

2024-12-27 15:28:01

CQRS架構方式

2024-08-27 09:05:45

2015-02-28 10:11:51

2012-07-30 09:49:44

云計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线观看免费av片 | 亚洲欧洲成人av每日更新 | 欧美日韩电影一区 | 日本成人福利 | 亚洲第一天堂无码专区 | 8x国产精品视频一区二区 | 国产性色视频 | 国产成人精品久久 | 欧美一区二区免费在线 | 九九久久99| 日本三级播放 | 国产一二三区在线 | 亚洲国产网站 | 婷婷激情综合 | 成人久久久| 91亚洲精品在线观看 | 国产精品一区二区在线 | 亚洲国产精品美女 | 日本午夜精品一区二区三区 | 成人av电影在线 | 黄色网址在线播放 | 精品久久香蕉国产线看观看亚洲 | 91视在线国内在线播放酒店 | 91高清在线 | 国产精品色一区二区三区 | 久久久久国产 | 久久久美女 | 国产在线观看免费 | 久久精品a | 欧美国产日韩一区二区三区 | 久草精品视频 | 天天综合国产 | 亚洲精品1| 久草福利| 精品一区二区视频 | 亚洲精品视 | 欧美日韩精品一区 | 日韩在线精品强乱中文字幕 | 日韩在线精品视频 | www九色| 一区二区三区免费 |