劉美英,楊秋輝,王瀟,蔡創(chuàng)
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
持續(xù)集成(Continuous Integration,CI)是一種軟件開(kāi)發(fā)實(shí)踐,每次集成都通過(guò)自動(dòng)化的構(gòu)建和測(cè)試進(jìn)行驗(yàn)證,保證頻繁變更的代碼快速安全地集成到主線代碼庫(kù),而隨著版本的快速變更所需要的測(cè)試資源也在不斷增長(zhǎng)[1]。例如在Google 中,平均每秒觸發(fā)的測(cè)試執(zhí)行次數(shù)多達(dá)1.5 億[2]。因此,提升CI 環(huán)境中的回歸測(cè)試效率是至關(guān)重要的。
CI 環(huán)境中的回歸測(cè)試,主要問(wèn)題是大量提交導(dǎo)致的頻繁構(gòu)建和測(cè)試導(dǎo)致的測(cè)試資源過(guò)于龐大、反饋周期較長(zhǎng)[3]。為此,Liang 等[4]提出對(duì)CI 環(huán)境中的提交進(jìn)行優(yōu)先級(jí)排序,可以提高故障檢測(cè)率,但不能降低測(cè)試成本。另外Machalica 等[5]采用人工智能領(lǐng)域技術(shù)對(duì)測(cè)試進(jìn)行選擇以加快測(cè)試反饋。該方法雖然能降低測(cè)試成本,但沒(méi)有考慮CI 中大量提交到達(dá)的情況,忽略了密集提交的順序?qū)ε判蛸|(zhì)量的影響。
在CI 中,為了對(duì)不斷到達(dá)的變更提交進(jìn)行回歸測(cè)試,在保證故障檢測(cè)率的同時(shí)降低測(cè)試成本,滿足持續(xù)集成的質(zhì)量和速度需求。綜合考慮故障檢測(cè)路和測(cè)試成本,提出CI 中一種新的回歸測(cè)試選擇方法:基于提交排序和預(yù)測(cè)模型的測(cè)試套件選擇方法。本文方法包含提交排序和測(cè)試套件選擇兩個(gè)階段。首先根據(jù)各個(gè)提交的歷史失敗率和執(zhí)行率進(jìn)行排序;之后對(duì)提交包含的測(cè)試套件采用XGboost 算法構(gòu)建失敗率預(yù)測(cè)模型,選擇高失敗率測(cè)試套件執(zhí)行。在Google 的共享數(shù)據(jù)集上進(jìn)行評(píng)估,在開(kāi)銷感知平均故障檢測(cè)率(Average Percentage of Faults Detected per cost,APFDc)、選擇率(SelectionRate)、測(cè)試召回(TestRecall)、變更召回(ChangeRecall)四個(gè)指標(biāo)上本文方法比文獻(xiàn)[4-5]方法有更好的表現(xiàn)。
文獻(xiàn)[6-11]基于歷史執(zhí)行信息,研究了歷史測(cè)試數(shù)據(jù)對(duì)優(yōu)先級(jí)技術(shù)效率的影響,證實(shí)了歷史執(zhí)行數(shù)據(jù)對(duì)測(cè)試用例優(yōu)先級(jí)(Test Case Priorization,TCP)排序技術(shù)研究的重要性。文獻(xiàn)[12]基于歷史日志信息設(shè)計(jì)了回歸測(cè)試優(yōu)先級(jí)排序算法,優(yōu)化了持續(xù)集成測(cè)試流程。Do 等[13]評(píng)估了時(shí)間限制對(duì)TCP 技術(shù)的成本和收益的影響,從經(jīng)濟(jì)有效的回歸測(cè)試角度給予了測(cè)試工程師啟示。Liang 等[4]提出基于提交的排序技術(shù)(Continuous,Commit-Based Prioritization,CCBP),該方法使用測(cè)試套件失敗和執(zhí)行信息對(duì)CI 中持續(xù)到達(dá)的提交進(jìn)行優(yōu)先級(jí)排序;但該方法仍然需要執(zhí)行提交中的全部測(cè)試套件,測(cè)試成本并未得到有效降低。
文獻(xiàn)[14-18]根據(jù)回歸測(cè)試歷史信息提出了一系列測(cè)試選擇技術(shù),證實(shí)了執(zhí)行歷史對(duì)回歸測(cè)試選擇(Regression Test Selection,RTS)技術(shù)研究的重要性。Machalica 等[5]提出一種新的預(yù)測(cè)測(cè)試選擇策略,基于歷史執(zhí)行信息對(duì)測(cè)試套件進(jìn)行失敗率預(yù)測(cè)和選擇。但該方法并沒(méi)考慮到密集提交環(huán)境中多個(gè)提交間的序列對(duì)故障檢測(cè)率的影響。
另外,現(xiàn)有研究也包含TCP 和RTS 混合優(yōu)化技術(shù)。Elbaum 等[19]提出在測(cè)試預(yù)提交階段使用RTS 技術(shù)選擇測(cè)試套件的子集,在提交后的測(cè)試階段使用TCP 技術(shù)確保故障快速反饋。Spieker 等[20]介紹了Rerecs,一種能自動(dòng)學(xué)習(xí)CI 中TCP 和RTS 的新方法,旨在最大限度減少反饋時(shí)間。Najafi等[21]根據(jù)先驗(yàn)的TCP 和RTS 方法,確認(rèn)了測(cè)試執(zhí)行歷史中失敗信息的價(jià)值。本文參考以上文獻(xiàn),提出基于提交排序和預(yù)測(cè)模型相結(jié)合的回歸測(cè)試選擇方法,是一種歷史數(shù)據(jù)驅(qū)動(dòng)的回歸測(cè)試優(yōu)化方法。
本文提出了一種提交排序和測(cè)試套件選擇相結(jié)合的持續(xù)集成回歸測(cè)試優(yōu)化方法,可以提高故障檢測(cè)率,同時(shí)降低測(cè)試成本。本文方法的流程如圖1 所示。
圖1 本文方法的流程Fig.1 Flowchart of the proposed method
提交排序階段,對(duì)等待隊(duì)列中的所有提交,根據(jù)其相關(guān)測(cè)試套件在版本控制儲(chǔ)存庫(kù)中的執(zhí)行歷史,進(jìn)行失敗率和執(zhí)行率計(jì)算,然后對(duì)當(dāng)前版本的提交進(jìn)行排序。測(cè)試套件選擇階段,對(duì)于已排序的各個(gè)提交作如下處理:對(duì)當(dāng)前提交所包含的測(cè)試套件,使用預(yù)先構(gòu)建好的模型進(jìn)行測(cè)試套件選擇。而測(cè)試套件選擇模型是在執(zhí)行回歸測(cè)試前,使用版本控制數(shù)據(jù)庫(kù)中的歷史信息構(gòu)建的。為了提高效率,測(cè)試套件失敗率預(yù)測(cè)和選擇模型的構(gòu)建可以周期性地,每一周或者幾天更新,其構(gòu)建過(guò)程包括收集版本控制庫(kù)中的歷史提交和執(zhí)行數(shù)據(jù),然后進(jìn)行數(shù)據(jù)預(yù)處理,最后建模。
CI 環(huán)境下存在多個(gè)開(kāi)發(fā)人員持續(xù)發(fā)起提交,每次測(cè)試結(jié)果也隨之更新,此時(shí)優(yōu)先級(jí)排序方法要求必須是輕量級(jí)并且能快速持續(xù)進(jìn)行。一段時(shí)間內(nèi)可能對(duì)相同隊(duì)列進(jìn)行多次排序,導(dǎo)致傳統(tǒng)的代碼插裝和變更分析技術(shù)不再適用。文獻(xiàn)[4]認(rèn)為在提交級(jí)別針對(duì)多個(gè)提交進(jìn)行優(yōu)先級(jí)排序后的測(cè)試表現(xiàn)更符合CI 環(huán)境的測(cè)試特點(diǎn)。本文根據(jù)動(dòng)態(tài)的提交和測(cè)試結(jié)果信息采用基于提交的排序方法。
該過(guò)程涉及三類數(shù)據(jù):1)提交本身,包含該提交到達(dá)的時(shí)間及相關(guān)聯(lián)的測(cè)試套件集。另外還需人為計(jì)算一組屬性,包括提交的預(yù)期故障率(基于提交的測(cè)試套件失敗的概率)和執(zhí)行率(提交的測(cè)試套件最近未執(zhí)行的概率),分別用于優(yōu)先級(jí)排序;2)待執(zhí)行的提交(commitQ)隊(duì)列。到達(dá)的提交會(huì)添加到commitQ 中,執(zhí)行中的提交會(huì)從commitQ 中移除,當(dāng)資源可用,就對(duì)commitQ 進(jìn)行優(yōu)先級(jí)排序;3)失敗窗口的大?。╢ailWindowSize)和執(zhí)行窗口的大小(exeWindowSize),可根據(jù)提交的數(shù)量衡量,在本次實(shí)驗(yàn)中設(shè)定為固定值,實(shí)際環(huán)境中也可根據(jù)不同條件進(jìn)行調(diào)整。
提交排序的基本思想是,當(dāng)新的提交到達(dá)時(shí)先加入等待隊(duì)列,只有當(dāng)隊(duì)列不為空且測(cè)試資源可用時(shí),才對(duì)等待隊(duì)列中的所有提交分別計(jì)算所包含的測(cè)試套件的歷史失敗率和執(zhí)行率,歷史失敗率指在最近歷史中該提交的失敗測(cè)試套件數(shù)占測(cè)試套件總數(shù)的比例,執(zhí)行率指在最近歷史中該提交執(zhí)行過(guò)的測(cè)試套件數(shù)占測(cè)試套件總數(shù)的比例。最近歷史由失敗窗口和執(zhí)行窗口限制,例如失敗窗口和執(zhí)行窗口大小為5,最近歷史為距本次提交最近的5 次提交的測(cè)試套件的失敗和執(zhí)行歷史。首先比較提交的失敗率,失敗率更高則優(yōu)先級(jí)更高;失敗率相同則比較執(zhí)行率,執(zhí)行率低的測(cè)試套件對(duì)應(yīng)的提交優(yōu)先級(jí)更高,以此得到最高優(yōu)先級(jí)提交,將其移出等待隊(duì)列并釋放資源。提交優(yōu)先級(jí)排序算法的偽代碼如下。
算法1 提交排序算法。
輸入按時(shí)間先后到達(dá)的提交集合commitQueue,包含多個(gè)commit,每個(gè)commit 的測(cè)試套件集testSuites,包含多個(gè)測(cè)試套件。
輸出最高優(yōu)先級(jí)提交。
CI 中記錄了項(xiàng)目中受變更影響的測(cè)試套件的執(zhí)行結(jié)果,因此可以通過(guò)歷史結(jié)果信息構(gòu)建預(yù)測(cè)模型,對(duì)測(cè)試套件進(jìn)行失敗率預(yù)測(cè),從而選擇失敗可能性較高的測(cè)試套件。
2.2.1 數(shù)據(jù)收集和預(yù)處理
為收集CI 中的項(xiàng)目數(shù)據(jù),可從版本控制庫(kù)和CI 服務(wù)器中通過(guò)提交日志和構(gòu)建日志獲取相關(guān)的提交和測(cè)試數(shù)據(jù)。如提交的執(zhí)行結(jié)果、提交包含的測(cè)試套件集、各測(cè)試套件執(zhí)行結(jié)果,最后將關(guān)聯(lián)信息通過(guò)進(jìn)行人工或統(tǒng)計(jì)程序分析得到各測(cè)試套件失敗次數(shù)、執(zhí)行次數(shù),合并數(shù)據(jù)得到樣本數(shù)據(jù)集。數(shù)據(jù)預(yù)處理部分采用基于包裝器Wrapper[22]的特征選擇方法。使用XGboost 作為特征選擇的基模型,通過(guò)枚舉法進(jìn)行特征子集遍歷,將去掉該特征的特征集與全特征集的選擇率selectionRate的比值作為分類度量,數(shù)量閾值numberThreshold作為排名度量,探索去掉某一特征集對(duì)模型的影響。分類度量、排名度量大于1 則表示有積極影響,選擇該類特征作為最終特征子集。
2.2.2 預(yù)測(cè)模型構(gòu)建
使用XGboost 算法[23]構(gòu)造測(cè)試套件失敗率預(yù)測(cè)模型學(xué)習(xí)器,變更提交c和與之相關(guān)的測(cè)試套件集作為輸入,失敗的測(cè)試套件標(biāo)記為正例,反之為負(fù)例。XGboost 學(xué)習(xí)器相當(dāng)于一個(gè)函數(shù),根據(jù)輸入返回一個(gè)區(qū)間在[0,1]的分?jǐn)?shù)score(c,t),表示測(cè)試套件t在提交c中的失敗概率。測(cè)試套件選擇策略由預(yù)先定義的分?jǐn)?shù)閾值scoreThreshold和數(shù)量閾值numberThreshold控制。兩個(gè)參數(shù)閾值的確定方法基于文獻(xiàn)[5]中通過(guò)反復(fù)評(píng)估模型性能不斷調(diào)整得到,模型評(píng)估時(shí)先定義需要達(dá)到的測(cè)試召回和變更召回標(biāo)準(zhǔn),再調(diào)整兩個(gè)參數(shù)的值。模型構(gòu)建的流程如圖2 所示。
圖2 測(cè)試套件失敗率預(yù)測(cè)和選擇模型構(gòu)建流程Fig.2 Construction flowchart of test suite failure rate prediction and selection model
2.2.3 測(cè)試套件失敗率預(yù)測(cè)和選擇
用構(gòu)建的模型進(jìn)行測(cè)試套件失敗率預(yù)測(cè)和選擇。首先對(duì)提交的測(cè)試套件進(jìn)行數(shù)據(jù)預(yù)處理,得到符合XGboost 學(xué)習(xí)器輸入的特征值的集合作為待預(yù)測(cè)樣本輸入;然后學(xué)習(xí)器進(jìn)行預(yù)測(cè),預(yù)測(cè)后返回每個(gè)測(cè)試套件的分?jǐn)?shù)score(c,t);最后選擇score(c,t)≥scoreThreshold的測(cè)試套件t,且選擇的測(cè)試套件總數(shù)量不超過(guò)numberThreshold。
本文使用Google 共享數(shù)據(jù)集[24],包含15 d 內(nèi)收集的超過(guò)2 506 926 個(gè)測(cè)試套件的執(zhí)行信息。原始數(shù)據(jù)集的相關(guān)統(tǒng)計(jì)信息如表1 所示。
為綜合考慮選擇質(zhì)量和故障檢測(cè)率,故使用測(cè)試召回(TestRecall)、變更召回(ChangeRecall)、選擇率(SelectionRate)、開(kāi)銷感知平均故障檢測(cè)率APFDc四個(gè)指標(biāo)評(píng)估本文方法。本文引用文獻(xiàn)[5]中的三個(gè)度量標(biāo)準(zhǔn)來(lái)優(yōu)化選擇模型和評(píng)估質(zhì)量。設(shè)C是一組變更提交,F(xiàn)C是更改c中失敗測(cè)試套件集,,SelectedTests(c)是更改c中選擇的測(cè)試套件集,AllTests(c)是更改c相關(guān)的所有測(cè)試套件。測(cè)試召回(TestRecall):表示選擇的測(cè)試套件屬于失敗測(cè)試套件集的概率,其定義見(jiàn)式(1)。變更召回(ChangeRecall):表示選擇的測(cè)試套件屬于包含失敗測(cè)試套件的變更提交的概率,其定義見(jiàn)式(2)。選擇率(SelectionRate):表示選擇的測(cè)試套件與提交包含的所有測(cè)試套件的比例,其定義見(jiàn)式(3)。其中TestRecall、ChangeRecall的值越高,SelectionRate越低,則回歸測(cè)試選擇的質(zhì)量越好。
為評(píng)估故障檢測(cè)率,使用了改進(jìn)的APFDc度量標(biāo)準(zhǔn)[4]。APFDc是基于成本的平均故障率表示,與傳統(tǒng)的基于測(cè)試用例級(jí)別的APFDc[25]不同,改進(jìn)后的APFDc考慮的是測(cè)試套件的執(zhí)行過(guò)程,對(duì)測(cè)試套件的故障檢測(cè)率進(jìn)行評(píng)估。APFDc的計(jì)算公式見(jiàn)式(4):
其中:T為有序的測(cè)試套件集;n為T中的測(cè)試套件總數(shù);F為有故障的測(cè)試套件集;m為F中的測(cè)試套件數(shù);TFi為首次檢測(cè)到F中第i個(gè)有故障的測(cè)試套件在T中的次序;tj為第j個(gè)測(cè)試套件的執(zhí)行開(kāi)銷。
為在Google 開(kāi)源數(shù)據(jù)集應(yīng)用本文方法,首先根據(jù)文獻(xiàn)[4]將窗口大小設(shè)為10,測(cè)試資源設(shè)為1,即最近歷史限制為考慮最近的10 次提交的測(cè)試信息,且整個(gè)流程中測(cè)試資源只能被一個(gè)提交所使用即同一時(shí)間只考慮單個(gè)提交的測(cè)試執(zhí)行。使用Java 多線程模擬提交的到達(dá)和優(yōu)先級(jí)排序。
根據(jù)文獻(xiàn)[5,26]使用的特征在原始數(shù)據(jù)集上增加了一些需計(jì)算得到的特征,其中包含提交觸發(fā)的測(cè)試套件數(shù)(Test suite cardinality)、測(cè)試套件的歷史失敗率(History failure rate)、測(cè)試套件的歷史執(zhí)行率(History execution rate)?;诎b器Wrapper 方法,在TestRecall=0.9 時(shí)計(jì)算模型的分類度量和排名度量,最后選擇分類度量和排名度量大于1 的特征得到構(gòu)建模型的特征子集:History failure rate、History execution rate、Size 和Language。
最后將原始數(shù)據(jù)集按6∶2∶2 劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集。在訓(xùn)練集上構(gòu)建初步模型觀察得到學(xué)習(xí)率為0.05,故設(shè)置選擇策略的參數(shù)scoreThreshold=0.05,numberThreshold=10。在驗(yàn)證集上評(píng)估模型調(diào)整兩個(gè)參數(shù)值,在該過(guò)程中將模型標(biāo)準(zhǔn)定位測(cè)試召回設(shè)為0.9 以上,變更召回設(shè)為0.95 以上,分別計(jì)算測(cè)試召回在scoreThreshold和變更召回在numberThreshold的依賴性。最終得到在GooglePre 驗(yàn)證集上scoreThreshold≈0.35,numberThreshold≈362;在 GooglePost 驗(yàn)證集上scoreThreshold≈0.32,numberThreshold≈240。
本文方法先對(duì)提交進(jìn)行優(yōu)先級(jí)排序再選擇測(cè)試套件執(zhí)行,因此與同樣采用提交排序的文獻(xiàn)[4]方法、采用測(cè)試套件選擇的文獻(xiàn)[5]方法作對(duì)比實(shí)驗(yàn)驗(yàn)證方法的有效性。在Google 共享數(shù)據(jù)集上:對(duì)文獻(xiàn)[4]方法進(jìn)行重現(xiàn)并獲得實(shí)驗(yàn)結(jié)果;對(duì)于文獻(xiàn)[5],由于Google 開(kāi)源數(shù)據(jù)集與文獻(xiàn)[5]方法所使用的私有數(shù)據(jù)集相比缺少一些特征,如涉及到源代碼的文件數(shù)、作者名及文件間的依賴性,導(dǎo)致模型在構(gòu)建時(shí)的輸入特征有差異,因此本文對(duì)文獻(xiàn)[5]的核心算法進(jìn)行實(shí)現(xiàn)。
1)故障檢測(cè)率對(duì)比。為對(duì)比方法的故障檢測(cè)速度,不限制測(cè)試成本,分別記錄三種方法在Google 共享數(shù)據(jù)集上的測(cè)試執(zhí)行時(shí)間和包含失敗測(cè)試套件的提交執(zhí)行比例,統(tǒng)計(jì)分別在執(zhí)行時(shí)間到達(dá)25%、50%以及75%時(shí)執(zhí)行的包含失敗測(cè)試套件的提交比例,并計(jì)算各自的APFDc值。
GooglePre 數(shù)據(jù)集上的結(jié)果如表2 所示。由表2 可知,本文方法的包含失敗測(cè)試套件提交的執(zhí)行比例即揭錯(cuò)率在各時(shí)間節(jié)點(diǎn)的表現(xiàn)都優(yōu)于另兩種方法。其中本文方法比文獻(xiàn)[4]方法的揭錯(cuò)率提高了17.9%~30.2%,比文獻(xiàn)[5]方法的揭錯(cuò)率提高了4.8%~32.0%。
表2 不同時(shí)間執(zhí)行率下不同方法的揭錯(cuò)率對(duì)比 單位:%Tab.2 Comparison of error revealing rate under different methods unit:%
GooglePost 數(shù)據(jù)集上結(jié)果如表2 所示。由表2 可知,本文方法的揭錯(cuò)率在各個(gè)時(shí)間節(jié)點(diǎn)的表現(xiàn)都優(yōu)于文獻(xiàn)[5]方法,其中本文方法比文獻(xiàn)[5]方法揭錯(cuò)率提高了11.5%~104.4%。與文獻(xiàn)[4]方法相比,雖然執(zhí)行時(shí)間在25%節(jié)點(diǎn)時(shí),本文方法表現(xiàn)略差,但隨著時(shí)間的增加,本文方法的提交執(zhí)行比例逐步超過(guò)文獻(xiàn)[4]方法,執(zhí)行時(shí)間在75%節(jié)點(diǎn)時(shí)揭錯(cuò)率提高了7.4%。從以上結(jié)果可知,經(jīng)過(guò)提交優(yōu)先級(jí)排序的測(cè)試選擇技術(shù)能更早檢測(cè)到更多的缺陷。
APFDc值對(duì)比結(jié)果如表3 所示。在GooglePre 數(shù)據(jù)集上,本文方法的APFDc值比文獻(xiàn)[4]方法高0.126 2,比文獻(xiàn)[5]方法高0.098 7。在GooglePost 數(shù)據(jù)集上,本文方法的APFDc值比文獻(xiàn)[4]方法高0.005 6,比文獻(xiàn)[5]方法高0.014 5。因此本文方法最高在現(xiàn)有方法的結(jié)果基礎(chǔ)上提高了1%~27%。通過(guò)測(cè)試的揭錯(cuò)率和APFDc值的比較,本文的方法可以提高基于成本的故障檢測(cè)率,更早地檢測(cè)到更多的缺陷。
表3 不同方法的APFDc值對(duì)比Tab.3 APFDc value comparison
2)為評(píng)估選擇的質(zhì)量,限制測(cè)試成本。三種方法的測(cè)試成本為文獻(xiàn)[4]方法>本文方法>文獻(xiàn)[5]方法,以本文方法的測(cè)試成本為基準(zhǔn),三種方法在測(cè)試過(guò)程中時(shí)間到達(dá)則停止測(cè)試。統(tǒng)計(jì)三種方法選擇的測(cè)試套件數(shù)、包含失敗的測(cè)試套件數(shù)、包含失敗測(cè)試套件的變更提交數(shù),并計(jì)算各自的測(cè)試召回、變更召回和選擇率。
由圖3 可知與文獻(xiàn)[4]方法相比,在GooglePre 數(shù)據(jù)集上,本文的TestRecall、ChangeRecall的值比文獻(xiàn)[4]方法的值分別高38.16、15.67 個(gè)百分點(diǎn),SelectionRate的值比文獻(xiàn)[4]方法低6.2 個(gè)百分點(diǎn)。由圖4 可知在GooglePost 數(shù)據(jù)集上,本文的TestRecall、ChangeRecall的值比文獻(xiàn)[4]方法的值分別高33.33、24.52 個(gè)百分點(diǎn)。SelectionRate的值比文獻(xiàn)[4]方法低6.33 個(gè)百分點(diǎn)。
圖3 GooglePre數(shù)據(jù)集上TestChange、ChangeRecall和SelectionRate的對(duì)比Fig.3 Comparison of TestChange,ChangeRecall and SelectionRate on GooglePre dataset
圖4 GooglePost數(shù)據(jù)集上TestChange、ChangeRecall和SelectionRate的對(duì)比Fig.4 Comparison chart of TestChange,ChangeRecall and SelectionRate on GooglePost dataset
TestRecall和ChangeRecall高是因?yàn)槭軠y(cè)試成本影響,文獻(xiàn)[4]方法做實(shí)驗(yàn)時(shí)丟失了一部分失敗測(cè)試套件。文獻(xiàn)[4]方法選擇率高是因?yàn)樵谕瑯拥臅r(shí)間成本下執(zhí)行的測(cè)試套件的數(shù)量更多。
與文獻(xiàn)[5]方法相比,本文方法的TestRecall、ChangeRecall的值略高一些,由于經(jīng)過(guò)提交排序后的一些測(cè)試套件集的特征值History failure rate 更高,失敗率預(yù)測(cè)的分?jǐn)?shù)更大使被選擇的失敗測(cè)試套件集更多。雖然本文方法與文獻(xiàn)[5]方法構(gòu)建模型的特征略有差異,導(dǎo)致選擇的質(zhì)量并不夠理想,但本文綜合使用提交排序和測(cè)試套件選擇的方法比文獻(xiàn)[5]方法只使用測(cè)試套件選擇的方法效果更好。從構(gòu)建模型的角度出發(fā),更多有效的信息來(lái)源,如代碼更改的歷史,都能以附加特征的形式納入測(cè)試選擇模型中以提高選擇的性能,這一點(diǎn)在未來(lái)工作中是值得探索的。總的來(lái)說(shuō),本文方法在給定的測(cè)試成本下,選擇了相對(duì)較少的測(cè)試套件,提高了測(cè)試套件的測(cè)試召回和變更召回。
綜合上述結(jié)果,在不限測(cè)試成本情況下,本文方法的APFDc值更高,即提高了故障檢測(cè)率的速度;以本文測(cè)試成本為統(tǒng)一基準(zhǔn),本文方法的TestRecall和ChangeRecall值更高,SelectionRate值更低,即降低了測(cè)試成本。因此將提交優(yōu)先級(jí)排序和測(cè)試選擇套件選擇相結(jié)合的方法提高了故障檢測(cè)率,并降低了測(cè)試成本。
為在持續(xù)集成環(huán)境中取得反饋速度和測(cè)試成本間的平衡,本文提出了一種結(jié)合提交優(yōu)先級(jí)排序和測(cè)試套件選擇的方法。該方法分兩階段:第一階段對(duì)提交進(jìn)行優(yōu)先級(jí)排序,并對(duì)提交等待隊(duì)列進(jìn)行持續(xù)的優(yōu)先級(jí)排序,提交排序方法作為只考慮失敗率和執(zhí)行率的輕量級(jí)方法,在CI 環(huán)境中能快速完成排序;第二階段對(duì)前一階段得到的最高優(yōu)先級(jí)提交包含的測(cè)試套件采用構(gòu)建的失敗率預(yù)測(cè)模型預(yù)測(cè),選擇高失敗率測(cè)試套件執(zhí)行。通過(guò)對(duì)比實(shí)驗(yàn),驗(yàn)證了本文方法的有效性。
本文綜合考慮故障檢測(cè)率和測(cè)試成本,解決在持續(xù)集成環(huán)境中測(cè)試成本過(guò)高、提交序列影響測(cè)試反饋速度的問(wèn)題,但還存在不足之處。比如:在提交優(yōu)先級(jí)排序技術(shù)中,沒(méi)有關(guān)注提交之間的依賴關(guān)系,且只考慮了單個(gè)測(cè)試資源可用的情況,未來(lái)可研究基于上述情況動(dòng)態(tài)調(diào)整排序算法,輸出多個(gè)優(yōu)先級(jí)較高的提交。構(gòu)建測(cè)試套件選擇模型中,對(duì)于特征集子集的選擇未來(lái)可使用更多變更影響技術(shù)分析得到最具代表性的特征子集。對(duì)于一些新代碼的提交,包含的歷史信息較少,本文方法可能并不適用。