黃永鋒,孫自誠,羅保國
1(東華大學 計算機科學與技術學院,上海 201620)
2(中國科學院 軟件研究所,北京,100190)
隨著計算機技術的飛速發展,筆記本電腦的功能越來越強大,結構也越來越復雜,各功能出現的錯誤種類也隨之增加,這無疑為其軟硬件的測試帶來諸多不便[1].傳統的手工測試已逐漸不能滿足日益增多的測試任務需求,因此自動化任務分配就成了筆記本軟硬件測試的必然方向,是筆記本高質量、高可靠性的重要保障[2,3].在以往的手工測試過程中,測試員需要自主區分筆記本的工作狀態對每個檢查點進行測試,這無疑是對測試員體力和精力上的雙重消耗[4].
近年來,軟件自動化測試技術的出現,為傳統的筆記本測試提供了很大幫助,節省了更多的人力和財力,同時也提高了測試的質量,縮短了研發和上市的周期[5,6].但完整的自動化測試工具除了應該包含自動化測試功能外,還應具有適應筆記本在多種狀態下測試的任務自動分配功能.任務自動分配是自動化測試中非常重要的一環,可以進一步減少資源開銷,使得自動化測試更加有意義[7].
因此,本文以筆記本測試的實際需求為切入點,設計了適應筆記本不同狀態和隨機性測試的任務模型并實現了自動分配的算法.使得每次測試任務與每組測試條件間形成一種映射.這種任務分配方式既能滿足測試過程中各種條件的約束,真實的覆蓋所有測試情況[8],又能使測試員從復雜的任務分配中解放出來,并且能更好的避免任務分配重復或不足的現象,提高測試效率[9].
筆記本測試的目的是通過較真實地模擬用戶的使用場景,以發現筆記本電腦中比較隱藏的問題和其發生的概率.通過分析測試要求,首先提出了用于構建模型的基礎概念和條件,然后再根據各種條件的疊加關系計算實際的任務數據,最后再以表格的形式較直觀的展示模型中數據的分布情況[10].
由于測試任務的復雜性,了解相關概念是進行模型構建的前提.本文基于實際的測試場景,提出了以下概念和條件:
(1)檢查點:筆記本電腦每個測試周期中的測試點,如相機、麥克風、觸摸板、觸摸屏等.由于檢查點具有擴展性,因此本文將以十個檢查點為例構建任務模型.
(2)測試周期:每個測試周期由多個僅測試一次的檢查點構成.測試周期是測試任務的重要組成部分,也是筆記本完成一次測試的基本單位.
(3)檢查點測試百分比:每個測試周期中,某個檢查點被測試的概率.
(4)機器類型:不同機器型號的筆記本,測試的檢查點不同.機器類型為同一類型的機器所測試檢查點的集合.
(5)測試計劃:現階段筆記本一般都有多種使用模式,如正常筆記本模式和平板電腦模式等,每種模式的測試可作為一個測試計劃.本文將以正常筆記本模式為例構建任務模型.
(6)測試狀態:測試狀態是指在執行每個測試周期前筆記本的狀態,常見的有睡眠、休眠、重啟等.一種測試計劃是由多種測試狀態組成.
(7)狀態屬性:狀態屬性描述的是筆記本以哪種方式進入測試狀態,例如筆記本可以通過電源按鈕、開始菜單和關閉蓋子等方式進行睡眠狀態.
(8)電量區間:測試時該筆記本所處的電量區間.電量區間可根據不同的測試需求進行動態調節,本文將電量區間分為接通電源和斷開電源下1%-50%,51%-100%這4 種情況.
(9)測試任務:一次測試任務由相應電量區間下的測試狀態,狀態屬性和測試周期3 部分組成.每部分的具體參數值可通過算法計算得出.
在筆記本測試過程中,除了包含以上9 種概念外,任務分配還需要滿足一定的條件,即根據測試對象制定相應的策略[11],具體如下:
(1)在同一電量區間下,測試狀態共有集中測試,隨機測試和輪換測試3 種測試策略.集中測試是指連續多個測試周期均在一種測試狀態下測試,直至此種狀態規定的次數測試完畢才進入下一種狀態測試;隨機測試是指每個測試周期隨機選擇一種測試狀態;輪換測試是指每種測試狀態根據測試周期依次選擇.
(2)在一種測試狀態下進行測試時,狀態屬性共有3 種測試策略,即集中測試,隨機測試和輪換測試,形式與測試狀態的選擇類似.
通過上述的概念可知,測試周期雖然為一次測試的基本單位,但由于檢查點測試百分比和機器類型這兩個因素的存在,每個周期內實際測試的檢查點也具有差異性.在本節中,暫且拋開測試周期之間的異同之處,具體分析測試狀態、測試屬性和電量區間這3 個因素在測試周期上的交互關系,并將滿足相同因素的所有測試周期的集合稱為一個“測試項”.文獻[12]采用“成對測試算法”來降低測試條件組合數,但筆記本測試是多條件組合且多次重復的測試,因此該方法并不適用,仍需考慮完整的條件覆蓋.
為了方便描述,不妨將測試狀態的個數用Ns表示,每種測試狀態設為Si;同理測試屬性的個數為Na,每種測試屬性為Aj;四種電量區間為B1-B4,每個電量區間對應的電量數值大小分別為Nb1-Nb4.再將一個測試計劃的總測試周期數設為T,滿足這3 種條件下的測試項包含的周期數設為Cijk,則Cijk與Si、Aj、Bk和T的關系為:

