軟體測試中循環代碼的處理方法與系統的製作方法
2023-05-19 03:23:01 1
專利名稱:軟體測試中循環代碼的處理方法與系統的製作方法
技術領域:
本發明涉及軟體測試技術,具體涉及一種軟體測試中循環代碼的處理方法與系統。
背景技術:
軟體測試是在一個可控的環境中進行源程序(被測代碼)分析或執行的過程,其根本目的是以儘可能少的時間和人力發現並改正軟體中潛在的故障及缺陷,進而提高軟體質量。軟體測試的準確率與測試路徑生成的全面性息息相關。現有技術中,通過遍歷程序控制流圖中的節點,生成測試路徑,沿著測試路徑利用測試用例執行源程序。當程序控制流圖中的節點均為順序節點即源程序均為順序語句時,貝IJ可生成一條明確的測試路徑;但是當程序控制流圖中出現分支節點即源程序中出現循環語句時,現有常規處理方法如0-1策略或O-K策略,將循環語句看成判斷語句進行處理,無形當中遺漏了部分測試路徑的生成,測試路徑生成得不全面令軟體測試的準確率下降。除此之外,還可通過人工方法如人工指定測試路徑對循環語句進行處理,這樣便增加了人力成本;況且人工方法靈活性較差,很難適應不同工程項目的需求。
發明內容
有鑑於此,本發明的主要目的在於提供一種軟體測試中循環代碼的處理方法與系統,能夠保證測試路徑生成的全面性、靈活性高、可節省人力成本。為達到上述目的,本發明的技術方案是這樣實現的:本發明提供了一種軟體測試中循環代碼的處理方法,所述方法包括:依據程序控制流圖,查找被測代碼的循環體;確定當前循環體的循環體前子路徑;確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑;確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例;依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。上述方案中,所述方法還包括:被測代碼的所有循環體的實際執行路徑被捕獲後,生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。上述方案中,所述確定當前循環體的循環體前子路徑,包括:確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為可達時,確定所述程序控制流圖的入口節點至當前循環體起始點之間的路徑為循環體前子路徑;確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為不可達時,將所述不可達路徑改造成可達路徑,確定所述可達路徑為循環體前子路徑;確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為可達時,確定所述新的循環體前子路徑為循環體前子路徑;確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為不可達時,將所述新的循環體前子路徑改造成可達路徑,確定所述新的循環體前子路徑為循環體前子路徑。上述方案中,所述確定當前循環體的所有單條子路徑,包括:按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的路徑的集合為循環體的所有單條子路徑。上述方案中,所述組合所述單條子路徑為組合子路徑,確定所述組合子路徑為當前循環體的確定子路徑,包括:依次選取所述所有單條子路徑中的一個單條子路徑為目標子路徑,其他單條子路徑為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑、或集合所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。上述方案中,所述確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例,包括:依次選取確定子路徑,集合循環體前子路徑和所述確定子路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例。上述方案中,所述生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行所述完整測試用例的覆蓋測試,包括:集合循環體前子路徑、確定子路徑和被測代碼的最後一個循環體至程序控制流圖的出口節點之間的路徑為完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。本發明還提供了一種軟體測試中循環代碼的處理系統,所述系統包括:查找單元、第一確定單元、第二確定單元、生成單元和捕獲單元;其中,所述查找單元,用於依據程序控制流圖,查找被測代碼的循環體;所述第一確定單元,用於確定當前循環體的循環體前子路徑;所述第二確定單元,用於確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑;所述生成單元,用於確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例;所述捕獲單元,用於依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。上述方案中,所述系統還包括測試單元;所述測試單元,用於被測代碼的所有循環體的實際執行路徑被捕獲後,生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。上述方案中,所述第二確定單元,進一步用於按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的路徑的集合為循環體的所有單條子路徑,依次選取所述單條子路徑中的一個單條子路徑為目標子路徑,其他單條子路徑為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑、或集合所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。本發明提供的軟體測試中循環代碼的處理方法與系統,先依據程序控制流圖,查找被測代碼的循環體,確定當前循環體的循環體前子路徑,再確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,並將所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑,接著確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例,並依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑,重複上述步驟直至處理完所述被測代碼的所有循環體,被測代碼的所有循環體的實際執行路徑被捕獲後,生成完整測試路徑對所述被測代碼進行覆蓋測試。本發明可實現生成測試路徑的全面性,靈活性更高、無需人工指定測試路徑;同時還利用可達性判定排除非可達路徑、保留可達路徑,可節省處理資源,避免軟體測試中出現的路徑爆炸問題。
圖1為本發明軟體測試中循環代碼的處理方法的實現流程示意圖;圖2為本發明具體實施例的程序控制流圖示意圖;圖3(a) 3(b)為本發明的具體實施例的示意圖;圖4為本發明軟體測試中循環代碼的處理系統的組成結構示意圖。
具體實施例方式本發明提供了一種軟體測試中循環代碼的處理方法,如圖1所示,所述方法包括:步驟1:依據程序控制流圖,查找被測代碼的循環體;步驟2:確定當前循環體的循環體前子路徑;步驟3:確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑;步驟4:確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例;
步驟5:依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。進一步的,在捕獲所述被測代碼的所有循環體的實際執行路徑之後,所述方法還包括:步驟6:生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。這裡,所述覆蓋測試準則包括:分支覆蓋、語句覆蓋、條件覆蓋等。上述技術方案中,所述步驟2為能夠查找到被測代碼的循環體的情況,當不能夠查找到被測代碼循環體時,繼續執行步驟6。進一步的,所述步驟2為:確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為可達時,確定所述程序控制流圖的入口節點至當前循環體起始點之間的路徑為循環體前子路徑;確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為不可達時,將所述不可達路徑改造成可達路徑,確定所述可達路徑為循環體前子路徑;確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為可達時,確定所述新的循環體前子路徑為循環體前子路徑;確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為不可達時,將所述新的循環體前子路徑改造成可達路徑,確定所述新的循環體前子路徑為循環體前子路徑。這裡,所述將所述不可達路徑改造成可達路徑、將所述新的循環體前子路徑改造成可達路徑主要採用分支替換方式。進一步的,所述步驟3為:所述確定當前循環體的所有單條子路徑為:按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的路徑的集合為循環體的所有單條子路徑。這裡,簡稱所述循環體起始節點為循環體起始點、循環體結束節點為循環體結束點。所述組合所述單條子路徑為組合子路徑,確定所述組合子路徑為當前循環體的確定子路徑為:依次選取所述所有單條子路徑中的一個單條子路徑為目標子路徑,其他單條子路徑作為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑、或集合所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。
進一步的,所述步驟4為:依次選取確定子路徑,集合循環體前子路徑和所述確定子路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例。在所述步驟5中,通過對實際運行的當前循環體的代碼做標識來捕獲當前循環體的實際執行路徑。進一步的,所述步驟6為:集合循環體前子路徑、確定子路徑和循環體後子路徑為完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。這裡,定義所述循環體後子路徑為所述被測代碼的最後一個循環體至程序控制流圖的出口節點之間的路徑。具體的,所述步驟2為:這裡,將所述當前循環體的循環體前子路徑用pr印ath來表示;步驟21:查找到被測代碼的循環體時,進一步確定當前循環體是否為被測代碼的第一個循環體;確定當前循環體是被測代碼的第一個循環體時,繼續執行步驟22 ;確定當前循環體不是被測代碼的第一個循環體時,繼續執行步驟24 ;步驟22:確定被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑是否為可達;確定為可達時,繼續執行步驟23 ;確定為不可達時,繼續執行步驟27 ;這裡,可達性判定標準為:路徑中所有變量取值均不為空,則認為路徑為可達;路徑中至少有一個變量的取值為空,則認為路徑為不可達;在本技術方案的說明時,凡是涉及到可達與不可達的判定含義均與此處相同,不再贅述。步驟23:確定所述入口節點至當前循環體起始點之間的路徑為當前循環體的循環體前子路徑prepath,步驟2流程結束;步驟24:將被測代碼的上一個循環體的循環體前子路徑、步驟5中捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑集合成新的循環體前子路徑,繼續執行步驟25 ;步驟25:確定所述新的循環體前子路徑是否為可達;確定為可達時,執行步驟26 ;確定為不可達時,執行步驟27 ;步驟26:確定所述新的循環體前子路徑為當前循環體(非第一個循環體)的循環體前子路徑prepath,步驟2流程結束;步驟27:對所述不可達路徑改造成可達路徑,並確定所述可達路徑為當前循環體的循環體前子路徑prepath,步驟2流程結束;其中,主要採用分支替換方式將不可達路徑改造成可達路徑:從程序控制流圖上的不可達節點位置開始進行節點的逆序遍歷,對路徑中的其他分支節點進行分支替換。具體的,所述步驟3為:所述確定所述組合子路徑為當前循環體的確定子路徑為:
這裡,選取當前循環體中的第一條單條子路徑為當前子路徑;步驟31:將當前單條子路徑作為目標子路徑path k,其他單條子路徑作為參考子路徑 path 1...path k_l ;這裡,設置迭代深度k的取值小於等於迭代深度閾值。步驟32:利用循環的路徑生成策略,對所述目標子路徑進行確定子路徑的生成,選取當前循環體中的下一條單條子路徑為當前子路徑,返回步驟31,直至將當前循環體的所有單條子路徑均作為一次目標子路徑。這裡,所述循環的路徑生成策略利用了深度優先原則:步驟321:初始化迭代深度k,集合當前循環體的循環體前子路徑與所述目標子路徑為集合路徑,確定所述集合路徑是否為可達;確定為可達時,確定為所述目標子路徑為確定子路徑;這裡,為方便描述,也可以將不涉及到其它參考子路徑的單條所述目標子路徑為組合子路徑;確定為不可達時,執行步驟322 ;步驟322:迭代深度k自加I,在當前迭代深度中,集合第一次執行循環體的單條子路徑(參考子路徑)pathl...第k-Ι次執行循環體的單條子路徑(參考子路徑)path k-1和目標子路徑(第k次執行循環體的子路徑path k)為組合子路徑;併集合循環體前子路徑與所述組合子路徑的集合路徑為集合路徑,確定所述集合路徑是否可達;可達時,確定所述組合子路徑為確定子路徑;不可達時,繼續執行步驟322,直至迭代深度k為迭代深度閾值(最大值)。這裡,所述迭代深度閾值根據工程項目的需要而制定。具體的,所述步驟4為:這裡,選取當前確定子路徑為第一條確定子路徑;步驟41:集合當前循環體的循環體前子路徑與當前確定子路徑為半條子路徑,確定所述半條子路徑是否為可達;確定為可達時,生成所述半條子路徑的測試用例;確定為不可達時,執行步驟42 ;步驟42:選取下一條確定子路徑為當前確定子路徑,返回到步驟41,直至將當前循環體的所有確定子路徑處理完。下面以循環體為被測代碼PiOgram的第一個循環體Cycl、迭代深度k初始取值為1,迭代深度閾值為3、所述第一個循環體Cycl具有兩個分支節點C和C』為例對本發明的技術方案作詳細說明。設置循環體起始節點為循環體起始點LoopHead,循環體結束節點為循環體結束點LoopOut ;所述分支節點C的左子節點為A、右子節點為B ;所述分支節點C』的左子節點為A』、右子節點為B』 ;在所述被測代碼Program的程序控制流圖上,所述分支節點C』位於所述分支節點C之前。所述步驟I具體可以為:定義隊列,用來存儲被測代碼Program中循環體起始點LoopHead ;遍歷被測代碼Program的程序控制流圖的節點,查找到循環體起始點時,將循環體起始點壓入到隊列,查找到所述循環體起始點LoopHead對應的循環體結束點LoopOut時,將隊列中的元素(已經壓入進隊列的節點)進行節點的出隊列操作,確定此時隊列為空時,則認為剛出隊列的元素為一個循環體;這裡,程序控制流圖中對節點的描述是成對出現的,如循環體起始點LoopHead為for_head、對應的循環體結束點LoopOut為for_out ;循環體起始點LoopHead為while_head、對應的循環體結束點LoopOut為while_out。所述步驟2具體可以為:查找到被測代碼Program的第一個循環體Cycl起始點時,逆序遍歷程序控制流圖,即從所述第一個循環體Cycl起始點開始向所述程序控制流圖的入口節點方向進行所述程序控制流圖的入口節點的查找,查找到所述入口節點,確定所述入口節點至第一個循環體Cycl起始點之間的路徑為可達時,確定第一個循環體Cycl的循環體前子路徑prepath為被測代碼Program的程序控制流圖的入口節點至自身起始點之間的路徑。所述步驟3具體可以為:在上面的描述中,遍歷到的循環體起始節點LoopHead至循環體結束節點LoopOut之間的路徑存在有至少一條,之所以說至少存在有一條路徑能夠從當前循環體起始點LoopHead遍歷到當前循環體結束點LoopOut是考慮到程序控制流圖上有分支節點的存在。針對分支節點,本實施例中進行如下處理:定義棧,用來存儲所述第一個循環體Cycl的所有單條子路徑;程序控制流圖的節點未壓入進棧時,均標識為「未訪問」;圖2為本發明具體實施例的程序控制流圖示意圖,圖中每個〇代表一個節點,結合圖2,遍歷程序控制流圖的節點、將遍歷到的節點如分支節點C』、分支節點C』的左子節點A』、分支節點C和所述分支節點C的左子節點A (簡稱為C』 A』 CA)依次壓入進棧時,並標識上述節點為「已訪問」;所述C』 A』 CA為第一條單條子路徑;因棧的特性為先進後出,查找第一個循環體Cycl的第二條單條子路徑時,將第一條單條子路徑上的所有節點進行出棧操作,出棧順序為棧頂元素至棧底元素;所以將第一條單條路徑上的分支節點C的左子節點A先進行出棧操作,此時所述左子節點A仍然標識為「已訪問」,而遍歷到所述分支節點C時,確定所述分支節點C是否還存在其它的子節點標識為「未訪問」的,這裡,查找到所述分支節點C的右子節點B標識為「未訪問」,則將所述分支節點C的右子節點B壓入進棧,形成第二條單條子路徑C』 A』 CB,第二條單條子路徑上的節點與第一條單條子路徑上的節點除了所述分支節點C的子節點不同,其餘均為相同的節
佔.
在查找第三條單條子路徑時,將第二條單條子路徑上的所有節點進行出棧操作,所述分支節點C右子節點B先出棧,仍標識為「已訪問」;遍歷到所述分支節點C時,確定所述分支節點C是否還存在其它的子節點標識為「未訪問」的,這裡,因所述分支節點C只具有兩個子節點A和B,此時所述兩個子節點A和B均已經出棧,將已經出棧的左子節點A、右子節點B重新標識為「未訪問」,這時所述分支節點C出棧,並標識為「未訪問」。接下來,所述分支節點C』的左子節點A』出棧,對所述分支節點C』的左子節點A』不作重置操作,也就是對已出棧的所述分支節點C』的左子節點A』不作標識的變更,仍然標識為「已訪問」;遍歷到所述分支節點C』時,查找到所述分支節點C』還存在有右子節點B』標識為「未訪問」,則將所述分支節點C』右子節點B』壓入進棧,並標識為「已訪問」,此時位於所述分支節點C』下面的所述分支節點C及其左子節點A均為「未訪問」 ,將所述分支節點C及其左子節點A壓入進棧,並標識為「已訪問」,形成第三條單條子路徑C』 B』 CA ;
在查找第四條單條子路徑時,將第三條單條子路徑的節點進行出棧操作,所述分支節點C的左子節點A先進行出棧操作,仍然標識為「已訪問」,而遍歷到所述分支節點C時,查找到此時所述分支節點C的右子節點標識為「未訪問」,則將所述分支節點C的右子節點B壓入進棧,形成第四條單條子路徑C』 B』 CB ;以此類推,能夠查找到第一個循環體Cycl的所有單條子路徑。圖3(a) 3(b)為本發明的實現方法的一具體實施例,本實施例中,所述確定第一個循環體Cycl的確定子路徑的過程和步驟4可以具體為:如圖3(a)所示,查找到所述第一循環體Cycl的所有單條子路徑依次為:單條子路徑p1、單條子路徑p2、單條子路徑p3和單條子路徑p4。如圖3(b)所示,將所述單條子路徑Pl作為目標子路徑,所述其他單條子路徑p2、P3和p4作為參考子路徑,進行確定子路徑的生成。步驟3211:設置迭代深度k= 1,確定所述第一循環體Cycl的循環體前子路徑prepath與所述目標子路徑pi的集合路徑是否為可達;確定為可達時,確定所述目標子路徑pi為確定子路徑,繼續執行步驟411 ;確定為不可達時,執行步驟3221 ;步驟3221:回溯到參考子路徑p 2 (pathl),將迭代深度進行加I操作,即k = 2,集合所述參考子路徑p2 (pathl)、目標子路徑pi (path k)為p2pl組合子路徑,確定所述循環體前子路徑Pr印ath與所述p2pl組合子路徑的集合路徑是否可達;確定為可達時,確定所述p2pl組合子路徑為確定子路徑,繼續執行步驟411 ;確定為不可達時,繼續執行步驟3222 ;步驟3222:將迭代深度進行加I操作,即k = 3,集合所述參考子路徑p2 (pathl)、參考子路徑?2( &訪2)、目標子路徑?1( &訪k)為p2p2pl子路徑,確定所述循環體前子路gpi^path與所述p2p2pl組合子路徑的集合路徑是否可達;確定為可達時,確定所述p2p2pl組合子路徑為確定子路徑,繼續執行步驟411 ;確定為不可達時,繼續執行步驟3223 ;步驟3223:迭代深度k = 3,集合所述參考子路徑p2 (pathl)、參考子路徑 3( &訪2)、目標子路徑?1( &訪k)為p2p3pl組合子路徑,確定所述循環體前子路徑prepath與所述p2p3pl組合子路徑的集合路徑是否可達;確定為可達時,確定所述組合p2p3pl子路徑為確定子路徑,繼續執行步驟411 ;確定為不可達時,繼續執行步驟3224 ;步驟3224:迭代深度k = 3,集合所述參考子路徑p2 (pathl)、參考子路徑 4( &訪2)、目標子路徑?1( &訪k)為p2p4pl組合子路徑,確定所述循環體前子路徑prepath與所述p2p4pl組合子路徑的集合路徑是否可達;確定為可達時,確定所述p2p4pl組合子路徑為確定子路徑,繼續執行步驟411 ;確定為不可達時,當前迭代深度(為迭代深度閾值)中,以所述參考子路徑P2、參考子路徑pn(n = 3或4)和目標子路徑pi為集合的所有組合子路徑已經處理完成,此時將執行步驟3225 ;步驟3225:回溯到參考子路徑p3 (pathl),將迭代深度進行減I操作,即k = 2,集合所述參考子路徑P3 (pathl)和目標子路徑pi (path k)為p3pl組合子路徑,確定所述p3pl組合子路徑是否可達;確定為可達時,確定所述p3pl組合子路徑為確定子路徑,繼續執行步驟411 ;確定為不可達時,繼續執行步驟3226 ;步驟3226:將迭代深度進行加I操作,即k = 3,集合所述參考子路徑p3 (pathl)、參考子路徑p2(path2)和目標子路徑pl(path k)為p3p2pl組合子路徑,確定所述循環體前子路徑prepath與所述p3p2pl組合子路徑的集合路徑是否可達;確定為可達時,確定所述p3p2pl組合子路徑為確定子路徑,繼續執行步驟411 ;以此類推,直至確定所述第一循環體Cycl中的所有確定子路徑;步驟411:集合所述第一循環體Cycl的循環體前子路徑prepath與所述確定子路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例,依據所述測試用例,執行被測代碼,通過標識實際運行的代碼來捕獲所述第一循環體Cycl的實際執行路徑。本實施例中對被測代碼Program的第一個循環體Cycl的處理如上所述,當被測代碼Program中還存在有其他循環體(第二個循環體...第M個循環體,M取值為大於I的正整數)時,確定所述其他循環體的所有子路徑、確定所述確定子路徑的過程與所述第一個循環體相似,只是所述其他循環體的循環體前子路徑prepath的取值與所述第一個循環體的循環體前子路徑path的取值略有不同,具體參照上述技術方案中的步驟21 步驟27。當被測代碼Program的所有循環體按照上述技術方案處理完成後,集合所述被測代碼Program的循環體前子路徑、確定子路徑和循環體後子路徑為完整測試路徑,生成完整測試用例,利用覆蓋測試準則,如分支覆蓋、語句覆蓋等對被測代碼執行完整測試用例的覆蓋測試。這裡,所述循環體後子路徑為所述被測代碼Program的最後一個循環體至程序控制流圖的出口節點之間的路徑。本發明中,所述循環體均為所述被測代碼的最外層循環。針對上述軟體測試中循環代碼的處理方法,本發明還記載了一種軟體測試中循環代碼的處理系統,如圖4所示,所述系統包括:查找單元400、第一確定單元401、第二確定單元402、生成單元403和捕獲單元404 ;其中,所述查找單元400,用於依據程序控制流圖,查找被測代碼的循環體;所述第一確定單元401,用於確定當前循環體的循環體前子路徑;所述第二確定單元402,用於確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑;所述生成單元403,用於確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例;所述捕獲單元404,用於依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。其中,所述系統還包括測試單元405 ;所述捕獲單元404捕獲完所述被測代碼的所有循環體的實際執行路徑之後所述測試單元405,用於生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。這裡,所述覆蓋測試準則包括分支覆蓋、語句覆蓋、條件覆蓋等等。進一步的,所述查找單元400依據被測代碼的程序控制流圖對被測代碼的循環體進行查找,查找到所述被測代碼存在有循環體時,通知所述第一確定單元401,所述第一確定單元401確定當前循環體是否為被測代碼的第一個循環體。所述第一確定單元401確定為當前循環體為被測代碼的第一個循環體時,且確定被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為可達時,確定所述程序控制流圖的入口節點至當前循環體起始點之間的路徑為當前循環體的循環體前子路徑;所述第一確定單元401確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為不可達時,採用分支替換方式將所述不可達路徑改造成可達路徑,確定所述可達路徑為循環體前子路徑;所述第一確定單元401確定當前循環體為被測代碼的非第一個循環體,集合被測代碼的上一個循環體的循環體前子路徑、所述捕獲單元404捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為可達時,確定所述新的循環體前子路徑為循環體前子路徑;所述第一確定單元401確定當前循環體為被測代碼的非第一個循環體,集合被測代碼的上一個循環體的循環體前子路徑、所述捕獲單元404捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為不可達時,將所述新的循環體前子路徑改造成可達路徑,確定所述新的循環體前子路徑為循環體前子路徑;這裡,採用分支替換方式將所述不可達路徑改造成可達路徑:從程序控制流圖上的不可達節點位置開始進行節點的逆序遍歷,對路徑中的其他分支節點進行分支替換;可達性判定標準為:路徑中所有變量取值均不為空,則認為路徑為可達;路徑中至少有一個變量的取值為空,則認為路徑為不可達;本發明中,凡是涉及到可達與不可達的判定含義均與此處相同,不再贅述。所述第二確定單元402按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的至少一條路徑的集合為循環體中的所有單條子路徑,依次選取所述單條子路徑中的一個單條子路徑為目標子路徑,其他單條子路徑作為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。這裡,簡稱所述循環體起始節點為循環體起始點、循環體結束節點為循環體結束點。所述生成單元403依次選取確定子路徑,集合循環體前子路徑和所述確定子路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例。所述捕獲單元404通過對實際運行的當前循環體的代碼做標識來捕獲當前循環體的實際執行路徑,並將捕獲到的當前循環體的實際執行路徑發送至所述第一確定單元401,便於對當前循環體的下一循環體的循環體前子路徑進行賦值。在所述第一確定單元401、第二確定單元402、生成單元403和捕獲單元404捕獲完所述被測代碼的所有循環體的實際執行路徑之後,通知所述測試單元405,所述測試單元405集合循環體前子路徑、確定子路徑和循環體後子路徑為完整測試路徑,生成完整測試用例,利用覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。這裡,所述循環體後子路徑為所述被測代碼的最後一個循環體至程序控制流圖的出口節點之間的路徑。本發明提供的軟體測試中循環代碼的處理方法與系統,對被測代碼中的循環體主要進行如下處理:先依據程序控制流圖,查找被測代碼的循環體,確定循環體的循環體前子路徑,再確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑;接著集合所述循環體前子路徑與所述確定子路徑的路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例,並依據所述測試用例,執行被測代碼,捕獲所述循環體的實際執行路徑,按照如上方法處理完所述被測代碼的所有循環體後,生成完整測試路徑、完整測試用例,對完整測試路徑執行所述完整測試用例的覆蓋測試。與現有技術的0-1策略和O-K策略不同,本發明可生成循環體的所有可能路徑,並對生成的所有可能路徑進行可達性判定,能夠排除非可達路徑、保留可達路徑,如此可一方面令測試路徑生成得更全面,另一方面避免被測代碼處理資源的浪費和路徑爆炸;同時,本發明與現有的人工指定測試路徑的方法相比,節省人力、靈活性得到顯著提高。以上所述,僅為本發明的較佳實施例而已,並非用於限定本發明的保護範圍。
權利要求
1.一種軟體測試中循環代碼的處理方法,其特徵在於,所述方法包括: 依據程序控制流圖,查找被測代碼的循環體; 確定當前循環體的循環體前子路徑; 確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑; 確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例; 依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。
2.根據權利要求1所述的軟體測試中循環代碼的處理方法,其特徵在於,所述方法還包括: 被測代碼的所有循環體的 實際執行路徑被捕獲後,生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。
3.根據權利要求1所述的軟體測試中循環代碼的處理方法,其特徵在於,所述確定當前循環體的循環體前子路徑,包括: 確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為可達時,確定所述程序控制流圖的入口節點至當前循環體起始點之間的路徑為循環體前子路徑; 確定當前循環體為被測代碼的第一個循環體且被測代碼的程序控制流圖的入口節點至當前循環體起始點之間的路徑為不可達時,將所述不可達路徑改造成可達路徑,確定所述可達路徑為循環體前子路徑; 確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為可達時,確定所述新的循環體前子路徑為循環體前子路徑; 確定當前循環體為被測代碼的非第一個循環體且集合被測代碼的上一個循環體的循環體前子路徑、捕獲到的上一個循環體的實際執行路徑、被測代碼的上一個循環體至當前循環體之間的路徑為新的循環體前子路徑,所述新的循環體前子路徑為不可達時,將所述新的循環體前子路徑改造成可達路徑,確定所述新的循環體前子路徑為循環體前子路徑。
4.根據權利要求1所述的軟體測試中循環代碼的處理方法,其特徵在於,所述確定當前循環體的所有單條子路徑,包括: 按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的路徑的集合為循環體的所有單條子路徑。
5.根據權利要求1所述的軟體測試中循環代碼的處理方法,其特徵在於,所述組合所述單條子路徑為組合子路徑,確定所述組合子路徑為當前循環體的確定子路徑,包括: 依次選取所述所有單條子路徑中的一個單條子路徑為目標子路徑,其他單條子路徑為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑、或集合所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。
6.根據權利要求1所述的軟體測試中循環代碼的處理方法,其特徵在於,所述確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例,包括: 依次選取確定子路徑,集合循環體前子路徑和所述確定子路徑為半條子路徑,確定所述半條子路徑為可達時,生成所述半條子路徑的測試用例。
7.根據權利要求2至6任一所述的軟體測試中循環代碼的處理方法,其特徵在於,所述生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行所述完整測試用例的覆蓋測試,包括: 集合循環體前子路徑、確定子路徑和被測代碼的最後一個循環體至程序控制流圖的出口節點之間的路徑為完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。
8.一種軟體測試中循環代碼的處理系統,其特徵在於,所述系統包括:查找單元、第一確定單元、第二確定單元、生成單元和捕獲單元;其中, 所述查找單元,用於依據程序控制流圖,查找被測代碼的循環體; 所述第一確定單元,用於確定當前循環體的循環體前子路徑; 所述第二確定單元,用於確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑; 所述生成單元,用於確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例; 所述捕獲單元,用於依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑。
9.根據權利要求8所述的軟體測試中循環代碼的處理系統,其特徵在於,所述系統還包括測試單元; 所述測試單元,用於被測代碼的所有循環體的實際執行路徑被捕獲後,生成被測代碼的完整測試路徑,生成完整測試用例,並利用預設的覆蓋測試準則對被測代碼執行完整測試用例的覆蓋測試。
10.根據權利要求8或9所述的軟體測試中循環代碼的處理系統,其特徵在於,所述第二確定單元,進一步用於按序遍歷被測代碼程序控制流圖上的節點,遍歷到的循環體起始節點至循環體結束節點之間的路徑的集合為循環體的所有單條子路徑,依次選取所述單條子路徑中的一個單條子 路徑為目標子路徑,其他單條子路徑為參考子路徑,集合至少一個所述參考子路徑與所述目標子路徑為所述組合子路徑、或集合所述目標子路徑為所述組合子路徑,並利用循環的路徑生成策略生成所述目標子路徑的確定子路徑。
全文摘要
本發明公開了一種軟體測試中循環代碼的處理方法,先依據程序控制流圖,查找被測代碼的循環體,確定當前循環體的循環體前子路徑,再確定當前循環體的所有單條子路徑,組合所述單條子路徑為組合子路徑,所述循環體前子路徑與所述組合子路徑的集合路徑為可達時,確定所述組合子路徑為當前循環體的確定子路徑,確定所述循環體前子路徑與所述確定子路徑的集合路徑為可達時,生成測試用例,並依據所述測試用例,執行被測代碼,捕獲所述當前循環體的實際執行路徑,重複上述步驟,直至處理完被測代碼的所有循環體。同時本發明還公開了一種軟體測試中循環代碼的處理系統。本發明靈活性高、能夠節省人力成本、避免路徑爆炸。
文檔編號G06F11/36GK103207833SQ201310113328
公開日2013年7月17日 申請日期2013年4月2日 優先權日2013年4月2日
發明者宮雲戰, 黃俊飛, 王雅文, 王強, 金大海 申請人:北京郵電大學