鄧佳棋,王月波,蒲卿路,李繼秀,楊 旭
(西南電子技術(shù)研究所,成都 610036)
一個(gè)公司企業(yè)經(jīng)過長時(shí)間的積累、沉淀,會(huì)產(chǎn)生大量的典型測試用例。通過對(duì)測試用例的整理、積累、學(xué)習(xí),可以幫助和解決各種將來可能發(fā)生的問題,規(guī)避風(fēng)險(xiǎn),獲取經(jīng)驗(yàn)教訓(xùn),更能夠幫助對(duì)質(zhì)量流程的控制,促進(jìn)持續(xù)改進(jìn),提高整體管理者和員工的工作水平,使得公司產(chǎn)品更加完善、全面。
目前大部分公司關(guān)于測試用例的管控與運(yùn)用,都處于閱讀非結(jié)構(gòu)化文本的形式?;蛘吒鞴究赡軙?huì)定期開展培訓(xùn)宣傳工作。但該措施也是有很大局限性的,沒有一個(gè)完整的系統(tǒng)性的、全流程的管控,只是起了一個(gè)臨時(shí)統(tǒng)計(jì)匯報(bào)交流的作用。新員工很難從這些零散的數(shù)據(jù)中進(jìn)行學(xué)習(xí),或者項(xiàng)目與項(xiàng)目之間無法有效共享交流各自曾經(jīng)發(fā)生過的問題,從而總結(jié)出一些共性通用的問題。最為核心的問題在于有價(jià)值的數(shù)據(jù)在長時(shí)間的迭代下,被拋棄或者淡化。針對(duì)上述問題,可以使用智能推薦去改善當(dāng)前關(guān)于典型測試用例的運(yùn)用場景。最早的推薦系統(tǒng)使用基于協(xié)同過濾的推薦技術(shù),其核心思想是以用戶歷史的選擇記錄與偏好作為基礎(chǔ),推薦與歷史選擇關(guān)聯(lián)性較高且未被記錄的內(nèi)容。后期深度神經(jīng)網(wǎng)絡(luò)開始迅速發(fā)展,其在個(gè)性化推薦的使用場景中越來越明顯,例如Adams等人在youTube視頻網(wǎng)站中則使用DNN模型推薦用戶感興趣的視頻。但是目前主流的智能推薦的使用場景都局限于吃喝玩樂、美食推薦、電影推薦及社交推薦中,與日常工作相關(guān)的場景較少,尤其是當(dāng)工作內(nèi)容與外界隔離的情況。
目前測試行業(yè)中,測試的主要目的是發(fā)現(xiàn)產(chǎn)品的質(zhì)量缺陷,但測試的全面性、有效性還是較為依賴測試人員的專業(yè)水平。除相關(guān)培訓(xùn)外,需要一個(gè)有系統(tǒng)性,針對(duì)產(chǎn)品相關(guān)性強(qiáng)的輔助系統(tǒng)以推薦的形式幫助測試人員提高測試用例的質(zhì)量以及全面性。目前推薦算法層出不窮。但該算法在測試用例等具有專業(yè)性的領(lǐng)域中應(yīng)用還是較少。其主要原因還是在于典型測試用例的數(shù)據(jù)集不充分,測試用例的文本質(zhì)量參差不齊。因?yàn)?,最具有代表性的外場問題,或者用戶反饋往往不是由專業(yè)的測試人員編寫、總結(jié),而是由產(chǎn)品的設(shè)計(jì)、開發(fā)人員編寫。對(duì)問題進(jìn)行簡要總結(jié)后形成word,excel等非結(jié)構(gòu)化的數(shù)據(jù),并且相關(guān)人員對(duì)其描述存在大量專業(yè)術(shù)語,后期維護(hù)時(shí)無法對(duì)問題的本質(zhì)進(jìn)行總結(jié),從而導(dǎo)致無法形成高質(zhì)量的訓(xùn)練集或者數(shù)據(jù)源。
測試用例由測試步驟構(gòu)成,測試步驟由輸入、期望結(jié)果及實(shí)測結(jié)果組成。測試人員需要投入大量精力去填寫測試輸入、期望結(jié)果及實(shí)測結(jié)果。測試步驟的輸入是該測試用例的關(guān)鍵,但期望結(jié)果完全可根據(jù)輸入及相關(guān)背景自動(dòng)生成。因此需要一個(gè)能夠?qū)崿F(xiàn)自動(dòng)生成期望結(jié)果的算法,從而減少測試人員編寫測試文檔的時(shí)間。并將其主要關(guān)注點(diǎn)集中在輸入的設(shè)計(jì)上。
綜合上述描述,關(guān)于測試用例在項(xiàng)目全周期中的管控,以推薦測試用例為應(yīng)用背景的推薦算法和測試人員在相關(guān)文檔編寫中存在以下幾個(gè)方面的問題:
1)團(tuán)隊(duì)或者新員工沒有將具有寶貴經(jīng)驗(yàn)的典型測試用例應(yīng)用在實(shí)際工作中。
2)針對(duì)測試用例推薦算法的訓(xùn)練數(shù)據(jù)集少,且非結(jié)構(gòu)化,需要大量人力、物力去標(biāo)注后,才能用于相關(guān)算法的訓(xùn)練。導(dǎo)致已有數(shù)據(jù)難以發(fā)揮真正的價(jià)值。
3)使用場景脫節(jié),目前市面沒有一個(gè)具有典型、代表性的針對(duì)測試用例的推薦系統(tǒng),大部分場景還是針對(duì)消費(fèi)市場。
4)測試文檔編寫和非關(guān)鍵內(nèi)容的編寫,增加了測試人員的工作量。
因此基于以上問題及背景,本文采用知識(shí)圖譜和Bert模型為技術(shù)基礎(chǔ),推薦與真實(shí)測試場景相關(guān)的典型測試用例以及自動(dòng)生成用例步驟期望為目的,幫助測試人員和開發(fā)人員發(fā)現(xiàn)與解決項(xiàng)目中存在的潛在問題并降低工作量,提出測試用例推薦與用例期望結(jié)果生成系統(tǒng)。
該系統(tǒng)采用B/S架構(gòu),前端由Vue開發(fā),后端框架選用Django。該架構(gòu)在后端中集成知識(shí)圖譜數(shù)據(jù)庫(Neo4j)和Mysql數(shù)據(jù)庫,基于Bert實(shí)體提取、AC狀態(tài)機(jī)及Seq2Seq文本生成等算法為一體,能夠?qū)崿F(xiàn)對(duì)用戶的輸入,即查詢語句,進(jìn)行相關(guān)測試用例的推薦與生成。系統(tǒng)整體方案如圖1所示。
圖1 系統(tǒng)方案結(jié)構(gòu)圖
本文將主要介紹有關(guān)知識(shí)圖譜及實(shí)體提取算法相關(guān)的部分。
典型測試用例是測試團(tuán)隊(duì)與開發(fā)團(tuán)隊(duì)在產(chǎn)品開發(fā)與測試時(shí),發(fā)現(xiàn)的在某一類產(chǎn)品中具有代表性的測試用例,通常由問題描述、原因分析及解決措施組成。該用例需要經(jīng)過公司內(nèi)部評(píng)審分析其關(guān)鍵程度與價(jià)值,判定它是否能夠?qū)ζ渌麥y試具有啟示意義等。因此典型測試用例具有深刻含義與推廣價(jià)值,需要仔細(xì)分析并結(jié)合用戶的輸入對(duì)其進(jìn)行推薦。
但作為測試用例推薦系統(tǒng),需要為每一個(gè)測試用例總結(jié)一句具有代表性的標(biāo)題,才能在推薦系統(tǒng)中進(jìn)行展示。目前,典型測試用例接近4 000條。為每一個(gè)測試用例進(jìn)行總結(jié)十分浪費(fèi)人力、物力。因此在這里,使用了百度公開的(文本生成)text-generation算法去生成測試用例的標(biāo)題。算法的輸入即測試用例的現(xiàn)象、原因及解決措施拼接后的字符串,輸出即可總結(jié)上述文本的語句。因?yàn)樯鲜鏊惴ㄊ鞘褂霉_訓(xùn)練集,所以輸出可能會(huì)出現(xiàn)錯(cuò)誤,甚至出現(xiàn)語句不通的情況,因此生成后還需要再經(jīng)過一遍篩選。但這種篩選效率很快,不需要關(guān)注內(nèi)容本身,只需要關(guān)注輸出標(biāo)題是否存在低級(jí)錯(cuò)誤。
知識(shí)圖譜(Knowledge Graph)是一種用于表示知識(shí)的語義網(wǎng)絡(luò)[1],它描述了事物之間的關(guān)系[2],通常是由一組實(shí)體和他們之間的關(guān)系來描述某個(gè)特定領(lǐng)域的知識(shí)[3]。結(jié)合本文的目的,系統(tǒng)中的知識(shí)圖譜由實(shí)體、屬性、概念、表述和關(guān)系組成。實(shí)體就是由測試用例標(biāo)題提取出能夠作為主語的詞語,在本系統(tǒng)中通常為設(shè)備名、軟件名等。在后續(xù)標(biāo)注訓(xùn)練樣本時(shí),實(shí)體類型大致可分為設(shè)備、軟件、時(shí)間、地點(diǎn)及單位等。概念即測試用例發(fā)現(xiàn)缺陷的嚴(yán)重等級(jí)等,一些可對(duì)測試用例進(jìn)行分類的名詞。表述即為測試用例發(fā)生時(shí)間等。關(guān)系則是實(shí)體與表述之間,實(shí)體與概念之間的關(guān)系,例如與表述(2023年2月10日)的關(guān)系則為發(fā)生時(shí)間,與概念之間的關(guān)系則為“是”,例如該測試用例的嚴(yán)重程度“是”一般。有了上述基本概念后即可在Neo4j中建立測試用例的完整知識(shí)圖譜。
知識(shí)圖譜通常有自底向上和自頂向下兩種構(gòu)建方法[4]。結(jié)合公司實(shí)際情況和現(xiàn)有數(shù)據(jù),采用自頂向下的方式,由測試團(tuán)隊(duì)與開發(fā)團(tuán)隊(duì)專家制定測試用例統(tǒng)計(jì)的維度。目前現(xiàn)有的測試用例數(shù)據(jù)集在統(tǒng)計(jì)時(shí)存在以下維度:測試方法、測試輸入類型、問題現(xiàn)象、原因分析、解決措施、問題嚴(yán)重等級(jí)、發(fā)生時(shí)間、問題引入階段、產(chǎn)品名稱、產(chǎn)品規(guī)模及運(yùn)行環(huán)境等。上述緯度同時(shí)也作為知識(shí)圖譜中用于匹配查找的關(guān)系,而使用該維度對(duì)應(yīng)的內(nèi)容則作為推薦的內(nèi)容。
最終將每一個(gè)測試用例按照上述維度形成excel后,使用pandas解析[5],并結(jié)合cypher語句,導(dǎo)入Neo4j數(shù)據(jù)庫中,以供后續(xù)對(duì)測試用例推薦進(jìn)行使用。導(dǎo)入后的局部知識(shí)圖譜如圖2所示。
圖2 測試用例的知識(shí)圖譜
導(dǎo)入至Neo4j的同時(shí),上述信息也會(huì)同步存儲(chǔ)至Mysql數(shù)據(jù)庫中。在Mysql中創(chuàng)建測試用例表。使用上述的標(biāo)題作為該測試用例的名稱。并使用測試方法,運(yùn)行環(huán)境等,可以對(duì)測試用例進(jìn)行明確分類的屬性作為測試用例表的外鍵。這樣,Mysql數(shù)據(jù)庫與Neo4j數(shù)據(jù)庫,都將同時(shí)保存著測試用例的詳細(xì)內(nèi)容。都可以用于推薦算法的數(shù)據(jù)來源。
傳統(tǒng)的Mysql推薦算法,本系統(tǒng)將采用兩種方法進(jìn)行案例推薦:1)使用標(biāo)簽及分類進(jìn)行推薦;2)基于Jieba分詞在數(shù)據(jù)庫中進(jìn)行匹配從而進(jìn)行推薦。
1)因?yàn)樵贛ysql表建立的過程中,已經(jīng)對(duì)目前數(shù)據(jù)庫中已有的測試用例進(jìn)行了分類,可以通過外鍵關(guān)聯(lián)的形式直接查詢。用戶可以根據(jù)真實(shí)場景中相關(guān)的分類,在數(shù)據(jù)庫中查看是否具有自己感興趣的測試用例。
2)根據(jù)用戶的輸入,使用Jieba分詞,對(duì)輸入進(jìn)行拆分。例如“大型運(yùn)輸機(jī)航電系統(tǒng)發(fā)生過什么缺陷?”上述語句在經(jīng)過分詞后,會(huì)得出以下內(nèi)容:“大型”“運(yùn)輸機(jī)”“航電系統(tǒng)”“發(fā)生”“過”“什么”“缺陷”。將上述分詞后的詞語,使用Mysql的like語句與測試用例的名稱進(jìn)行匹配。最后再統(tǒng)計(jì)數(shù)據(jù)庫中測試用例的名稱中包含上述詞語的個(gè)數(shù)。并按照數(shù)量由高至低返回推薦結(jié)果。上述方法匹配出的測試用例包含了用戶輸入的詞語,因此推薦的內(nèi)容肯定是用戶感興趣的內(nèi)容。但是該方法存在一個(gè)問題,因?yàn)椤鞍l(fā)生”“過”“缺陷”等詞語,會(huì)經(jīng)常出現(xiàn)在用戶的搜索以及測試用例名稱中。但該類詞語對(duì)推薦用戶感興趣的測試用例沒有實(shí)質(zhì)的用處,只是語句中需要該類詞語的出現(xiàn),才能形成一個(gè)正確的語句。因此由于該類詞語的存在,會(huì)對(duì)統(tǒng)計(jì)個(gè)數(shù)帶來較大的影響。為解決上述問題,在算法中會(huì)維護(hù)一個(gè)全局通用詞語字典,該字典會(huì)在系統(tǒng)運(yùn)行前進(jìn)行初始化,先使用jieba分詞對(duì)數(shù)據(jù)庫中測試用例名稱進(jìn)行一次分詞。統(tǒng)計(jì)詞語出現(xiàn)的個(gè)數(shù),并將排列靠前的詞語加入該字典樹中。后面針對(duì)用戶的輸入,分詞后會(huì)過濾包含于字典樹中的詞語。這樣,將只使用“大型”“運(yùn)輸機(jī)”“航電系統(tǒng)”等具有代表性的詞語進(jìn)行匹配,提高推薦結(jié)果的質(zhì)量。
基于Mysql的推薦算法只會(huì)在基于知識(shí)圖譜及實(shí)體提取算法推薦內(nèi)容較少或者沒有找到時(shí),才會(huì)去調(diào)用。這樣,即可保證該推薦系統(tǒng)在用戶輸入冷門語句或者系統(tǒng)不存在類似的測試用例時(shí)才會(huì)去調(diào)用。
Jieba分詞是基于字典匹配和規(guī)則處理的方式,在前綴詞字典中尋找匹配[6]。如果只使用Jieba分詞對(duì)輸入句子進(jìn)行處理,若前綴詞字典中無法找到明確語義的單詞,分詞效果很差,很多專有名詞或行業(yè)術(shù)語會(huì)無法識(shí)別。因此需要更智能的方法對(duì)測試用例進(jìn)行實(shí)體提取和處理,降低對(duì)固定單詞字典的依賴。
本文選用BERT模型對(duì)輸入語句進(jìn)行處理,并在其基礎(chǔ)上引入BiLSTM+CRF模塊,從而提高對(duì)專業(yè)領(lǐng)域單詞實(shí)體識(shí)別的準(zhǔn)確性。模型結(jié)構(gòu)如圖3所示。
圖3 模型簡圖
2.2.1 BERT
Bert是一個(gè)基于Transformer的語言模型,它能生成高質(zhì)量的詞向量特征[7]。相對(duì)于傳統(tǒng)單向編碼,Bert能利用語境信息進(jìn)行雙向編碼[8]。
Bert由多層Transformer的Encode模塊構(gòu)成堆疊而成[9]。Bert的嵌入層有多種信息,如Token嵌入層是單詞本身的詞向量層,該層將輸入語句向量化為固定維度的詞向量數(shù)據(jù),描述了語句中的單詞文本信息[10]。Segment嵌入層則是對(duì)不同輸入的Token進(jìn)行區(qū)分,Segment嵌入層的引入幫助Bert區(qū)分成對(duì)的輸入序列,此外還有Position嵌入層描述了單詞向量位置信息,通過對(duì)單詞進(jìn)行位置編碼,讓Bert模型能夠理解同一個(gè)輸入序列中的不同位置的相同單詞。
2.2.2 BiLSTM
利用BERT生成高質(zhì)量的詞向量表征后,然后引入BiLSTM+CRF實(shí)現(xiàn)實(shí)體提取。BiLSTM是一種雙向循環(huán)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),他利用LSTM對(duì)輸入序列進(jìn)行雙向編碼[11],從而識(shí)別和預(yù)測序列中的關(guān)鍵信息。對(duì)本文而言,其預(yù)測序列即利用BERT處理輸入語句后的向量序列。與傳統(tǒng)LSTM不同,BiLSTM具有雙向編碼能力,如輸入語句“這朵花開得很絢爛”,單詞“絢爛”修飾的是前文的實(shí)體“花”,傳統(tǒng)LSTM對(duì)語句建模時(shí)只能從前往后編碼建模,無法感知后面的信息對(duì)前文的影響。而BiLSTM則引入了雙向LSTM結(jié)構(gòu),它采用了前向和后向兩個(gè)LSTM網(wǎng)絡(luò),并且完全獨(dú)立,互相不連通[12]。每個(gè)網(wǎng)絡(luò)接收的輸入,不僅包含當(dāng)前時(shí)間步的輸入,還包含了另一個(gè)方向上的歷史信息,這樣,在每個(gè)時(shí)間步的輸出向量中,都包含了當(dāng)前狀態(tài)下前面和后面的上下文信息,進(jìn)一步加強(qiáng)了對(duì)序列的建模能力,BiLSTM對(duì)長輸入具有更好的魯棒性[13]。
2.2.3 CRF
在處理測試用例數(shù)據(jù)時(shí),發(fā)現(xiàn)很多特征實(shí)體具有強(qiáng)關(guān)聯(lián)性,比如某種器件的缺陷案例數(shù)據(jù)集中,“引腳”實(shí)體與“虛焊”“斷裂”“焊接工藝”等實(shí)體具有強(qiáng)關(guān)聯(lián)性,這是描述現(xiàn)象的測試用例數(shù)據(jù)集的固有特點(diǎn)。數(shù)據(jù)集中的各種實(shí)體語義互相之間有關(guān)聯(lián),特定對(duì)象的屬性特征雖然可能無法窮舉,但它與另一個(gè)不同對(duì)象的屬性特征一定有所差異,比如一種疾病實(shí)體的特征描述與另外一種疾病實(shí)體,甚至另一個(gè)類型的對(duì)象實(shí)體的特征描述,是一定有差異的。
為了更好地捕獲特征標(biāo)簽之間的相互依賴關(guān)系,本文結(jié)合CRF層與BiLSTM共同進(jìn)行實(shí)體識(shí)別。CRF是一種判別式模型,可以在給定輸入序列的情況下,找到最優(yōu)輸出標(biāo)簽序列,它通過添加約束條件保證預(yù)測標(biāo)簽的有效性[14]。CRF由兩部分組成:特征函數(shù)與權(quán)重,特征函數(shù)表示輸入序列與標(biāo)簽序列的局部特征,權(quán)重表示每個(gè)特征函數(shù)的重要性[14-15]。CRF的學(xué)習(xí)過程就是將訓(xùn)練數(shù)據(jù)中的特征函數(shù)權(quán)重進(jìn)行學(xué)習(xí),并最大化條件概率,尋找最優(yōu)輸出標(biāo)簽序列[16]。對(duì)某些復(fù)雜的句子結(jié)構(gòu)和數(shù)據(jù)集相似標(biāo)簽標(biāo)注有個(gè)別差異時(shí),CRF可以通過考慮相鄰單詞之間的關(guān)系,以及不同類別之間的轉(zhuǎn)移概率,使模型更加準(zhǔn)確和穩(wěn)健。
在BiLSTM中,針對(duì)每一個(gè)詞語,其輸出是獨(dú)立的,無法學(xué)習(xí)到輸出標(biāo)簽之間的關(guān)系,因此數(shù)據(jù)在經(jīng)過BiLSTM之后使用CRF去解決上述問題。CRF模型可以對(duì)隱含狀態(tài)進(jìn)行建模,學(xué)習(xí)到標(biāo)簽與標(biāo)簽之間的關(guān)系,進(jìn)一步提升模型預(yù)測的準(zhǔn)確性。
BiLSTM層輸出與之對(duì)應(yīng)的隱式狀態(tài)序列H={h1,h2,…,hn}。為了獲取全局最優(yōu)的標(biāo)簽序列,基于CRF層考慮標(biāo)簽之間的關(guān)系,保證預(yù)測標(biāo)簽的合理性。對(duì)于序列X=(x1,x2,…,xn),其輸出標(biāo)簽序列Y=(y1,y2,…,yn)。其計(jì)算分?jǐn)?shù)函數(shù)S(X,Y)的公式為:
(1)
式中,Ayi,yi+1表示由標(biāo)簽yi轉(zhuǎn)移到y(tǒng)i+1的概率,Pi,yi表示第i個(gè)詞預(yù)測為yi個(gè)標(biāo)簽的分?jǐn)?shù)。CRF層通過接受BiLSTM層的隱式狀態(tài)作為輸入,通過學(xué)習(xí)標(biāo)簽間的約束條件提升標(biāo)簽預(yù)測的準(zhǔn)確性,從而得到最終的預(yù)測標(biāo)簽。
2.2.4 訓(xùn)練集制作及遷移學(xué)習(xí)
搭建模型后需要制作訓(xùn)練集對(duì)模型進(jìn)行訓(xùn)練。訓(xùn)練集則使用了在知識(shí)圖譜準(zhǔn)備的過程中的數(shù)據(jù)。使用標(biāo)注工具、將現(xiàn)象、原因分析及解決措施的文本進(jìn)行標(biāo)注。本次標(biāo)注主要的關(guān)注內(nèi)容為:設(shè)備、軟件、發(fā)生時(shí)機(jī)、故障地點(diǎn)及問題類型等。但對(duì)于傳統(tǒng)NLP模型來說,由4 000條測試用例制作的訓(xùn)練集還是較少。并且4 000條數(shù)據(jù)中,只有3 000條數(shù)據(jù)用以訓(xùn)練,剩余1 000條數(shù)據(jù),還需要制作成測試集。如果僅僅使用該數(shù)據(jù)進(jìn)行訓(xùn)練,則模型會(huì)由于樣本規(guī)模太小導(dǎo)致訓(xùn)練效果差,提取的實(shí)體質(zhì)量低。因此針對(duì)訓(xùn)練集較少的情況,提前使用了谷歌官方已經(jīng)提供了BERT的中文預(yù)訓(xùn)練模型。并在此基礎(chǔ)模型上進(jìn)行遷移學(xué)習(xí),提升測試用例中實(shí)體提取的質(zhì)量。
在實(shí)體提取與知識(shí)圖譜都已經(jīng)構(gòu)建完畢后,可以基于上述內(nèi)容,在圖數(shù)據(jù)庫中進(jìn)行查找與反饋。整個(gè)推薦的流程如圖4所示。
圖4 推薦流程
Mysql的推薦算法在上述章節(jié)已經(jīng)介紹,因此只針對(duì)Bert實(shí)體提取即知識(shí)圖譜查找的流程進(jìn)行詳解。
1)初始化。將圖數(shù)據(jù)庫即測試用例名稱通過模型提取實(shí)體,并形成AC狀態(tài)機(jī),記錄所有實(shí)體經(jīng)過Bert層輸出的詞向量,存儲(chǔ)在內(nèi)存中,以便提升效率不再需要時(shí)進(jìn)行二次計(jì)算。
2)獲取用戶輸入后,使用基于Bert+BiLSTM+CRF的模型提取用戶輸入語句中的實(shí)體。
3)因?yàn)樘崛〕鰜淼膶?shí)體并不能與圖數(shù)據(jù)庫中的實(shí)體完全匹配,因此需要使用相似度計(jì)算,找到圖中最接近的實(shí)體。
4)由于知識(shí)圖譜是自頂向下構(gòu)建,所以實(shí)體與實(shí)體的關(guān)系都已經(jīng)確定。實(shí)體與關(guān)系的組合即組成查詢知識(shí)圖譜的Cypher語句。
最終執(zhí)行Cypher語句得出結(jié)果,如果沒有找到結(jié)果,則會(huì)依據(jù)Msql的推薦算法給出答案。
可以看出在使用算法提取實(shí)體后,最主要的難點(diǎn)在于相似度計(jì)算。系統(tǒng)中維護(hù)的實(shí)體數(shù)畢竟有限,但用戶的輸入?yún)s有無數(shù)種可能。因此為計(jì)算相似度,本系統(tǒng)綜合使用以下3種相似度查找策略,求取系統(tǒng)中最接近的實(shí)體。
1)AC狀態(tài)機(jī):相似問題,首先是解決字符串包含關(guān)系。例如系統(tǒng)中已經(jīng)存在“vxworks”實(shí)體,那么用戶在輸入“vxworks系統(tǒng)”后,能夠快速定位實(shí)體“vxworks”。目前字符串匹配算法中最為高效的是AC狀態(tài)機(jī)。該算法是一種只掃描一遍文本就能完成字符串匹配的算法。其核心內(nèi)容在于建立有效狀態(tài)轉(zhuǎn)移路線圖和失效狀態(tài)轉(zhuǎn)移路線圖,形成一個(gè)完整的狀態(tài)機(jī)[17]。
2)使用Bert計(jì)算詞向量的距離:算法模型在Bert層時(shí)輸出的是詞向量。為比較兩個(gè)詞語之間的相似度,便轉(zhuǎn)換為直接計(jì)算兩個(gè)詞向量之間的距離。而計(jì)算詞向量的距離有多種指標(biāo),最簡單的是計(jì)算歐式距離。本文選擇計(jì)算余弦距離,其公式如下:
(2)
3)同義詞管理:該系統(tǒng)作為管理系統(tǒng),后臺(tái)使用了圖數(shù)據(jù)庫數(shù)據(jù)和Mysql數(shù)據(jù)庫進(jìn)行管理,所以可以人為地對(duì)一些常見或者與業(yè)務(wù)關(guān)系較大的同義詞進(jìn)行管理。同時(shí)用戶在系統(tǒng)進(jìn)行搜索時(shí),都會(huì)留下記錄,以便后續(xù)管理員可以定時(shí)人為地分析該系統(tǒng)面向?qū)ο蟮男枨簏c(diǎn),從而完善系統(tǒng)的推薦功能。
典型測試用例需要不斷地累積與更新。作為開放式的推薦系統(tǒng),系統(tǒng)提供新增或編輯測試用例的功能,用戶可以新增測試用例、用例分類、用例詳細(xì)內(nèi)容、用例中實(shí)體間的語義關(guān)系等。在用戶使用的同時(shí)會(huì)記錄用戶輸入的搜索問題,按照一定的更新周期,將記錄中的問題及新增的測試用例制作成訓(xùn)練集,不斷地對(duì)模型進(jìn)行訓(xùn)練。
同時(shí)對(duì)典型測試用例引入“用例版本管理”功能,記錄測試用例每個(gè)版本的更改人、更改內(nèi)容的操作記錄。管理員可選擇某個(gè)版本作為測試用例當(dāng)前展示的內(nèi)容,或者刪除某一個(gè)版本甚至整個(gè)已經(jīng)過時(shí)的測試用例。
上述章節(jié)簡要介紹了基于Bert模型完成實(shí)體提取任務(wù)。而用例期望結(jié)果生成則參考了百度飛漿的Couplet案例。Couplet本身任務(wù)是完成自動(dòng)對(duì)聯(lián)。通過上聯(lián)自動(dòng)對(duì)出下聯(lián)的行為與通過用例輸入得到期望結(jié)果的意義極為相同。該案例使用了Seq2Seq模型,即編碼器-解碼器(Encoder-Decoder)結(jié)構(gòu),用編碼器將源序列編碼成vector,再用解碼器將該vector解碼為目標(biāo)序列。在編碼器方面,模型采用了基于LSTM的多層的RNN encoder。在解碼器方面,模型使用了帶注意力(Attention)機(jī)制的RNN decoder,在預(yù)測時(shí)使用Beam Search算法來生成結(jié)果。因此該模型與算法可以完美實(shí)現(xiàn)用例期望結(jié)果的自動(dòng)生成任務(wù)。
模型雖然是使用了成熟的Seq2Seq模型,但還需要根據(jù)真實(shí)使用場景去構(gòu)建相對(duì)應(yīng)的訓(xùn)練集。目前公司已經(jīng)有接近10年的真實(shí)測試用例數(shù)據(jù),該數(shù)據(jù)是以表格形式存儲(chǔ)在Word中,因此需要將Word中的相關(guān)內(nèi)容提取出來制作為訓(xùn)練集。提取Word表格則使用了Python-docx庫,通過該庫遍歷文檔中的表格,可以提取出表格中的輸入與期望結(jié)果,從而形成訓(xùn)練集與測試集用于模型訓(xùn)練。
因?yàn)橛美谕Y(jié)果生成是采用成熟模型,本系統(tǒng)只是制作了自己的訓(xùn)練集用于訓(xùn)練,因此實(shí)驗(yàn)章節(jié)不對(duì)該內(nèi)容進(jìn)行實(shí)驗(yàn)與分析。
而為了驗(yàn)證本文推薦算法中實(shí)體提取的模型與傳統(tǒng)Bert,BiLSTM,CRF模型對(duì)測試用例中實(shí)體提取的準(zhǔn)確性及有效性。使用測試集分別對(duì)4個(gè)模型進(jìn)行對(duì)比。并以準(zhǔn)確率P,召回率R,F(xiàn)1值作為評(píng)判標(biāo)準(zhǔn)。各個(gè)評(píng)價(jià)指標(biāo)的計(jì)算方式如下:
(3)
(4)
(5)
式中,a為識(shí)別正確的實(shí)體數(shù),A為總實(shí)體個(gè)數(shù),B為識(shí)別出的實(shí)體數(shù)。
測試集由針對(duì)測試用例進(jìn)行標(biāo)注之后的語料組成,如圖5所示。本文選用BIO標(biāo)注體系,例如RTU軟件。“R”為“B-SOFTWARE”,代表軟件標(biāo)簽的開始,其他字符則為“I-SOFTWARE”,代表剩余軟件標(biāo)簽。
圖5 典型測試用例語料標(biāo)注
采用上述語料制作的測試集,并使用算法對(duì)測試集進(jìn)行提取,使用準(zhǔn)確率、召回率、F1值作為評(píng)價(jià)標(biāo)準(zhǔn),最終得出實(shí)驗(yàn)數(shù)據(jù)如表1所示。
表1 多模型的實(shí)驗(yàn)結(jié)果對(duì) %
通過上述實(shí)驗(yàn)結(jié)果表明,單純使用BiLSTM及CRF都明顯低于Bert模型??梢夿ert模型在自然語言處理任務(wù)中的能力明顯高于傳統(tǒng)模型。但將上述3個(gè)模型進(jìn)行整合后,測試用例實(shí)體識(shí)別的準(zhǔn)確率及其他各項(xiàng)指標(biāo)均再度提高。其主要原因在于使用BiLSTM與CRF后能夠充分利用語句相鄰標(biāo)簽之間的關(guān)聯(lián)性,從而獲取全局最優(yōu)的標(biāo)簽序列,從而改善實(shí)體識(shí)別的性能。
算法驗(yàn)證后經(jīng)過部署,系統(tǒng)在公司內(nèi)部上線試運(yùn)行。例如用戶輸入問題“組幀通道出現(xiàn)過什么問題”。經(jīng)過本文算法提取出“組幀通道”作為設(shè)備實(shí)體。再遍歷系統(tǒng)中自頂向下構(gòu)建的關(guān)系,在遍歷至“問題現(xiàn)象”關(guān)系時(shí),形成查詢知識(shí)圖譜的Cpyher語句“match (node)-[relation]-(answer)where node.name = ‘組幀通道’and where relation.name = ‘問題現(xiàn)象’ return answer”,最終通過該語句在知識(shí)圖譜數(shù)據(jù)庫中進(jìn)行查找,當(dāng)answer為非空時(shí)即得出推薦內(nèi)容。最后經(jīng)過前端界面的渲染得出的效果如圖6所示。
圖6 推薦結(jié)果展示
期望結(jié)果生成是用戶上傳已經(jīng)寫好的測試用例步驟說明,系統(tǒng)自動(dòng)生成期望結(jié)果。如表2所示。
表2 期望結(jié)果生成實(shí)例
本文搭建的智能測試用例推薦與期望結(jié)果生成系統(tǒng),是在Bert+BiLSTM+CRF的實(shí)體提取模型與Seq2Seq模型和多模態(tài)的知識(shí)圖譜的基礎(chǔ)上于后臺(tái)集成。該系統(tǒng)對(duì)傳統(tǒng)的測試管理系統(tǒng)進(jìn)行提升,使得公司能夠基于自己的業(yè)務(wù)積累,搭建并管理具有自身專業(yè)領(lǐng)域的典型測試用例,從而幫助、發(fā)現(xiàn)并解決未來可能出現(xiàn)的問題,為質(zhì)量改進(jìn)提供參考和依據(jù)。同時(shí)該系統(tǒng)也實(shí)現(xiàn)了測試用例期望結(jié)果的自動(dòng)生成,提升了測試人員在文檔編寫與用例設(shè)計(jì)的效率,使得用戶關(guān)注用例質(zhì)量本身或者關(guān)鍵步驟,而非其他形式上的內(nèi)容。