軟件測試工作量估算之功能點估算法
從上個世紀70年代開始,一些軟件企業就開始引入“功能點分析算法”,來評估軟件功能的規模,然后便可以對軟件開發的成本和工期,進行精確的度量,也可以對開發團隊的生產率進行考核評估。半個世紀以來,很多種不同的功能點算法模型被建立起來,Mk II功能點算法是其中一種比較常用的模型。
隨著淘寶網站的高速發展,淘寶開發團隊規模也不斷增大,于是必然要面對管理問題。人數的增多必然帶來管理層級的增多,這樣很容易出現管理結構的臃腫,管理成本增高。如果我們引入一種簡單而且科學的工作度量模型,讓每個人每個團隊的工作質量和效率用數字來說話,便可以促進管理結構的扁平,簡化管理過程,每個管理者可以管理更多的人,并且對下屬的工作了如指掌。
功能點算法就是為了解決如何度量工作效率的問題,而工作質量主要是依靠分析各種Bug數據,我們在別的文章里討論。
首先我們講一下MVC模型,這是目前WEB開發的一種非常流行的軟件架構模式。它把WEB應用程序定義為3個部分,每個部分負責完成特定的任務:
Model 模型
View 視圖
Controller 控制器
Model主要與數據庫交互,把數據表轉換成對象,并且實現基本的數據讀寫邏輯,比如在淘寶網,商品就是一個Model。View負責實現界面的設計,我們瀏覽網頁看到的WEB界面控件,比如按鈕、文本框、GRID都是在View中定義的,設計View主要是用Html和JS。用戶在View層進行的各種操作(比如點擊按鈕),就會啟動Controller里的函數,主要的業務邏輯代碼,都寫在Controller里了,其實也就是對各種Model進行增刪改查,比如購買一個商品。
關于MVC的更多詳細說明請參考維基百科。
接下來我們介紹MkII功能點算法,淘寶測試選擇MkII的主要原因是,它的算法和MVC模式非常的吻合,可以說是黃金搭檔。
MkII功能點算法是這樣:先要給各個功能模塊劃分邏輯事務,然后針對每個邏輯事務,分析輸入DET(Data Element Type)和輸出DET的數量,以及關聯的實體類型數量,再根據一個算法公式,計算出功能點指數:
功能點=輸入DET×0.58+實體類型×1.66+輸出DET×0.26
邏輯事務指用戶在WEB應用程序中的原子操作。很多開發團隊都會設計UseCase,一般來說一個UC對應一個邏輯事務。注意:邏輯事務一定是記錄用戶行為的,而不是程序內部的處理邏輯。不過在實際的分析中,我們發現邏輯事務的個數,往往要大于UC的個數,這是正常的,主要因為很多UC包含的信息很多。
我們用淘寶的“購買商品”來舉例說明怎么劃分邏輯事務,先來看購買商品的頁面:

在這個頁面中,左邊一塊是顯示商品的簡要信息,這是一個邏輯事務:“查看商品信息”,右邊最上面一個收貨地址的radio button,也是一個:“展示我所有的收貨地址”,右邊下面一組文本輸入框加一個按鈕,是一個:“為當前商品創建一個訂單”。
在MVC中,邏輯事務對應Controller,每個邏輯事務都可以在Controller里面找到一個public函數。
再講一下輸入DET和輸出DET。比如剛才的“為當前商品創建一個訂單”這個事務,頁面上輸入信息的控件,都是輸入DET,比如文本框、按鈕,都是輸入DET。這個事務大約有10個輸入DET:“收貨地址”、“購買數量”、“運送方式”等等。輸出DET指應用程序給用戶提供的所有的提示信息,以文字提示的方式知會用戶。比如“購買成功”、“您沒有綁定支付寶,不能購買”、“商品庫存不足,無法購買”、“購買數量必須輸入整數”等等。這個事務的輸出DET數量大約是20個。
在MVC中,輸入DET和輸出DET對應View。每個輸入DET和輸出DET都能在View中找到對應控件。
最后講引用實體,在創建訂單事務里,引用的實體有很多。訂單成功后要扣減商品庫存,因此商品算1個;訂單本身是1個;訂單需要同步生成支付寶交易,支付寶算1個;還有物流記錄算1個,等等,大約是5個實體以上。
在MVC中,引用實體對應Model。
到此為止這個邏輯事務的數據收集完整,代入公式計算得出結果:
10×0.58+5×1.66+20×0.26=19.3
當然這只是一個DEMO,數字都是估算的,實際情況肯定比這個要復雜,算出的功能點指數就會多一些。需要注意的是,使用MkII算法計算出的功能點指數,只是一個數值,代表應用程序的功能規模,和我們平時聽到開發說的“我修改了一個功能點”,概念上是不同的。所以我們用“功能點指數”這個概念,不過為了溝通起來方便,還是簡化成“功能點”了。
MkII功能點算法是非常適合于淘寶這樣的互聯網公司的。不過由于WEB應用程序的交互日趨復雜,JS被大量使用,因此在實踐中,如何劃分邏輯事務,如何統計輸入輸出,還需要進一步的研究。
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/