本公開涉及軟件開發(fā),具體涉及一種基于程序執(zhí)行路徑分解的測(cè)試用例生成方法、裝置。
背景技術(shù):
1、在軟件開發(fā)過程中,單元測(cè)試是確保代碼質(zhì)量和功能正確性的關(guān)鍵環(huán)節(jié)。單元測(cè)試是指驗(yàn)證軟件中的最小可測(cè)試部分(例如單個(gè)函數(shù))的正確性。單元測(cè)試的目的是隔離代碼的一小部分,并確保這部分代碼在各種輸入條件下都能按預(yù)期工作。
2、現(xiàn)有技術(shù)中一般利用大模型技術(shù)來生成代碼的單元測(cè)試用例,但針對(duì)結(jié)構(gòu)層次較多且各層次之間相互關(guān)聯(lián)的類型的程序,例如:第二層次的函數(shù)的執(zhí)行需要使用的第一層次函數(shù)的結(jié)果,或者,是第一層次函數(shù)的一種條件的分支,大模型在理解方面存在局限性,導(dǎo)致生成的測(cè)試用例可能無法全面覆蓋代碼的所有邏輯分支和邊界條件,從而影響整個(gè)測(cè)試流程的效率和效果。
技術(shù)實(shí)現(xiàn)思路
1、有鑒于此,本公開提出了一種基于程序執(zhí)行路徑分解的測(cè)試用例生成方法、裝置,以解決相關(guān)技術(shù)中由于大模型在理解邏輯復(fù)雜程序時(shí)存在局限性,導(dǎo)致生成的測(cè)試用例可能無法覆蓋代碼的所有邏輯分支和邊界條件,影響測(cè)試效率和效果的問題。
2、本公開第一方面實(shí)施例提出了一種基于程序執(zhí)行路徑分解的測(cè)試用例生成方法,所述方法包括:
3、獲取目標(biāo)代碼,所述目標(biāo)代碼中包括目標(biāo)函數(shù)語句的代碼,所述目標(biāo)函數(shù)語句是指觸發(fā)至少兩個(gè)執(zhí)行條件的函數(shù)語句;
4、按照代碼執(zhí)行路徑對(duì)所述目標(biāo)代碼進(jìn)行拆分,得到多個(gè)子代碼,所述多個(gè)子代碼包括所述至少兩個(gè)執(zhí)行條件分別對(duì)應(yīng)的子代碼;
5、針對(duì)所述多個(gè)子代碼中的任意一個(gè)子代碼,生成與所述子代碼對(duì)應(yīng)的單元測(cè)試用例;
6、根據(jù)與所述多個(gè)子代碼一一對(duì)應(yīng)的多個(gè)單元測(cè)試用例,生成所述目標(biāo)代碼的測(cè)試用例。
7、本公開實(shí)施例通過按照代碼執(zhí)行路徑對(duì)目標(biāo)代碼進(jìn)行拆分,得到多個(gè)子代碼;生成與每個(gè)目標(biāo)代碼對(duì)應(yīng)的測(cè)試用例,并基于所有測(cè)試用例生成目標(biāo)代碼的測(cè)試用例,能夠使得生成的測(cè)試用例全面覆蓋代碼的所有邏輯分支,從而達(dá)到提高單元測(cè)試的測(cè)試效率和測(cè)試效果的目的。
8、在本公開實(shí)施例中,所述按照代碼執(zhí)行路徑對(duì)所述目標(biāo)代碼進(jìn)行拆分,得到多個(gè)子代碼,包括:
9、將所述目標(biāo)代碼轉(zhuǎn)換為對(duì)應(yīng)的抽象語法樹;
10、根據(jù)所述至少兩個(gè)執(zhí)行條件分別對(duì)所述抽象語法樹進(jìn)行拆分,得到多個(gè)子抽象語法樹,所述至少兩個(gè)執(zhí)行條件中任一執(zhí)行條件對(duì)應(yīng)的執(zhí)行功能對(duì)應(yīng)所述多個(gè)子抽象語法樹中的一個(gè)子抽象語法樹;
11、將所述多個(gè)子抽象語法樹分別進(jìn)行轉(zhuǎn)換,得到所述多個(gè)子代碼。
12、在本公開實(shí)施例中,所述目標(biāo)函數(shù)語句是以下任一:判斷函數(shù)語句、選擇函數(shù)語句和循環(huán)函數(shù)語句。
13、在本公開實(shí)施例中,所述目標(biāo)函數(shù)語句為所述判斷函數(shù)語句;所述根據(jù)所述至少兩個(gè)執(zhí)行條件分別對(duì)所述抽象語法樹進(jìn)行拆分,得到多個(gè)子抽象語法樹,包括:
14、當(dāng)所述抽象語法樹的多個(gè)子節(jié)點(diǎn)中存在所述判斷函數(shù)語句的判斷節(jié)點(diǎn)時(shí),確定與所述判斷節(jié)點(diǎn)對(duì)應(yīng)的肯定分支結(jié)構(gòu)和否定分支結(jié)構(gòu);
15、基于所述肯定分支結(jié)構(gòu),生成與所述肯定分支結(jié)構(gòu)對(duì)應(yīng)的第一子抽象語法樹;
16、基于所述否定分支結(jié)構(gòu),生成與所述否定分支結(jié)構(gòu)對(duì)應(yīng)的第二子抽象語法樹。
17、本公開實(shí)施例通過確定抽象語法樹中判斷節(jié)點(diǎn)所對(duì)應(yīng)的肯定分支結(jié)構(gòu)和否定分支結(jié)構(gòu),生成與之對(duì)應(yīng)的子抽象語法樹,有助于針對(duì)程序的不同分支生成測(cè)試用例,從而達(dá)到提高語句覆蓋率和分支覆蓋率的目的,也可以更精準(zhǔn)地測(cè)試程序在不同條件下的行為。
18、在本公開實(shí)施例中,所述目標(biāo)函數(shù)語句為所述選擇函數(shù)語句;所述根據(jù)所述至少兩個(gè)執(zhí)行條件分別對(duì)所述抽象語法樹進(jìn)行拆分,得到多個(gè)子抽象語法樹,包括:
19、當(dāng)所述抽象語法樹的多個(gè)子節(jié)點(diǎn)中存在所述選擇函數(shù)語句的選擇節(jié)點(diǎn)時(shí),確定與所述選擇節(jié)點(diǎn)對(duì)應(yīng)的多個(gè)類型分支結(jié)構(gòu);
20、針對(duì)所述多個(gè)類型分支結(jié)構(gòu)中的任意一個(gè)類型分支結(jié)構(gòu),基于所述類型分支結(jié)構(gòu),生成與所述類型分支結(jié)構(gòu)對(duì)應(yīng)的第三子抽象語法樹。
21、本公開實(shí)施例通過確定抽象語法樹中與選擇節(jié)點(diǎn)相對(duì)應(yīng)的多個(gè)類型分支結(jié)構(gòu),并生成與每個(gè)類型分支結(jié)構(gòu)相對(duì)應(yīng)的子抽象語法樹,生成多個(gè)子抽象語法樹可以確保測(cè)試路徑覆蓋到所有可能的執(zhí)行路徑,包括那些由不同條件分支組合形成的復(fù)雜路徑,從而達(dá)到提高條件覆蓋率的目的,進(jìn)而實(shí)現(xiàn)提高單元測(cè)試的測(cè)試效率和測(cè)試效果。
22、在本公開實(shí)施例中,所述目標(biāo)函數(shù)語句為所述循環(huán)函數(shù)語句;所述根據(jù)所述至少兩個(gè)執(zhí)行條件分別對(duì)所述抽象語法樹進(jìn)行拆分,得到多個(gè)子抽象語法樹,包括:
23、當(dāng)所述抽象語法樹的多個(gè)子節(jié)點(diǎn)中存在所述循環(huán)函數(shù)語句的目標(biāo)循環(huán)節(jié)點(diǎn)時(shí),確定與所述目標(biāo)循環(huán)節(jié)點(diǎn)對(duì)應(yīng)的目標(biāo)分支結(jié)構(gòu);所述目標(biāo)循環(huán)節(jié)點(diǎn)是指以原有變量作為截止判斷條件的循環(huán)節(jié)點(diǎn),所述目標(biāo)分支結(jié)構(gòu)包括所述目標(biāo)循環(huán)節(jié)點(diǎn),以及所述目標(biāo)循環(huán)節(jié)點(diǎn)的所有子節(jié)點(diǎn);
24、基于所述目標(biāo)分支結(jié)構(gòu),生成與所述目標(biāo)分支結(jié)構(gòu)對(duì)應(yīng)的第四子抽象語法樹。
25、在本公開實(shí)施例中,所述根據(jù)與所述多個(gè)子代碼一一對(duì)應(yīng)的多個(gè)單元測(cè)試用例,生成所述目標(biāo)代碼的測(cè)試用例,包括:
26、將所述多個(gè)單元測(cè)試用例進(jìn)行合并,得到所述目標(biāo)代碼的測(cè)試用例。
27、在本公開實(shí)施例中,在所述生成與所述子代碼對(duì)應(yīng)的單元測(cè)試用例之前,還包括:
28、獲取訓(xùn)練樣本;所述訓(xùn)練樣本包括多個(gè)樣本代碼,以及與所述多個(gè)樣本代碼一一對(duì)應(yīng)的多個(gè)樣本單元測(cè)試用例;
29、使用所述訓(xùn)練樣本訓(xùn)練初始模型,得到所述單元測(cè)試用例生成模型,所述單元測(cè)試用例生成模型用于根據(jù)所述子代碼生成單元測(cè)試用例。
30、在本公開實(shí)施例中,所述獲取訓(xùn)練樣本,包括:
31、獲取多個(gè)樣本代碼,以及與所述多個(gè)樣本代碼一一對(duì)應(yīng)的多個(gè)樣本單元測(cè)試用例;
32、針對(duì)所述多個(gè)樣本代碼中的任意一個(gè)樣本代碼,從所述樣本代碼中提取出對(duì)應(yīng)的特征向量;所述特征向量包括以下至少一種:結(jié)構(gòu)特征、語法特征以及邏輯復(fù)雜度特征;
33、將每個(gè)樣本代碼的特征向量,以及對(duì)應(yīng)的樣本單元測(cè)試用例作為所述訓(xùn)練樣本。
34、本公開第二方面的實(shí)施例提供了一種基于程序執(zhí)行路徑分解的測(cè)試用例生成裝置,包括:
35、代碼獲取模塊,用于獲取目標(biāo)代碼,所述目標(biāo)代碼中包括目標(biāo)函數(shù)語句的代碼,所述目標(biāo)函數(shù)語句是指觸發(fā)至少兩個(gè)執(zhí)行條件的函數(shù)語句;
36、代碼拆分模塊,用于按照代碼執(zhí)行路徑對(duì)所述目標(biāo)代碼進(jìn)行拆分,得到多個(gè)子代碼,所述多個(gè)子代碼包括所述至少兩個(gè)執(zhí)行條件分別對(duì)應(yīng)的子代碼;
37、單元測(cè)試用例生成模塊,用于針對(duì)所述多個(gè)子代碼中的任意一個(gè)子代碼,生成與所述子代碼對(duì)應(yīng)的單元測(cè)試用例;
38、測(cè)試用例生成模塊,用于根據(jù)與所述多個(gè)子代碼一一對(duì)應(yīng)的多個(gè)單元測(cè)試用例,生成所述目標(biāo)代碼的測(cè)試用例。
39、本公開第三方面的實(shí)施例提供了一種計(jì)算機(jī)設(shè)備,該計(jì)算機(jī)設(shè)備包括存儲(chǔ)器和處理器,所述存儲(chǔ)器和所述處理器之間互相通信連接,所述存儲(chǔ)器中存儲(chǔ)有計(jì)算機(jī)指令,所述處理器通過執(zhí)行所述計(jì)算機(jī)指令,從而執(zhí)行上述第一方面所述的基于程序執(zhí)行路徑分解的測(cè)試用例生成方法。
40、本公開第四方面的實(shí)施例提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上存儲(chǔ)有計(jì)算機(jī)指令,所述計(jì)算機(jī)指令用于使計(jì)算機(jī)執(zhí)行上述第一方面所述的基于程序執(zhí)行路徑分解的測(cè)試用例生成方法。
41、本公開附加的方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變的明顯,或通過本公開的實(shí)踐了解到。