其中,1 ≤i≤Ns,1 ≤j≤Na,1 ≤k≤4且i,j,k為整數

若因特殊的測試需求,測試狀態、測試屬性和測試電量區間不再根據數值平均分配,而是根據測試方提供的相應比率進行分配,那么只需改變f(Si,Aj,Bk)的函數式即可.不妨將不同測試狀態下測試周期數所占比率的命名為Psi,不同測試屬性所占的比率為Paj,4 種電量區間所占的比率為Pb1-Pb4.則f(Si,Aj,Bk)的函數式為:

其中,1 ≤i≤Ns,1 ≤j≤Na,1 ≤k≤4且i,j,k為整數
通過以上的計算方法,可以實現在滿足不同的測試條件下將一個測試計劃的總測試周期數分為Ns×Na×4 種測試項,每個測試項的測試周期數Cijk與測試條件Si、Aj、Bk相關.
為了方便數據的展示,采用二維表格形式顯示模型數據.可將十個檢查點設置成為二維表格的列,測試項為表格的行.并且將測試狀態與狀態屬性兩個條件進行合并,然后再與電量區間條件進行組合.通過以上分析,將測試項和檢查點測試數表示成一個10×(Ns×4)的二維測試數據表格(10 表示為十個檢查點),如表1所示(注意:數據可根據具體測試需求進行更改;“觸控筆”檢查點表示只有部分筆記本支持此項測試,在分配任務時,需要根據包含此檢查點的機器類型,將此檢測點的測試次數100% 的分配給特定的筆記本測試).

表1 正常筆記本測試模式測試數據表
在根據測試特點建立了測試任務模型之后,則需要生成待測筆記本可以執行的測試任務.依照測試條件,電量區間由測試機決定,不可改變,因此不作計算;測試狀態和狀態屬性根據選擇的測試策略動態調節;測試周期將根據機器類型和檢查點測試百分比計算生成.經過上述過程,生成一份完整的測試任務,流程如圖1.
測試狀態有集中測試,隨機測試和輪換測試3 種測試策略,具體選擇哪一種方式可根據測試需求而定.可以采用一個十進制數來表示每次任務選擇的測試狀態.可繼續使用Ns,Na,Psi等變量的含義,另外用S表示該十進制(S可取的值為1-Ns),用SBik表示每種測試狀態下每個電量區間內已測的周期數(表1中SBik的個數為數據行數,即3×4,共12 種).則3 種策略下S的計算方式為:
(1)集中測試:測完一個測試狀態的所以周期數再切換到下一個測試狀態.

(2)隨機測試:隨機測試策略下狀態的選擇是根據Psi的值來選擇的.

其中,S等于滿足的最小i值.
(3)輪換測試:根據當前已測的周期數對測試狀態個數取模得到結果.

其中,1 ≤i≤Ns,1 ≤k≤4.

圖1 生成測試任務流程圖
測試屬性也有集中測試,隨機測試和輪換測試3 種策略.可用一個十進制變量A表示每次任務所選擇的狀態屬性,ABjk表示每種狀態屬性下每個電量區間內已測的周期數.3 種策略下A的計算方式如下:
(1)集中測試:

(2)隨機測試:

其中,A等于滿足的最小j值.
(3)輪換測試:

其中,1 ≤j≤Na,1 ≤k≤4.
機器類型是依據待測試的筆記本電腦的型號和功能,選擇所需測試的檢查點集合,一種集合即為一種機器類型.該集合可用十位二進制數來描述,每個檢測點對應一位,若對應二進制位的檢查點屬于此集合,則該位為1,反之為0.通過上述描述不難發現,機器類型與待測機之間為一種一對多的關系.在所有測試開始之前,可以根據待測筆記本電腦的特點,設置多個機器類型,然后在任務分配時,根據待測筆記本特征選擇一種機器類型進行計算.
生成測試周期首先根據當前測試機所屬機器類型的二進制數,選擇測試的檢查點.若某個檢查點對應位置為0,則直接不測;若為1,則進一步考慮此檢查點的測試概率.可將當前分配任務的測試機所選擇的機器類型中每個檢查點的值用MTm表示,相應地,所生成的測試周期中每個檢測點的值用CPm表示,每個檢測點測試百分比用Pcpm表示,則CPm的計算方法為:

