劉 輝,楊永凱,劉中一
(1.民航旅客服務(wù)智能化應(yīng)用技術(shù)重點(diǎn)實(shí)驗(yàn)室,北京 101318;2.中國民航信息網(wǎng)絡(luò)股份有限公司,北京 101318)
近年來,隨著業(yè)務(wù)復(fù)雜度的不斷提升,高效、可靠地保障企業(yè)級(jí)軟件質(zhì)量,杜絕各種運(yùn)營事故和安全風(fēng)險(xiǎn),是所有企業(yè)面臨的嚴(yán)峻挑戰(zhàn)。眾所周知,軟件質(zhì)量會(huì)影響項(xiàng)目的進(jìn)度、成本和范圍,最終影響客戶對企業(yè)的信賴。因此,企業(yè)對軟件質(zhì)量的要求日益增高。為了保證軟件質(zhì)量,在開發(fā)過程中引入了多種軟件測試技術(shù)[1-2]。目前國內(nèi)公司主要是以功能測試為主,功能測試的技術(shù)手段又以手工測試為主,而自動(dòng)化測試是在手工測試之后進(jìn)行的,主要用于回歸測試階段。自動(dòng)化測試是軟件測試活動(dòng)中一個(gè)重要的分支和組成部分,即利用工具或腳本達(dá)到測試目的,沒有人工或者極少人工參與的軟件測試活動(dòng)稱為自動(dòng)化測試。自動(dòng)化測試可以方便地進(jìn)行回歸測試,尤其是在敏捷開發(fā)過程中,版本快速迭代,自動(dòng)化測試更具優(yōu)勢[3-4];自動(dòng)化測試可以提升效率,減少重復(fù)工作,節(jié)省人力成本,讓測試人員可以做更多有意義事情,比如探索性測試[5]等;自動(dòng)化測試可以保證每次測試的完整性和一致性,發(fā)現(xiàn)更多隱藏問題。
軟件系統(tǒng)中的多種功能維度[6]會(huì)在生產(chǎn)業(yè)務(wù)的推動(dòng)下,演變出各種功能點(diǎn)的組合。自動(dòng)化測試需要完備的功能測試用例庫[7-8],業(yè)界已經(jīng)有大量人員研究測試用例生成方法[9-11]。
本文第2部分首先分析了手工構(gòu)造測試用例的基本方法;然后提出了精簡與自動(dòng)生成測試用例方法,主要思想是根據(jù)業(yè)務(wù)場景分類業(yè)務(wù)數(shù)據(jù),構(gòu)造功能點(diǎn)組合矩陣,歸并、精簡業(yè)務(wù)場景之間的功能點(diǎn)組合矩陣,再執(zhí)行生產(chǎn)請求,匹配功能點(diǎn)組合矩陣,自動(dòng)生成測試用例;最后舉例說明精簡與自動(dòng)生成測試用例方法。第3部分介紹了精簡與自動(dòng)生成測試用例方法的實(shí)際應(yīng)用效果。文章最后對提出的精簡與自動(dòng)生成測試用例方法進(jìn)行了總結(jié)性的討論。
測試用例包含測試數(shù)據(jù)、測試請求、期望結(jié)果。構(gòu)造測試用例的基本方法如圖1所示。
圖1 手工構(gòu)造測試用例流程
(1)在完成功能需求分析后,測試人員根據(jù)功能需求設(shè)計(jì)測試用例,其中主要是設(shè)計(jì)測試數(shù)據(jù)、測試請求以及期望結(jié)果。
(2)測試人員根據(jù)測試用例的設(shè)計(jì)文檔,手工構(gòu)造測試數(shù)據(jù),依據(jù)測試數(shù)據(jù)構(gòu)造相應(yīng)的測試請求和期望結(jié)果。
(3)在正式測試前,需要利用現(xiàn)有的軟件調(diào)試測試用例,如果返回結(jié)果與期望結(jié)果一致,代表測試用例正確,可以納入到測試用例庫中;如果返回結(jié)果與期望結(jié)果不一致,需要分析測試用例中的測試數(shù)據(jù)、測試請求和期望結(jié)果,判斷哪個(gè)部分錯(cuò)誤,并修正相應(yīng)的內(nèi)容。對修正后的測試用例再次執(zhí)行,直到測試用例正確為止。
上述測試用例的構(gòu)造過程全部由人工完成,需要產(chǎn)品、開發(fā)、測試互相配合,耗費(fèi)人力和時(shí)間成本巨大,而且覆蓋功能點(diǎn)范圍有限。隨著業(yè)務(wù)的飛速發(fā)展,軟件中的多種功能維度會(huì)在實(shí)際業(yè)務(wù)的推動(dòng)下,演變出各種功能的組合,由于開發(fā)和測試環(huán)節(jié),對業(yè)務(wù)的敏感度較低,很難快速響應(yīng)業(yè)務(wù)變化,識(shí)別并構(gòu)造出符合實(shí)際業(yè)務(wù)的測試用例。
針對上述軟件測試過程中手工構(gòu)造測試用例的問題,本文提出了一種測試用例精簡與自動(dòng)生成方法。將業(yè)務(wù)數(shù)據(jù)按照業(yè)務(wù)場景分類,構(gòu)造功能點(diǎn)組合矩陣,歸并、精簡業(yè)務(wù)場景之間的功能點(diǎn)組合矩陣,減少冗余的測試用例,再執(zhí)行生產(chǎn)請求,匹配功能點(diǎn)組合矩陣,自動(dòng)生成測試用例。從而達(dá)到聚焦核心功能點(diǎn)、提升軟件的代碼測試覆蓋率,實(shí)現(xiàn)提升軟件質(zhì)量和安全、降低人工成本、提升團(tuán)隊(duì)交付能力的目的。
2.2.1 功能點(diǎn)組合矩陣構(gòu)造
在真實(shí)的生產(chǎn)環(huán)境中,用戶通常會(huì)預(yù)定義一系列的業(yè)務(wù)場景,業(yè)務(wù)場景通過功能點(diǎn)組合構(gòu)建而成,不同的業(yè)務(wù)場景包含不同的功能點(diǎn)組合。
定義1:功能點(diǎn)組合矩陣。假設(shè)某一業(yè)務(wù)場景包含n個(gè)功能點(diǎn)F={f1、f2、...、fn},任一功能點(diǎn)fi的取值集合記為C(fi),功能點(diǎn)組合矩陣是所有功能點(diǎn)取值集合的笛卡爾積,記為A。
功能點(diǎn)組合矩陣的每一行是n元組n-T=(c1,c2,...,cn),其中每個(gè)元素即為對應(yīng)功能點(diǎn)的一種取值。功能點(diǎn)組合矩陣A包含n-T的數(shù)量記為|A|。
定義2:標(biāo)簽。一個(gè)軟件會(huì)包括多種業(yè)務(wù)場景,不同的業(yè)務(wù)場景相互獨(dú)立,涉及不同的功能維度,即不同的功能點(diǎn)組合,因此不同的業(yè)務(wù)場景對應(yīng)不同的功能點(diǎn)組合矩陣。在每種業(yè)務(wù)場景下,用戶發(fā)布一批業(yè)務(wù)數(shù)據(jù),用以描述該業(yè)務(wù)場景的各種適用條件,并通過一個(gè)或多個(gè)屬性標(biāo)識(shí)出業(yè)務(wù)數(shù)據(jù)所屬的業(yè)務(wù)場景,這些屬性稱為標(biāo)簽D。
本文通過標(biāo)簽D將業(yè)務(wù)數(shù)據(jù)劃分在不同的業(yè)務(wù)場景下,根據(jù)業(yè)務(wù)場景涉及到的功能點(diǎn)F,提取出業(yè)務(wù)場景的元組T,分析業(yè)務(wù)場景下各功能點(diǎn)的取值集合C,構(gòu)造功能點(diǎn)組合矩陣A。
2.2.2 測試用例精簡
定義3:測試子集,測試超集。假設(shè)存在2個(gè)業(yè)務(wù)場景的功能點(diǎn)組合矩陣A1和A2,其功能點(diǎn)分別為F1和F2,若
則,A1是A2的測試子集,A2是A1的測試超集,記為A2→A1。
定理1:2個(gè)業(yè)務(wù)場景的功能點(diǎn)組合矩陣A1和A2,若A1是A2的測試子集,則|A1| ≤|A2|。
證明:2個(gè)業(yè)務(wù)場景的功能點(diǎn)組合矩陣A1和A2,其功能點(diǎn)分別為F1和F2,A2→A1。
根據(jù)定義3,F(xiàn)1?F2,|F1|≤|F2|,假設(shè)n1=|F1|,n2=|F2|,n1≤n2;
又根據(jù)定義3,?f∈F1∩F2,C1(f)?C2(f),|C1(f)|≤|C2(f)|;
證畢。
定理2:測試超集測試通過,其測試子集必然測試通過。
證明:2個(gè)業(yè)務(wù)場景的功能點(diǎn)組合矩陣A1和A2,其功能點(diǎn)分別為F1和F2,A2→A1。
測試超集測試通過,則?f∈F2,功能點(diǎn)f測試通過。
假設(shè)測試子集測試不通過,則?f∈F1,功能點(diǎn)f測試不通過。根據(jù)定義3,f∈F2,功能點(diǎn)f測試不通過,與前提條件不一致。因此,假設(shè)不成立,測試子集測試必然通過。
證畢。
本文所提測試用例精簡方法,主要采用降維和歸并2種策略,具體描述如下:
(1)降維。假設(shè)全業(yè)務(wù)功能點(diǎn)組合矩陣H包含m個(gè)功能點(diǎn)E,將業(yè)務(wù)數(shù)據(jù)按照業(yè)務(wù)場景劃分后,某業(yè)務(wù)場景的功能點(diǎn)組合矩陣A包含n個(gè)功能點(diǎn)F。根據(jù)定義3,業(yè)務(wù)場景的功能點(diǎn)組合矩陣是全業(yè)務(wù)功能點(diǎn)組合矩陣的測試子集,H→A,F(xiàn)?E,n≤m,根據(jù)定理1,|A|≤|H|。
在軟件中,通常采用關(guān)系型數(shù)據(jù)庫保存業(yè)務(wù)數(shù)據(jù),所有業(yè)務(wù)場景的業(yè)務(wù)數(shù)據(jù)融合在相同的表空間中,共享相同的數(shù)據(jù)表,因此數(shù)據(jù)表擁有所有業(yè)務(wù)場景涉及到的功能點(diǎn)字段。盡管在技術(shù)上按照業(yè)務(wù)類別將功能點(diǎn)字段劃分在不同的表中,可是相對于某一確定的業(yè)務(wù)場景,仍然會(huì)有多余的功能點(diǎn)字段。通過劃分業(yè)務(wù)場景,可以避免全功能點(diǎn)組合,在不失測試完備性的前提下,有效地對業(yè)務(wù)數(shù)據(jù)降維[12],減少每種業(yè)務(wù)場景的功能點(diǎn)組合矩陣元組數(shù)量,從而精簡測試用例[13-15]。
(2)歸并。假設(shè)存在2個(gè)業(yè)務(wù)場景的功能點(diǎn)組合矩陣A1和A2,其功能點(diǎn)分別為F1和F2,A1是A2的測試子集A2→A1。根據(jù)定義3,F(xiàn)1?F2,根據(jù)定理2,A2測試通過,A1必然測試通過。
軟件中不同的業(yè)務(wù)場景之間存在著相似性,甚至內(nèi)容相同,只是定義的標(biāo)簽不同。如果某個(gè)業(yè)務(wù)場景涉及到的功能點(diǎn)字段包含另一個(gè)業(yè)務(wù)場景涉及到的功能點(diǎn)字段,并且相同功能點(diǎn)字段在該業(yè)務(wù)場景中的取值集合包含在另一個(gè)業(yè)務(wù)場景中的取值集合,只需要測試該業(yè)務(wù)場景即可。因?yàn)樵摌I(yè)務(wù)場景涉及到的功能點(diǎn)字段更全,取值范圍更廣,囊括了另一個(gè)業(yè)務(wù)場景的各種情況。通過歸并業(yè)務(wù)場景,可以剔除冗余的業(yè)務(wù)場景,避免重復(fù)測試,減少冗余的測試用例,達(dá)到精簡測試用例的目的。
2.2.3 測試用例自動(dòng)生成
本測試用例自動(dòng)生成方法是侵入式的,需要在現(xiàn)有軟件中打樁,記錄軟件的執(zhí)行路徑,將相關(guān)信息以結(jié)構(gòu)化的形式進(jìn)行存儲(chǔ)。此外本方法還依賴于海量的業(yè)務(wù)數(shù)據(jù)和生產(chǎn)日志,需要在其中篩選出符合業(yè)務(wù)場景測試需求的用例。下面將介紹該方法的實(shí)現(xiàn)步驟。
輸入:業(yè)務(wù)數(shù)據(jù)
生產(chǎn)日志
輸出:測試用例集
(1)初始化測試用例集為空集。
(2)構(gòu)造精簡的功能點(diǎn)組合矩陣,定義測試需求。
(3)基于打樁程序框架,在軟件的功能點(diǎn)實(shí)現(xiàn)打樁功能。
(4)執(zhí)行生產(chǎn)日志中的請求,篩選并構(gòu)造測試用例。
(5)遍歷生產(chǎn)日志。基于打樁后的軟件程序和業(yè)務(wù)數(shù)據(jù),執(zhí)行每一條生產(chǎn)日志請求;打樁程序記錄各個(gè)功能點(diǎn)的執(zhí)行信息,包括功能點(diǎn)的名稱、請求參數(shù)、業(yè)務(wù)數(shù)據(jù)內(nèi)容,以及處理結(jié)果等信息;提取并分析各個(gè)功能點(diǎn)的執(zhí)行信息,識(shí)別執(zhí)行到的功能點(diǎn);匹配測試需求,如果該生產(chǎn)日志請求的執(zhí)行路徑首次覆蓋到的功能點(diǎn)組合矩陣的某一元組,將此生產(chǎn)日志請求存入測試用例庫。
(6)直至滿足測試需求的完備性,結(jié)束遍歷。本方法采用真實(shí)的業(yè)務(wù)數(shù)據(jù)和生產(chǎn)日志作為輸入。業(yè)務(wù)數(shù)據(jù)是用戶根據(jù)自身的業(yè)務(wù)發(fā)展情況創(chuàng)建的,最能體現(xiàn)用戶的真實(shí)業(yè)務(wù)意圖。而生產(chǎn)日志中的請求是用戶根據(jù)自身的需要發(fā)起的,最能體現(xiàn)用戶的真實(shí)使用意圖。因此,生產(chǎn)日志請求和涉及的業(yè)務(wù)數(shù)據(jù),構(gòu)成了最有價(jià)值的測試用例。
匹配測試需求,即匹配功能點(diǎn)組合矩陣。執(zhí)行每個(gè)生產(chǎn)日志請求,將其執(zhí)行的功能點(diǎn)組合與業(yè)務(wù)功能點(diǎn)組合矩陣中的每一元組比較,如果生產(chǎn)日志請求執(zhí)行的功能點(diǎn)組合能夠覆蓋業(yè)務(wù)功能點(diǎn)組合矩陣的某一元組,并且之前沒有被覆蓋過,則將該生產(chǎn)日志請求納入到測試用例庫中,作為測試請求。
打樁程序框架采用外掛模式,對每個(gè)功能點(diǎn)增加打樁功能程序,以及打樁開關(guān)選項(xiàng),控制功能點(diǎn)是否執(zhí)行打樁程序。當(dāng)需要采集某個(gè)功能點(diǎn)的執(zhí)行信息時(shí),只需要在配置中動(dòng)態(tài)打開該功能點(diǎn)的打樁開關(guān),便可獲取到相應(yīng)的執(zhí)行信息。打樁程序可以按照軟件系統(tǒng)的功能層次記錄執(zhí)行情況,假設(shè)在功能A中調(diào)用了功能B,則打樁程序的記錄結(jié)果與之對應(yīng),在執(zhí)行結(jié)果A中包含執(zhí)行結(jié)果B的內(nèi)容。
2.2.4 舉例說明
假設(shè)某軟件有5個(gè)功能點(diǎn),劃分為3個(gè)業(yè)務(wù)場景后,各業(yè)務(wù)場景包含的功能點(diǎn)和取值集合如下:
業(yè)務(wù)場景一:
功能點(diǎn)1:{a11,a12,a13};功能點(diǎn)2:{b11,b12};功能點(diǎn)3:{c11,c12};功能點(diǎn)4:{d11}。
業(yè)務(wù)場景二:
功能點(diǎn)1:{a21,a22};功能點(diǎn)4:{d21};功能點(diǎn)5:{e21,e22}。
業(yè)務(wù)場景三:
功能點(diǎn)1:{a11,a13};功能點(diǎn)3:{c11,c12}。
上述3個(gè)業(yè)務(wù)場景對應(yīng)的功能點(diǎn)組合矩陣見表1—表3。
表1 業(yè)務(wù)場景一功能點(diǎn)組合矩陣
表2 業(yè)務(wù)場景二功能點(diǎn)組合矩陣
表3 業(yè)務(wù)場景三功能點(diǎn)組合矩陣
由定義3,業(yè)務(wù)場景三功能點(diǎn)組合矩陣是業(yè)務(wù)場景一功能點(diǎn)組合矩陣的測試子集,又由定理2,業(yè)務(wù)場景三功能點(diǎn)組合矩陣可以被精簡掉。因此,業(yè)務(wù)場景一和業(yè)務(wù)場景二的功能點(diǎn)組合矩陣構(gòu)成了該軟件的測試需求。
遍歷生產(chǎn)日志中的請求,針對業(yè)務(wù)場景一,打開功能點(diǎn)1、功能點(diǎn)2、功能點(diǎn)3、功能點(diǎn)4的打樁開關(guān),記錄每個(gè)生產(chǎn)日志請求的執(zhí)行情況。假設(shè)某一生產(chǎn)日志請求執(zhí)行了功能點(diǎn)1、功能點(diǎn)2、功能點(diǎn)3、功能點(diǎn)4,對應(yīng)的值分別為a11、b11、c11、d11,則覆蓋了該業(yè)務(wù)場景功能點(diǎn)組合矩陣的一個(gè)元組4-T=(a11,b11,c11,d11),如果之前沒有被覆蓋過,該生產(chǎn)日志請求納入到測試用例庫中,為業(yè)務(wù)場景一的一個(gè)測試用例。以此類推,逐步篩選出符合業(yè)務(wù)場景一的所有功能點(diǎn)組合的生產(chǎn)日志請求,并納入到測試用例庫中。當(dāng)業(yè)務(wù)場景一功能點(diǎn)組合矩陣的所有元組被完全覆蓋,則業(yè)務(wù)場景一的測試需求是測試完備的。同理,篩選出業(yè)務(wù)場景二的測試用例。該測試用例自動(dòng)生成方法的目標(biāo)是篩選出能夠覆蓋功能點(diǎn)組合的生產(chǎn)日志請求,使得所有業(yè)務(wù)場景的測試需求都是測試完備的。
本實(shí)驗(yàn)以民航運(yùn)價(jià)系統(tǒng)為例,使用生產(chǎn)日志和業(yè)務(wù)數(shù)據(jù)驗(yàn)證本文所提測試用例精簡的效果和自動(dòng)生成方法的可行性。
民航運(yùn)價(jià)系統(tǒng),每天處理約2 000萬筆交易,生成約120 G日志;包含3年的業(yè)務(wù)數(shù)據(jù),近500 G。本實(shí)驗(yàn)使用2022年1月29日交易日期的生產(chǎn)日志和2022年8月25日的業(yè)務(wù)數(shù)據(jù)。系統(tǒng)包含3年的業(yè)務(wù)數(shù)據(jù),即2019年8月26日—2022年8月25日三年的全部數(shù)據(jù)內(nèi)容。
以國航運(yùn)價(jià)業(yè)務(wù)數(shù)據(jù)為樣本,共涉及323 897條樣本數(shù)據(jù),10個(gè)功能點(diǎn),功能點(diǎn)分別為:去程星期限制、回程星期限制、提前購票限制、運(yùn)價(jià)組合限制、團(tuán)隊(duì)人數(shù)限制、團(tuán)隊(duì)拆分限制、缺口程組合限制、往返程組合限制、代碼共享限制、適用代碼共享承運(yùn)人。對于該樣本數(shù)據(jù),不劃分業(yè)務(wù)場景時(shí),需要155 520個(gè)測試用例保證測試完備性。
根據(jù)標(biāo)簽,可以將樣本數(shù)據(jù)劃分為207個(gè)業(yè)務(wù)場景,其中最多涉及7個(gè)功能點(diǎn),最少涉及1個(gè)功能點(diǎn),共需要4 421個(gè)測試用例保證測試完備性。經(jīng)過精簡后,可以歸并為12個(gè)業(yè)務(wù)場景,其中最多涉及7個(gè)功能點(diǎn),最少涉及2個(gè)功能點(diǎn),共需要2 592個(gè)測試用例保證測試完備性。
以精簡后的某一業(yè)務(wù)場景“T/CA3C212619”為例,該業(yè)務(wù)場景涉及到3個(gè)功能點(diǎn),分別為:
提前購票限制,取值集合為{[0天999天]、[1天999天]};
代碼共享限制,取值集合為{[0]、[1]};
適用代碼共享承運(yùn)人,取值集合為{[]、[山航/]}。
該業(yè)務(wù)場景生成的功能點(diǎn)組合矩陣包含8個(gè)3維元組,如表4所示。
表4 業(yè)務(wù)場景“T/CA3C212619”功能點(diǎn)組合矩陣
某一生產(chǎn)日志請求執(zhí)行結(jié)果如圖2所示:
圖2 生產(chǎn)日志請求結(jié)果
該日志請求的執(zhí)行結(jié)果覆蓋了業(yè)務(wù)場景“T/CA3C212619”功能點(diǎn)組合矩陣的第3個(gè)元組,可以納入到測試用例庫中。
本文提出了一種測試用例精簡與自動(dòng)生成方法。首先,測試用例精簡方法通過劃分業(yè)務(wù)場景降維,通過歸并業(yè)務(wù)場景減少功能點(diǎn)組合矩陣,解決了測試需求維度爆炸問題,實(shí)驗(yàn)結(jié)果顯示,在保證測試完備性的前提下,有效地減少了測試用例的數(shù)量,使得基于路徑覆蓋的測試具有可行性。再次,測試用例自動(dòng)生成方法使用生產(chǎn)日志和業(yè)務(wù)數(shù)據(jù),自動(dòng)分析軟件系統(tǒng)的請求以及結(jié)果,抓取測試用例,大大提升了測試用例的范圍,以及測試覆蓋率,并且業(yè)務(wù)數(shù)據(jù)和生產(chǎn)請求更加貼合用戶的真實(shí)業(yè)務(wù)場景,提升了測試的可靠性,避免了無效的測試。雖然本方法使用的打樁技術(shù)是侵入式的,但是可以采用組件掛載技術(shù),通過配置動(dòng)態(tài)開關(guān),控制是否開啟打樁程序,對生產(chǎn)系統(tǒng)功能和性能無影響。綜上,本文所提方法在工程實(shí)踐中具有較大的應(yīng)用價(jià)值。