專利名稱:一種基于Agent的碼垛機(jī)器人控制軟件測試方法
技術(shù)領(lǐng)域:
發(fā)明涉及一種碼垛機(jī)器人軟件測試方法,特別地涉及一種基于Agent的碼垛機(jī)器 人控制軟件測試方法。
背景技術(shù):
近年來,隨著生產(chǎn)生活節(jié)奏的加快,自動化技術(shù)呈現(xiàn)加速發(fā)展的趨勢,自動化倉庫 和自動化柔性生產(chǎn)線進(jìn)入發(fā)展和普及階段。碼垛機(jī)器人以其在機(jī)械結(jié)構(gòu)、適用范圍、設(shè)備占 地空間、靈活性、成本以及維護(hù)等方面的優(yōu)勢使其應(yīng)用漸為廣泛,并成為一種趨勢。碼垛機(jī)器人系統(tǒng)一般有如下要求控制系統(tǒng)主機(jī)為嵌入式微處理器;采用交流伺 服控制技術(shù),能按預(yù)定軌跡,平穩(wěn)運(yùn)行,低能耗;控制系統(tǒng)具備自動、手動工作模式;系統(tǒng)人 機(jī)接口為具備點(diǎn)動、示教功能;提供參數(shù)設(shè)置和狀態(tài)監(jiān)控操作終端;控制系統(tǒng)具備外部接 口,可實(shí)現(xiàn)與外圍設(shè)備的聯(lián)動及安全保護(hù)功能;系統(tǒng)可預(yù)存5組參數(shù);具備過載保護(hù)、超程 保護(hù)、超速保護(hù)及應(yīng)急停機(jī)等安全保護(hù)功能。軟件測試是保證軟件系統(tǒng)正確性的一個(gè)重要手段,也是計(jì)算機(jī)軟件工程方法和技 術(shù)的一個(gè)主要 組成部分。雖然測試并不能證明軟件系統(tǒng)的正確性,但是,它通過運(yùn)行選定的 測試用例來發(fā)現(xiàn)軟件中的錯(cuò)誤,并通過糾正錯(cuò)誤使軟件的質(zhì)量達(dá)到令人以滿意的程度。所 以,在今后相當(dāng)長的時(shí)間內(nèi)測試仍是保證軟件質(zhì)量的主要手段。隨著各種測試技術(shù)的深入研究與發(fā)展,一些專門的嵌入式軟件測試工具也應(yīng)運(yùn)而 生,比較有代表性的有英國IPL公司提供的一種強(qiáng)大的測試工具Cantata,它的靜態(tài)分析 部分Static Analysis可完成一般的靜態(tài)測試。Cantata檢查代碼標(biāo)準(zhǔn),測量并檢查代碼復(fù) 雜性,確定軟件的可維護(hù)性和標(biāo)準(zhǔn)。英國LDRA公司的靜態(tài)測試工具Testbed,可用于完成靜 態(tài)分析功能,包括編程規(guī)則檢查、軟件度量分析、靜態(tài)數(shù)據(jù)流分析、交叉索引分析等等,并能 對源代碼進(jìn)行插樁。但是,這些已有的軟件測試工具或方法中,一般仍然或多或少存在以下不足(1)對軟件可靠性評價(jià)只是一個(gè)整體的概念,預(yù)測軟件缺陷的個(gè)數(shù),但不能具體指 出缺陷存在的位置;(2)對隱含的代碼錯(cuò)誤測試效果不好,如果再次測試將花費(fèi)大量的人力物力;(3)人為參與的步驟太多,使用起來很不方便;(4)沒有進(jìn)行系統(tǒng)的黑盒與白盒測試,不能全面的反映軟件的質(zhì)量。(5)大部分測試軟件價(jià)格昂貴,很難大規(guī)模普及。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是針對目前流行的碼垛機(jī)器人軟件控制系統(tǒng),如何在減 少人為參與和降低費(fèi)用的情況下,對其進(jìn)行全面且快速有效的測試。為了解決上述問題,本發(fā)明提供了一種基于Agent的碼垛機(jī)器人控制軟件測試方 法,包括以下步驟
(1)建立基于Agent的BDI模型TC_Agent,生成測試所需的黑盒測試用例;(2) 利用黑盒測試Agent判斷系統(tǒng)功能的實(shí)現(xiàn)情況;(3)建立基于遺傳算法的覆蓋測試用例生成模型GA_Agent,通過設(shè)計(jì)編碼、適應(yīng) 度函數(shù)、選擇、交叉、變異等一系列遺傳操作,實(shí)現(xiàn)覆蓋測試用例的自動生成;(4)建立白盒測試Agent模型,通過預(yù)處理Agent、程序插樁Agent完成對程序的 插樁操作,將插樁后的程序編譯運(yùn)行后送往目標(biāo)機(jī),并輸入GA_Agent生成的測試用例,利 用覆蓋率分析Agent得出碼垛機(jī)器人程序的語句與分支覆蓋率。進(jìn)一步地,所述步驟(1)中,將BDI之間的約束關(guān)系應(yīng)用到測試用例生成過程中, 建立了基于BDI的黑盒測試用例生成模型TC_Agent,B、D、I分別表示TC_Agent所有可能 的信念、愿望和意圖的集合。其中B包括設(shè)計(jì)測試用例基本原則與待測模塊中功能規(guī)格說 明的集合;D包括測試用例中所有合理與不合理輸入及對應(yīng)輸出的集合;I表示測試用例執(zhí) 行后,對程序運(yùn)行結(jié)果正確與否的判斷。進(jìn)一步地,所述步驟(2)可描述為將TC_Agent生成的測試用例送往碼垛機(jī)器人系 統(tǒng)并接收其輸出,對輸出信號進(jìn)行分析和處理,從而判斷系統(tǒng)功能的實(shí)現(xiàn)情況。進(jìn)一步地,所述步驟(3)進(jìn)一步包括3. 1)確定編碼方式及種群規(guī)模,隨機(jī)生成初始參數(shù)種群;3. 2)按照參數(shù)的編碼要求對個(gè)體進(jìn)行解碼,從而得到各個(gè)參數(shù)的實(shí)際值;3. 3)以當(dāng)前種群的實(shí)際參數(shù)值為輸入,調(diào)用插樁后的被測程序,得到所有個(gè)體的 目標(biāo)函數(shù)值并返回給遺傳算法模塊;3. 4)對所有個(gè)體目標(biāo)函數(shù)值進(jìn)行評價(jià),若適應(yīng)度不滿足要求,則進(jìn)行相應(yīng)的選擇、 交叉、變異操作,從而形成一個(gè)新的種群;3. 5)對步驟(2)至步驟(4)進(jìn)行往復(fù)操作,直至找到覆蓋選定路徑的目標(biāo)參數(shù)值 或達(dá)到預(yù)定的最大迭代數(shù)。進(jìn)一步地,所述步驟(4)進(jìn)一步包括4. 1)預(yù)處理Agent,通過詞法、語法分析得到源程序的語法信息;4. 2)程序插樁Agent,通過對語法信息進(jìn)行分析,找出程序的所有插樁點(diǎn),并自動 插入探針函數(shù);4. 3)將插樁后的程序編譯并運(yùn)行,同時(shí)輸入GA_Agent生成的測試用例;4. 4)覆蓋率分析Agent,分別用語句、分支覆蓋率算法計(jì)算源程序的語句覆蓋率 和分支覆蓋率。與現(xiàn)有技術(shù)相比,本發(fā)明提出的基于Agent的碼垛機(jī)器人控制軟件測試方法有如 下顯著優(yōu)點(diǎn)(1)實(shí)現(xiàn)對嵌入式軟件的功能測試,通過將黑盒測試用例輸入至嵌入式軟件平臺, 觀察系統(tǒng)運(yùn)行,從而檢測軟件能否實(shí)現(xiàn)預(yù)期的功能要求;(2)實(shí)現(xiàn)對嵌入式軟件的白盒覆蓋測試,首先進(jìn)行預(yù)處理過程,得到程序結(jié)構(gòu)的語 法信息,然后往程序中插入一些能夠記錄程序信息的探針函數(shù),最后將插樁后的程序編譯 并移植到目標(biāo)機(jī)運(yùn)行,通過相關(guān)算法來計(jì)算程序的語句覆蓋率和分支覆蓋率,同時(shí)還能查 詢未覆蓋目標(biāo);(3)建立了基于BDI的生成黑盒測試用例模型,通過對信念、愿望、意圖三者約束關(guān)系的建模及具體實(shí)現(xiàn)算法的設(shè)計(jì),實(shí)現(xiàn)了黑盒測試用例的自動生成;(4)建立了遺傳算法生成覆蓋測試用例的模型,通過對編碼、適應(yīng)度函數(shù)、選擇算 子、交叉算子、變異算子的設(shè)計(jì),實(shí)現(xiàn)了覆蓋測試用例的自動生成。
圖1為本發(fā)明的體系結(jié)構(gòu)圖。圖2為GA_Agent的實(shí)現(xiàn)流程。圖3為白盒測試Agent的實(shí)現(xiàn)流程。
具體實(shí)施例方式本發(fā)明的核心思想是將Agent的概念運(yùn)用到測試過程中,利用Agent的自治特 性,在沒有其它Agent或測試者的直接命令和干預(yù)下進(jìn)行獨(dú)立的判斷,利用Agent的智能特 性理解測試者的測試目標(biāo),利用Agent的社交能力與其它的Agent進(jìn)行通信。并將碼垛機(jī) 器人軟件測試系統(tǒng)分為黑盒測試Agent、白盒測試Agent、測試用例生成Agent (TC_Agent與 GA_Agent)三個(gè)Agent模塊。下面結(jié)合附圖1對本發(fā)明的工作流程及各步驟功能進(jìn)行詳細(xì) 說明。1.建立基于Agent的BDI模型TC_Agent,生成測試所需的黑盒測試用例。本發(fā)明將BDI之間的約束關(guān)系應(yīng)用到測試用例生成過程中,建立了基于BDI的黑 盒測試用例生成模型TC_Agent,其中,B、D、I分別表示TC_Agent所有可能的信念、愿望和 意圖的集合。下面對各組成部分進(jìn)行詳細(xì)描述(1)信念(B)B 是 TC_Agent 的 BDI 模型中一組 Belief 的集合,即 BEL(TC_Agent,B)。我們將其定義為B = <BP, Bf>。其中,Bp是設(shè)計(jì)測試用例基本原則的集合,如果以《P表示謂詞說明,則 V<p e ^ => BEL(TC _ Agent, φ);Bf是待測模塊中功能規(guī)格說明的集合,如果以φ表示謂詞說明,則 V<p e => BEL{TC _ Agent,φ)。(2)愿望(D)D 是 TC_Agent 的 BDI 模型中一組 Desire 的集合,即 DES (TC_Agent, D)。我們將其定義為D = <Dei, Deo, Dwi,Dwq,D0>[60]o其中,Dei為所有測試用例中合理 輸入的集合;Dto為所有測試用例中與合理輸入相對應(yīng)的預(yù)期輸出的集合;Dwi為所有測試用 例中不合理輸入的集合;DW0為所有測試用例中與不合理輸入相對應(yīng)的預(yù)期輸出的集合;Dm 為任意測試用例輸入對應(yīng)的不合理輸出的集合。(3)意圖(I)I 是 TC_Agent 的 BDI 模型中一組 Intention 的集合,即 INT (TC_Agent,I)。在這 里,I表示測試用例執(zhí)行后,對程序運(yùn)行結(jié)果正確與否的判斷。我們將其定義為I = <IC, Iw>。其中,I。表示測試用例執(zhí)行后,得到的輸出結(jié)果與預(yù)期結(jié)果相同;Iw表示測試用例執(zhí)行后,得到的輸出結(jié)果與預(yù)期結(jié)果不同,即程序需要修改。
其中,執(zhí)行的測試用例包括合理的輸入和不合理的輸入。TC_Agent生成測試用例的具體步驟如下 第一步初始化操作。將TC_Agent模型中的B、I置初始狀態(tài),形成TC_Agent關(guān) 于當(dāng)前環(huán)境的初始信念和意圖。信念取決于設(shè)計(jì)測試用例的基本原則和程序的功能規(guī)格說 明,意圖則表示為對程序運(yùn)行后結(jié)果正確與否的判斷。信念B的設(shè)計(jì)。首先,Bf的設(shè)計(jì)。程序的功能規(guī)格說明要非常詳細(xì),即要細(xì)化到每個(gè)功能模塊的不 可再分的功能點(diǎn),TC_Agent需掌握這些功能點(diǎn)作為自己信念的組成部分,即BF。其次,Bp的設(shè)計(jì)。根據(jù)黑盒測試用例的基本設(shè)計(jì)原則,本文對Bp設(shè)計(jì)主要從等價(jià) 類劃分法、邊界值分析法和錯(cuò)誤推測法三個(gè)角度來進(jìn)行。第二步獲取外界信息,通過感知外界輸入來修正已有的信念。進(jìn)行功能測試之前,TC_Agent應(yīng)獲取最新的功能規(guī)格說明,通過修正函數(shù),使 能 夠與當(dāng)前最新功能說明相對應(yīng)。其中修正函數(shù)表示為Ψ (BEL) XP — Ψ (BEL),P表示感知到的外界輸入。第三步生成TC_Agent可能的愿望。根據(jù)Stepl中信念、意圖的初始化及St印2 中修正后的信念,通過愿望生成函數(shù)DGF,生成TC_Agent模型中的DKI、Deo, Dwi、Dwq、Daq。其中,愿望生成函數(shù)DGF Ψ (BEL) X Ψ (INT) — Ψ (DES)。第四步TC_Agent根據(jù)St印3中生成的Dki、Deo, Dwi、Dwo, DAQ,得出程序是否正確運(yùn) 行的結(jié)果I,作為最終完整的測試用例。2.利用黑盒測試Agent判斷系統(tǒng)功能的實(shí)現(xiàn)情況。黑盒測試Agent允許用戶通過輸入測試用例來完成對目標(biāo)系統(tǒng)的功能測試,主要 是通過以下步驟來進(jìn)行(1)將TC_Agent生成的測試用例以串口通信的方式輸送到碼垛機(jī)器人控制系統(tǒng), 并運(yùn)行碼垛機(jī)器人控制程序;(2)接收輸入測試用例后碼垛機(jī)器人的相應(yīng)輸出信息;(3)對輸出信息進(jìn)行分析和處理,從而判斷目標(biāo)系統(tǒng)是否實(shí)現(xiàn)測試用例要求的功 能。3.建立基于遺傳算法的覆蓋測試用例生成模型GA_Agent,通過設(shè)計(jì)編碼、適應(yīng)度 函數(shù)、選擇、交叉、變異等一系列遺傳操作,實(shí)現(xiàn)覆蓋測試用例的自動生成。下面結(jié)合附圖2 對GA_Agent的實(shí)現(xiàn)流程進(jìn)行詳細(xì)說明。(1)參數(shù)編、解碼及種群初始化GA_Agent采用二進(jìn)制編碼方式對輸入?yún)?shù)進(jìn)行編碼,針對程序單元的結(jié)構(gòu)測試, 被測程序中影響執(zhí)行路徑的參數(shù)個(gè)數(shù)是不定的,類型也是不一致的,另外,遺傳算法中的相 關(guān)遺傳操作均工作在參數(shù)的編碼上,因此,參數(shù)的編碼是遺傳算法首先要解決的問題,下面 將分幾個(gè)方面來討論1)不同參數(shù)的編碼。a)單元的入口參數(shù)如果指定路徑的條件表達(dá)式中包含此變量,則對其進(jìn)行編 碼,否則不編碼;b)單元的出口參數(shù)因?yàn)槠洳⒉挥绊懰鶊?zhí)行的路徑,因此不對其進(jìn)行編碼;c)全局變量僅對指定路徑的條件表達(dá)式中包含的全局變量進(jìn)行編碼;
d)局部變量僅對指定路徑的條件表達(dá)式中包含的局部變量進(jìn)行編碼;2)編碼長度的選取采用二進(jìn)制編碼,就是 將某個(gè)變量值代表的個(gè)體表示為一個(gè){0,1} 二進(jìn)制串,串 長取決于求解的精度。3)多參數(shù)編碼的方法對于程序中的一個(gè)變量可以選取為串長一定的{0,1} 二進(jìn)制串,但程序單元中的 變量往往會多于一個(gè),在對多個(gè)參數(shù)進(jìn)行編碼時(shí),考慮到進(jìn)化計(jì)算中的個(gè)體都只有一條染 色體串,因此本文采用“多參數(shù)級聯(lián)編碼”的方案,即將每個(gè)變量的的編碼按順序級聯(lián),組成 一條新的二進(jìn)制串。4)不同數(shù)據(jù)類型參數(shù)的編碼a)整型變量編碼時(shí)不作修改,在解碼時(shí)進(jìn)行取整運(yùn)算;b)字符型變量由于C語言在存儲字符型數(shù)據(jù)時(shí)實(shí)際存儲的是其ASCII碼的碼 值,因此,本文采用相應(yīng)的ASCII碼的碼值代替字符型變量進(jìn)行編碼;c)數(shù)組型變量將每一個(gè)數(shù)組元素都作為一個(gè)參數(shù)進(jìn)行編碼;d)結(jié)構(gòu)體變量將結(jié)構(gòu)體中每個(gè)變量均作為一個(gè)參數(shù)進(jìn)行編碼;e)指針變量指針變量的處理有一定難度,需在編碼之前借助靜態(tài)分析工具,對 其指向的變量進(jìn)行編碼;f)布爾型變量將其當(dāng)作取值區(qū)間為
的整形變量進(jìn)行編碼;GA_Agent中初始種群為隨機(jī)生成,即種群中所有個(gè)體二進(jìn)制編碼串的每一位均為 隨機(jī)生成;對于種群規(guī)模的設(shè)置則從種群多樣性和算法效能兩個(gè)角度考慮。(2)插樁函數(shù)及適應(yīng)度函數(shù)的構(gòu)造GA_Agent模型中,需在指定路徑上生成測試用例,我們的目標(biāo)是引導(dǎo)算法最終找 到覆蓋指定路徑的測試數(shù)據(jù),因此,每個(gè)個(gè)體的優(yōu)劣應(yīng)該體現(xiàn)在它滿足該路徑條件表達(dá)式 的程度。通常情況下,程序的分支一般都出現(xiàn)在選擇和循環(huán)結(jié)構(gòu)的判斷語句中,因此,每一 個(gè)分支都可由一個(gè)分支謂詞來表示,常見的分支謂詞有“>,<,> =,< =,=,!=,,。本 文中GA_Agent采用的適應(yīng)度函數(shù)是在Korel的分支函數(shù)概念的基礎(chǔ)上來構(gòu)造的,對六種分 支謂詞的構(gòu)造方法為El > E2 :f (η) = Ε1—Ε2,當(dāng) f(n) < 0 時(shí),f(n) = 0 ;El < E2 :f (η) = Ε2—Ε1,當(dāng) f(n) < 0 時(shí),f(n) = 0 ;El >= E2 :f (η) = Ε1—Ε2,當(dāng) f(n) < 0 時(shí),f(n) = 0 ;El <= E2 :f (η) = E2—E1,當(dāng) f(n) < 0 時(shí),f(n) = 0 ;El = E2 :f(n) = |E1_E2| ;El! = E2 :f(n) = |E1-E2|+K1,當(dāng) f(n)乒 K 時(shí),f(n) = 0,(K > 0)對于分支插樁函數(shù)f (η),當(dāng)分支謂詞為真時(shí),分支插樁函數(shù)f (η)取0 ;當(dāng)分支謂詞 為假時(shí),分支插樁函數(shù)f (η) >0。以如上所述的分支插樁函數(shù)為基礎(chǔ),在所選定的路徑上各分支點(diǎn)前插入相應(yīng)的插 樁函數(shù)f (1),f (2)…,f (η),使這些插樁函數(shù)為0,既可以覆蓋該選定的路徑。由插樁函數(shù)疊 力口,從而形成最終的適應(yīng)度函數(shù),即F = f (1) +f⑵+"'+f (η)。另外由于遺傳算法中適應(yīng)度函數(shù)一般取正值且最好搜索其最大值,因此本文對此適應(yīng)度函數(shù)做冪指數(shù)變化,最終的適 應(yīng)度函數(shù)為F = exp(X-/(0)f(i)為指定路徑上的分支插樁函數(shù)
1(3)遺傳算子的設(shè)計(jì)1)選擇算子GA_Agent選用的選擇算子采用按適應(yīng)度比例分配的方法來進(jìn)行,即根據(jù)種群中個(gè) 體的相對適應(yīng)度來決定個(gè)體被遺傳到下一代的概率,其中相對適應(yīng)度為個(gè)體適應(yīng)度占總適 應(yīng)度的比值。比例選擇的具體算法實(shí)現(xiàn)步驟為
1. 1)由適應(yīng)度函數(shù)計(jì)算每個(gè)個(gè)體的適應(yīng)度值f (Xi);1.2)累加所有個(gè)體的適應(yīng)度值,得最終累加值SUM= Σ f (Xi),累加過程中記錄下 對應(yīng)于每個(gè)個(gè)體的中間累加值Si ;1. 3)產(chǎn)生一個(gè)隨機(jī)數(shù)N,N的取值范圍為(0,SUM);1.4)判斷N所在所有個(gè)體累加值的位置,即如果Si <N< Si+1,則第i+1個(gè)個(gè)體被 選中;1. 5)重復(fù)1. 3) ,1.4),直至選出的個(gè)體數(shù)目滿足要求為止。2)交叉算子GA_Agent采用的交叉算子為多點(diǎn)交叉。最主要的問題是交叉點(diǎn)的位置。由于交叉 點(diǎn)是隨機(jī)確定的,如果這些交叉點(diǎn)在整個(gè)位串上分布不均勻,特別是當(dāng)交叉點(diǎn)過分集中于 某一個(gè)或少數(shù)幾個(gè)參數(shù)的位串上時(shí),交叉操作對位串結(jié)構(gòu)的改變將僅限于局部位串。為解決上述問題,GA_Agent在實(shí)現(xiàn)多點(diǎn)交叉時(shí),有意識地將交叉點(diǎn)均勻地落在每 個(gè)參數(shù)的位串上,從而保證每個(gè)參數(shù)的位串上均實(shí)現(xiàn)單點(diǎn)交叉。GA_Agent中多點(diǎn)交叉的具體算法實(shí)現(xiàn)步驟為2. 1)對種群中個(gè)體依適應(yīng)度值大小進(jìn)行排序,選出適應(yīng)度值較小的M-2個(gè)個(gè)體, 其中M表示種群規(guī)模;2. 2)對選出的M-2個(gè)個(gè)體進(jìn)行兩兩配對,這樣做的目的是保護(hù)當(dāng)前種群中最優(yōu)的 2個(gè)個(gè)體,保證其在本次遺傳過程中不會退化;2. 3)依照個(gè)體中參數(shù)的個(gè)數(shù)確定交叉點(diǎn)的個(gè)數(shù),這里將兩者數(shù)目設(shè)置為相同;2. 4)首先在個(gè)體第一個(gè)參數(shù)的位串長度范圍內(nèi)隨機(jī)設(shè)定一個(gè)點(diǎn)作為交叉點(diǎn),然后 依次將交叉點(diǎn)的位置加上參數(shù)位串長度,新位置作為下一參數(shù)的交叉點(diǎn),以此類推;2. 5)對相互配對的個(gè)體,依設(shè)定的交叉概率相互交換個(gè)體中每個(gè)參數(shù)交叉點(diǎn)后的 染色體基因,從而生成兩個(gè)新的個(gè)體。3)變異算子GA_Agent選用的變異算子為基本位變異,即以變異概率隨機(jī)指定個(gè)體編碼串的 某一位或某幾位為變異位,并對其作變異運(yùn)算,其中變異概率一般都設(shè)為很小的值,通常在 0. 001-0. 01之間??紤]到變異算子優(yōu)越的局部搜索能力,本文將其應(yīng)用到從逼近目標(biāo)值到 最終找到目標(biāo)值的過程,具體做法是通過有意識地控制變異的位置,是參數(shù)位串的末幾位 發(fā)生變異,這相當(dāng)于給參數(shù)的值增加或減少了一個(gè)很小的步長,從而可能以較小的代價(jià)找到參數(shù)的目標(biāo)值?;疚蛔儺惥唧w的算法實(shí)現(xiàn)步驟為
3. 1)對種群中所有個(gè)體編碼串中每一個(gè)參數(shù)的末幾位基因座,依變異概率判斷其 是否為變異點(diǎn);3. 2)對每一個(gè)指定的變異點(diǎn),對其基因值作取反運(yùn)算。4.建立白盒測試Agent模型,通過預(yù)處理Agent、程序插樁Agent完成對程序的插 樁操作,將插樁后的程序編譯運(yùn)行后送往目標(biāo)機(jī),并輸入GA_Agent生成的測試用例,利用 覆蓋率分析Agent得出碼垛機(jī)器人程序的語句與分支覆蓋率。下面結(jié)合附圖3對百合測試 Agent進(jìn)行詳細(xì)說明。(1)預(yù)處理 Agent預(yù)處理Agent主要包括詞法分析Agent和語法分析Agent,用來生成源程序的語法 信息。首先,對于源程序中的空白符、跳格符、回車符、換行符和注釋等程序的非必要組成部 分,預(yù)處理時(shí)可將其剔掉;詞法分析Agent是采用詞法分析工具Lex將被測程序分解成單獨(dú) 的詞的表示,形成初步的符號表,并將結(jié)果傳遞給語法分析Agent ;語法分析Agent則通過 接收詞法分析的結(jié)果,采用Yacc將輸入字符串識別為單詞符號流,找出變量聲明語句,并 相應(yīng)分離出指針變量和數(shù)組變量,其結(jié)果是生成語法信息,每一個(gè)語法規(guī)則對應(yīng)一個(gè)相應(yīng) 的處理函數(shù),并作為語法信息的重要結(jié)點(diǎn)與對外的接口。1)詞法分析 Agent本發(fā)明詞法分析Agent主要借助詞法分析工具Lex實(shí)現(xiàn),Lex是一種詞法分析程 序的生成程序,專門用于對字符輸入流進(jìn)行詞法分析處理,它可以使用一系列對符號表內(nèi) 容的描述,產(chǎn)生一個(gè)能識別這些符號的C例程(也稱為詞法分析器或詞法分析程序),而且 可以將這些描述轉(zhuǎn)變?yōu)樵~法分析程序能夠掃描輸入文本的形式。2)語法分析 Agent本發(fā)明語法分析Agent采用語法分析工具Yacc來實(shí)現(xiàn),它主要采用簡明的語法來 描述并產(chǎn)生一個(gè)能分析語法的C例程,即語法分析程序,使用之前可以先指定所需要的輸 入格式規(guī)則以及語法分析程序在識別相關(guān)結(jié)構(gòu)時(shí)所需要執(zhí)行的代碼,之后Yacc即可將這 些規(guī)則及執(zhí)行代碼轉(zhuǎn)換為用來處理輸入的子程序。本發(fā)明將詞法分析Agent和語法分析Agent結(jié)合起來使用,通過編寫一系列的規(guī) 則來完成對源碼的分析,并提取所需信息。首先在詞法分析之前,須先去掉源程序中的注釋 并將源程序的頭文件、宏等進(jìn)行擴(kuò)展;其次對源程序進(jìn)行詞法分析,生成一些三元數(shù)組,即 函數(shù)表和變量表;最后進(jìn)行語法分析,生成源程序的語法信息。其實(shí)現(xiàn)過程如下所述a)編寫詞法規(guī)則文件bas. 1,根據(jù)之前所述的詞法分析流程給出特定的詞法規(guī) 貝U,即表達(dá)式和相關(guān)動作;b)由Lex將其轉(zhuǎn)變成一個(gè)通用宿主語言,生成一個(gè)C程序lex. yy. c,其主函數(shù)為 yylexO ;c)根據(jù)任務(wù)需求制定一個(gè)輸入處理的功能說明,即一個(gè)語法規(guī)則文件bas. y,其 內(nèi)容就是指定的語法規(guī)則集及其各規(guī)則對應(yīng)的動作;d)利用Yacc將這樣的說明轉(zhuǎn)換成一個(gè)處理相應(yīng)輸入流的C語言程序yy. tab. c, 其主函數(shù)是yyparseO ;
e) yyparse ()通過調(diào)用詞法分析Agent的分析程序yylex (),進(jìn)而從輸入流中找到 “單詞”,再根據(jù)輸入結(jié)構(gòu)對這些單詞加以組織。當(dāng)某條規(guī)則被匹配,并完整地識別出來后, 就調(diào)用用戶指定的對應(yīng)于這條規(guī)則的一個(gè)動作,該動作具有返回值和利用其他動作的值的 能力。(2)程序 插樁 Agent本發(fā)明中程序插樁Agent包括語法信息分析Agent和自動插樁Agent,主要是通過 找出源程序的關(guān)鍵點(diǎn),并向其中插入探針函數(shù),從而獲取程序執(zhí)行時(shí)的動態(tài)信息。語法信息分析Agent主要識別源程序語法信息中的如下幾個(gè)關(guān)鍵點(diǎn)1)整型變量、長整型變量、字符變量、浮點(diǎn)變量等;2)類對象及類定義起始處;3) If選擇結(jié)構(gòu)中,then分支和else分支處;4) switch語句的每個(gè)分支處;5)對于循環(huán)結(jié)構(gòu)(for、while、do…while),存在兩個(gè)分支,即空循環(huán)分支和循環(huán)1 次,這兩個(gè)分支均需考慮;6)順序基本快結(jié)構(gòu)中,程序入口處和出口處;7)子函數(shù)入口處和出口處;8)轉(zhuǎn)移指令return語句,break語句,continue語句等處。語法信息分析Agent結(jié)果產(chǎn)生后,由其返回值來啟動自動插樁Agent。自動插樁 Agent通過接收語法信息分析Agent的結(jié)果,自動地往這些位置插入能收集源程序控制流 信息的語句即插樁函數(shù),并且這些插裝函數(shù)能在執(zhí)行過程中將執(zhí)行標(biāo)記寫入到特定的文 件。自動插樁Agent在對程序進(jìn)行插樁時(shí),必須考慮相應(yīng)的插樁策略,即植入探針的 位置以及探針函數(shù)的設(shè)計(jì)方法。本發(fā)明主要考慮塊探針、分支探針、函數(shù)探針、類探針、子程 序探針,下面分別對這幾種探針進(jìn)行描述1)塊探針?biāo)^塊又稱順序塊,是若干條順序執(zhí)行語句的序列集合。具體表現(xiàn)為, 在程序執(zhí)行過程中,如果順序塊的第一條語句被執(zhí)行,那么整個(gè)順序塊都將被執(zhí)行。因此, 只需在每個(gè)順序塊的開始或末尾處插入一個(gè)探針即可。2)分支探針對所有需要進(jìn)行TRUE或FALSE判斷的語句,在每個(gè)分支的開始處均 需插入一個(gè)探針,它主要用來統(tǒng)計(jì)分支覆蓋率。3)函數(shù)探針在所有函數(shù)的起始點(diǎn)插入探針,從而獲得該函數(shù)被調(diào)用的次數(shù)。4)類探針根據(jù)類的構(gòu)造函數(shù)在建立對象時(shí)自動執(zhí)行的特性,在類定義體的起始 處插入探針,輸出類的相關(guān)覆蓋信息。5)子程序探針在所有子程序調(diào)用標(biāo)號指向的語句后插入探針,從而獲得子程序 的調(diào)用情況。進(jìn)行程序插樁的最終目的是為了實(shí)現(xiàn)用戶對軟件覆蓋率的測試需求,根據(jù)不同的 測試類型,會有不同的插樁策略,相應(yīng)地生成不同的插樁記錄文件。該文件用來記錄此種測 試類型中所有插樁語句的ID或地址,是連接動態(tài)測試環(huán)境與測試數(shù)據(jù)生成的橋梁。該文件 主要包括以下內(nèi)容1)數(shù)據(jù)的長度整個(gè)數(shù)據(jù)的長度;
2)插樁的類型用戶所選擇的測試覆蓋率類型;3)插樁的對象用戶想測試的對象,通過其ID號來識別;4)插樁函數(shù) 的個(gè)數(shù)對程序插入的探針函數(shù)的個(gè)數(shù);5)插樁函數(shù)所在地址插樁函數(shù)的位置,通過順序塊語句ID或分支語句ID來標(biāo) 識。自動插樁Agent的具體算法實(shí)現(xiàn)過程為1)讀語法信息分析Agent發(fā)送來的的消息文件,從中分離出所有關(guān)鍵詞,從而確 定程序插樁位置;2)分析各關(guān)鍵詞的分類,確定探針函數(shù);3)將探針函數(shù)插入到設(shè)定的位置,函數(shù)定義位于插樁庫中;4)將插樁后的程序連同插樁庫一同編譯并運(yùn)行;5)輸入測試用例,通過選擇不同的覆蓋率類型生成相應(yīng)的插樁記錄文件。(3)覆蓋率分析Agent將插樁后的源程序進(jìn)行編譯并運(yùn)行,然后輸入事先準(zhǔn)備好的測試用例,這里測試 用例通過GA_Agent來完成,具體在第五章詳細(xì)介紹,通過選擇需要的測試類型(語句覆蓋 或分支覆蓋),覆蓋率分析Agent會調(diào)用自動插樁Agent中的語句或分支覆蓋探針函數(shù)庫, 根據(jù)插樁函數(shù)的執(zhí)行情況,即能判定覆蓋率是否滿足要求。 1)語句覆蓋率分析Agent本發(fā)明采用如下算法來計(jì)算源程序的語句覆蓋率a)如遇到能夠產(chǎn)生分支的關(guān)鍵詞(比如if、else、for、switch、return、continue、 break等)及“{”和“}”,則程序繼續(xù)向下判斷,否則返回讀下一個(gè)詞語;b)如果是上述能產(chǎn)生分支的關(guān)鍵詞,則將其對應(yīng)的當(dāng)前標(biāo)號(如flagif、 flagelse, flagswitch等)推進(jìn)棧中account單元保存,同時(shí)將當(dāng)前標(biāo)號加1 ;c)當(dāng)讀取到關(guān)鍵詞后的第一個(gè)“ {”時(shí),將標(biāo)志fflag加1,同時(shí)判斷其是否大于1, 如果大于1,則將此時(shí)對應(yīng)的行號推進(jìn)棧中nline單元保存,否則直接返回讀下一個(gè)詞;d)若碰到“}”,首先判斷鏈表節(jié)點(diǎn)是否大于0,如果是且等于1,則“}”所在行數(shù) 減去棧中保存的“ {”的行數(shù),然后再減去最近嵌套內(nèi)層的總行數(shù)即可得到該層相對應(yīng)的行 數(shù);e)若鏈表節(jié)點(diǎn)大于1,則判斷鏈表節(jié)點(diǎn)數(shù)與對應(yīng)層數(shù)是否相等,若相等則用此時(shí) “} ”所在行數(shù)減去棧中保存的“ {”行數(shù)的總數(shù),即該層的總行數(shù),然后用總行數(shù)減去嵌套內(nèi) 層行數(shù)之和,即可得到該層行數(shù)的對應(yīng)記錄;f)若鏈表節(jié)點(diǎn)數(shù)不等于對應(yīng)層數(shù),則將對應(yīng)層數(shù)加1,然后循環(huán)做判斷。g)待所有詞語讀取完畢之后,讀取程序動態(tài)運(yùn)行時(shí)寫入的插樁文件,同時(shí)讀取關(guān) 鍵詞標(biāo)號,將對應(yīng)關(guān)鍵詞鏈表中的行數(shù)與總行數(shù)變數(shù)相加,直到插樁文件讀取完畢。此時(shí)即 可輸出被覆蓋的語句總數(shù),從而得到語句覆蓋率。2)分支覆蓋率分析Agent本發(fā)明采用如下算法來計(jì)算源程序的分支覆蓋率a)初始化定義一個(gè)鏈表隊(duì)列;b)讀取插裝記錄文件,讀取時(shí)分別將分支標(biāo)號與鏈表隊(duì)列中的關(guān)鍵詞標(biāo)號作比較;c)若此時(shí)已存在于鏈表隊(duì)列中,則讀取下一條記錄,否則覆蓋分支總數(shù)加1 ;d)將分支標(biāo)號添加到鏈表隊(duì)列中,直至插裝記錄文件讀取完畢,輸出被覆蓋的分 支數(shù);e)根據(jù)分支覆蓋率計(jì)算公式計(jì)算分支覆蓋率。以上所 述,即為本發(fā)明的具體實(shí)施方式
。本發(fā)明提出了一種基于Agent技術(shù)的碼 垛機(jī)器人控制軟件測試方法,將Agent技術(shù)弓I入軟件測試過程中,利用Agent自身的特性對 碼垛機(jī)器人控制軟件進(jìn)行黑盒及白盒測試,有效地解決了傳統(tǒng)手工測試程序運(yùn)行效率低、 繁瑣等一些問題,保證了碼垛機(jī)器人軟件控制系統(tǒng)的高效穩(wěn)定的運(yùn)行,通用性強(qiáng),同時(shí)還能 大大降低測試費(fèi)用。
權(quán)利要求
1.一種基于Agent的碼垛機(jī)器人控制軟件測試方法,其特征在于,包括以下步驟(1)建立基于Agent的BDI模型TC_Agent,生成測試所需的黑盒測試用例;(2)利用黑盒測試Agent判斷系統(tǒng)功能的實(shí)現(xiàn)情況;(3)建立基于遺傳算法的覆蓋測試用例生成模型GA_Agent,通過設(shè)計(jì)編碼、適應(yīng)度函 數(shù)、選擇、交叉、變異等一系列遺傳操作,實(shí)現(xiàn)覆蓋測試用例的自動生成;(4)建立白盒測試Agent模型,通過預(yù)處理Agent、程序插樁Agent完成對程序的插樁 操作,將插樁后的程序編譯運(yùn)行后送往目標(biāo)機(jī),并輸入GA_Agent生成的測試用例,利用覆 蓋率分析Agent得出碼垛機(jī)器人程序的語句與分支覆蓋率。
2.如權(quán)利要求1中所述方法,其特征在于,所述步驟(1)中,將BDI之間的約束關(guān)系應(yīng) 用到測試用例生成過程中,建立了基于BDI的黑盒測試用例生成模型TC_Agent,B、D、I分 別表示TC_Agent所有可能的信念、愿望和意圖的集合。其中B包括設(shè)計(jì)測試用例基本原則 與待測模塊中功能規(guī)格說明的集合;D包括測試用例中所有合理與不合理輸入及對應(yīng)輸出 的集合;I表示測試用例執(zhí)行后,對程序運(yùn)行結(jié)果正確與否的判斷。
3.如權(quán)利要求1中所述方法,其特征在于,所述步驟(2)可描述為將TC_Agent生成的 測試用例送往碼垛機(jī)器人系統(tǒng)并接收其輸出,對輸出信號進(jìn)行分析和處理,從而判斷系統(tǒng) 功能的實(shí)現(xiàn)情況。
4.如權(quán)利要求1中所述方法,其特征在于,所述步驟(3)進(jìn)一步包括3. 1)確定編碼方式及種群規(guī)模,隨機(jī)生成初始參數(shù)種群;3. 2)按照參數(shù)的編碼要求對個(gè)體進(jìn)行解碼,從而得到各個(gè)參數(shù)的實(shí)際值;3.3)以當(dāng)前種群的實(shí)際參數(shù)值為輸入,調(diào)用插樁后的被測程序,得到所有個(gè)體的目標(biāo) 函數(shù)值并返回給遺傳算法模塊;3. 4)對所有個(gè)體目標(biāo)函數(shù)值進(jìn)行評價(jià),若適應(yīng)度不滿足要求,則進(jìn)行相應(yīng)的選擇、交 叉、變異操作,從而形成一個(gè)新的種群;3.5)對步驟(2)至步驟(4)進(jìn)行往復(fù)操作,直至找到覆蓋選定路徑的目標(biāo)參數(shù)值或達(dá) 到預(yù)定的最大迭代數(shù)。
5.如權(quán)利要求1中所述方法,其特征在于,所述步驟(4)進(jìn)一步包括4.1)預(yù)處理Agent,通過詞法、語法分析得到源程序的語法信息;4. 2)程序插樁Agent,通過對語法信息分析,找出程序的所有插樁點(diǎn),并自動插入探針 函數(shù);4. 3)將插樁后的程序編譯并運(yùn)行,同時(shí)輸入GA_Agent生成的測試用例;4. 4)覆蓋率分析Agent,分別用語句、分支覆蓋率算法計(jì)算源程序的語句覆蓋率和分支覆蓋率。
全文摘要
本發(fā)明涉及一種基于Agent的碼垛機(jī)器人控制軟件測試方法,是一種改進(jìn)的針對碼垛機(jī)器人控制系統(tǒng)軟件進(jìn)行黑盒與白盒測試的方法,屬于嵌入式軟件測試領(lǐng)域。本發(fā)明主要包括四個(gè)步驟第一步,建立基于Agent的BDI模型TC_Agent,生成測試所需的黑盒測試用例;第二步,利用黑盒測試Agent判斷系統(tǒng)功能的實(shí)現(xiàn)情況;第三步,建立基于遺傳算法的覆蓋測試用例生成模型GA_Agent,通過設(shè)計(jì)編碼、適應(yīng)度函數(shù)、選擇、交叉、變異等一系列遺傳操作,實(shí)現(xiàn)覆蓋測試用例的自動生成;第四步,建立白盒測試Agent模型,通過預(yù)處理Agent、程序插樁Agent完成對程序的插樁操作,將插樁后的程序編譯運(yùn)行后送往目標(biāo)機(jī),并輸入GA_Agent生成的測試用例,利用覆蓋率分析Agent得出碼垛機(jī)器人程序的語句與分支覆蓋率。本發(fā)明能夠應(yīng)用到不同的程序,簡單快捷,能大大提高軟件自動化測試的效率,通用性強(qiáng)。
文檔編號G06F11/36GK102103538SQ201110042388
公開日2011年6月22日 申請日期2011年2月22日 優(yōu)先權(quán)日2011年2月22日
發(fā)明者劉久富, 婁堅(jiān)波, 朱丹丹, 梁娟娟, 王偉, 蘇青琴, 陳魁 申請人:南京航空航天大學(xué)