其中,1 ≤m≤10.
通過上述算法,可以發現無論是測試狀態和狀態屬性在隨機測試策略下的計算,還是測試周期中每個檢查點的計算,都用到了隨機數Random(1)作為參數.由于隨機概率具有不確定性的特點,很難保證所有任務都能嚴格按照相應的百分比分布,因此,還需考慮設置一個閾值,并且在每次生成任務時進行閾值判斷.由于測試狀態和狀態屬性在計算測試任務時都會選擇其中的一種,且當某一種測試周期數測試完畢后,之后的測試任務就只會在剩余的選項中選擇,故不會存在漏測的情況.對于檢查點的計算,當一個檢查點的測試百分比小于100%時,每次任務中此檢查點是否測試完全依照隨機概率和測試百分比計算得出,因此會出現漏測的情況.可為每個測試項設置一個閾值TH=5,在計算該測試項內某個檢查點是否測試時,若滿足條件:

其中,Remainder(Cijk)為測試項剩余周期數,Remainder(CPm)為檢查點剩余周期數
則在接下來的任務分配中,該檢查點的測試百分比會默認升至為100%,即每次任務都會測試.可重新計算CPm的值:

通過上述算法,可以在每一次任務分配時,依據選擇的測試策略計算出這次任務的測試狀態和狀態屬性,再根據機器類型和檢查點測試百分比生成每個檢測點的測試情況并組合成了一個測試周期.為了表示方便,測試周期也用十位十進制數替代二進制數來表示,每位數只有0 或1 兩種數值.則每次測試任務的組成結構為:

算法偽代碼如下所示:

GetTask(battery){ //battery 為電池電量區間s,a=getPara(battery);//獲取測試狀態和狀態屬性參數//生成測試狀態state 和狀態屬性attr switch(strategy){//選擇的測試策略case 1://集中測試state=s;attr=a;case 2://隨機測試if(sum_p(s-1)<random(1)<=sum_p(s))state=s;

if(sum_p(a-1)<random(1)<=sum_p(a))attr=a;case 3://輪換測試state=(s++)%num(s);atrr=(a++)%num(a);}while(c<num(c)){//生成測試周期checkPoint[]checkPoint[c] = MT[c]*(random(1)<p(c)?1:0);if(getThreshold(c))//閾值判斷checkPoint[c]= MT[c];}task=state+attr+checkPoint[];//生成測試任務}
目前,采用該模型和算法的系統已應用于上海企順信息系統有限公司的實際項目中,該企業為聯想、戴爾、英特爾等筆記本生產商提供測試服務.以某型號筆記本的測試為例,在測試中共有1 臺筆記本用作任務分配的服務器,18 臺用作領取測試任務的測試機.測試狀態為集中測試策略,狀態屬性為輪換測試策略,測試檢查點個數為15 個.所采集的睡眠測試狀態下測試任務總計數據如表2所示(該次測試有五種測試狀態,大量數據無法全部展示,且數據格式也具有重復性),其中某1 臺測試機的測試任務如表3所示(該臺測試機選擇的機器類型中未包含檢查點"觸控筆").從表中可以看出,測試任務數據分布能很好的滿足實際測試的條件和需求.除此之外,該算法可以實現向多臺測試機分配任務的同時,保證一個測試計劃中周期數的一致性約束.

表2 測試任務總計
任務自動分配的優點是使測試員從復雜的任務分配過程中解脫出來.為了綜合評估該算法的實用性,將實現的任務自動分配功能與傳統的人工分配做比較,從一次任務分配時間、人力資源、用戶體驗、符合測試要求程度四個方面對任務分配進行評估.表4為任務分配的比較.
通過上述比較可見,自動任務分配效率遠高于人工分配.該算法的實現充分利用了計算機運算速度快,處理能力強的特點,有效的降低了任務分配時間和人力資源開銷.除此之外,該算法相較于人工而言更能滿足測試要求,可以較真實的模擬測試的隨機性和交替性.總而言之,自動化測試任務分配模型和算法的實現 在自動化測試方面具有更高的優越性和實用性.

表3 某1 臺測試機的測試任務

表4 任務分配的比較
筆記本測試自動化任務分配是筆記本自動化測試的一個重要組成部分,實現此部分功能也是邁向全自動化測試的一個重要階段.本文從筆記本電腦自動化測試出發,設計了用于測試任務自動化分配的模型和算法,從而進一步提升自動化測試的百分比.從實際測試的效果可以看出,該算法既能滿足復雜條件下的測試需求,也能進一步解放測試過程的勞動力,提高測試效率.當然,本文設計的算法剛處于初步實用階段,在多客戶端并發任務分配效率上還有很大的提升空間,將在以后的研究中進一步改進和完善.