本發(fā)明涉及計算機領(lǐng)域,具體而言,涉及一種生成測試用例的方法及裝置。
背景技術(shù):
如今,單元測試已成為軟件開發(fā)過程中不可缺少的一部分。為了對被測試的待測函數(shù)中所包含的函數(shù)模塊進行對應(yīng)的單元測試,目前常用的測試方式是針對待測函數(shù)中不同的函數(shù)模塊,由人工編寫對應(yīng)的測試用例實現(xiàn)對待測函數(shù)的單元測試。然而,當待測函數(shù)的數(shù)據(jù)量較大時,若仍然采用這種通過人工編寫測試用例的方式,一個一個編寫用于測試當前待測函數(shù)的測試用例時,測試效率明顯較低;此外,這種手動編寫的測試用例也無法保證實現(xiàn)對待測函數(shù)的全面覆蓋。
針對上述的問題,目前尚未提出有效的解決方案。
技術(shù)實現(xiàn)要素:
根據(jù)本申請實施例的一個方面,提供了一種生成測試用例的方法,包括:獲取待測函數(shù);遍歷上述待測函數(shù)中的函數(shù)語句,獲取進入上述待測函數(shù)中任意一個或多個分支時的測試條件;記錄由各個分支的測試條件構(gòu)成的表達式集合,其中,上述表達式集合中包含的一個表達式用于表征上述待測函數(shù)中對應(yīng)的一個分支的測試用例;根據(jù)上述表達式集合生成用于測試上述待測函數(shù)的測試用例集合。
根據(jù)本申請實施例的另一個方面,提供了一種生成測試用例的裝置,包括:第一獲取單元,用于獲取待測函數(shù);第二獲取單元,用于遍歷上述待測函數(shù)中的函數(shù)語句,獲取進入上述待測函數(shù)中任意一個或多個分支時的測試條件;記錄單元,用于記錄由各個分支的測試條件構(gòu)成的表達式集合,其中,上述表達式集合中包含的一個表達式用于表征上述待測函數(shù)中對應(yīng)的一個分支的測試用例;生成單元,用于根據(jù)上述表達式集合生成用于測試上述待測函數(shù)的測試用例集合。
在本申請實施例中,通過遍歷待測函數(shù)中的全部函數(shù)語句,獲取到進入待測函數(shù)中任意一個或多個分支時的測試條件,進一步,通過記錄由上述各個測試條件構(gòu)成的表達式集合,其中,表達式集合中的每一個表達式用于表征待測函數(shù)中對應(yīng)的一個分 支的測試用例,從而實現(xiàn)利用上述表達式集合中的表達式生成用于測試該待測函數(shù)的測試用例。也就是說,通過這種自動遍歷進入待測函數(shù)中任意一個或多個分支時的測試條件,記錄各個分支對應(yīng)的表達式,從而實現(xiàn)自動生成不同的測試用例,不僅大大提高了測試待測函數(shù)的測試效率,而且,遍歷函數(shù)語句還可以保證覆蓋到全部分支,進而實現(xiàn)提高測試覆蓋度的效果。進而解決了現(xiàn)有技術(shù)中通過手動編寫測試用例所導(dǎo)致的測試效率較低的技術(shù)問題。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當限定。在附圖中:
圖1是根據(jù)本申請實施例的一種可選的生成測試用例的方法的流程圖;
圖2是根據(jù)本申請實施例的一種可選的生成測試用例的方法的應(yīng)用場景示意圖;
圖3是根據(jù)本申請實施例的一種可選的生成測試用例的方法的示意圖;
圖4是根據(jù)本申請實施例的一種可選的生成測試用例的方法所涉及的待測函數(shù)的示意圖;
圖5是根據(jù)本申請實施例的一種可選的生成測試用例的裝置的示意圖;以及
圖6是根據(jù)本申請實施例的一種可選的生成測試用例的計算機終端的示意圖。
具體實施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當屬于本發(fā)明保護的范圍。
需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的本發(fā)明的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚 地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
實施例1
根據(jù)本發(fā)明實施例,還提供了一種生成測試用例的方法的實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
在本發(fā)明實施例中,圖1示出了上述生成測試用例的方法的流程圖,如圖1所示,該方法包括:
S102,獲取待測函數(shù);
S104,遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件;
S106,記錄由各個分支的測試條件構(gòu)成的表達式集合,其中,表達式集合中包含的一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例;
S108,根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合。
可選地,在本實施例中,上述生成測試用例的方法可以但不限于應(yīng)用于如圖2所示的應(yīng)用場景中,測試服務(wù)器202通過上述生成測試用例的方法生成對被測服務(wù)器204中的待測函數(shù)進行自動化測試的測試用例,從而實現(xiàn)對待測函數(shù)的自動化測試。其中,上述測試服務(wù)器202與被測服務(wù)器204可以為同一服務(wù)器,也就是說,測試服務(wù)器也可以對自身運行的待測函數(shù)進行自動化測試,本實施例對此不做任何限定。
具體而言,測試服務(wù)器在獲取到需要進行測試的待測函數(shù)后,通過遍歷待測函數(shù)中的全部函數(shù)語句,獲取到進入待測函數(shù)中任意一個或多個分支時的測試條件,進一步,通過記錄由上述各個測試條件構(gòu)成的表達式集合,其中,表達式集合中的每一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例,從而實現(xiàn)利用上述表達式集合中的表達式生成用于測試該待測函數(shù)的測試用例。也就是說,通過這種自動遍歷進入待測函數(shù)中任意一個或多個分支時的測試條件,記錄各個分支對應(yīng)的表達式,從而實現(xiàn)自動生成不同的測試用例,不僅大大提高了測試待測函數(shù)的測試效率,而且,遍歷函數(shù)語句還可以保證覆蓋到全部分支,進而實現(xiàn)提高測試覆蓋度的效果。
可選地,在本實施例中,在遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件時,還可以包括:根據(jù)由待測函數(shù)獲取到的測試條件建立與待測函數(shù)相匹配的樹狀結(jié)構(gòu)。通過將進入任意一個分支的測試條件存儲到對應(yīng) 的樹狀結(jié)構(gòu)的路徑節(jié)點中,以便于獲取由測試條件構(gòu)成的一個分支的表達式。其中,樹狀結(jié)構(gòu)中作為根節(jié)點的路徑節(jié)點中的測試條件與作為子節(jié)點的路徑節(jié)點中的測試條件具有嵌套關(guān)系。
進一步,記錄由各個分支的測試條件構(gòu)成的表達式集合可以包括但不限于:讀取樹狀結(jié)構(gòu)的各個分支路徑中各個路徑節(jié)點中的測試條件,其中一個分支路徑中的路徑節(jié)點記錄為一個表達式,樹狀結(jié)構(gòu)中的所有分支路徑的表達式構(gòu)成該待測函數(shù)的表達式集合。
例如,待測函數(shù)及其對應(yīng)的樹狀結(jié)構(gòu)可以如圖3所示,其中,在該待測函數(shù)中可以依次獲取到測試條件為:x>0、x<3,x≥3,result=null,result?。絥ull,x≤0。進一步,由上述樹狀結(jié)構(gòu)可以得出,該待測函數(shù)共包含四個分支。其中,由樹狀結(jié)構(gòu)的根節(jié)點讀取至最后一個葉子節(jié)點可以如下:第一分支的測試條件所構(gòu)成的表達式可以為:x>0,且x<3;第二分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result=null;第三分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result?。絥ull;第四分支的測試條件所構(gòu)成的表達式可以為:x≤0。將上述四個表達式記錄為獲取到的待測函數(shù)的表達式集合。
可選地,在本實施例中,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件可以包括但不限于:通過預(yù)先設(shè)置的條件關(guān)鍵字從待測函數(shù)的每一條函數(shù)語句中查找測試條件所在的函數(shù)語句,并從該函數(shù)語句中獲取測試條件存儲至樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中。例如,條件關(guān)鍵詞可以為:if、else等。
可選地,在本實施例中,根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合可以包括但不限于:依次獲取表達式集合中的表達式,分別按照每一個表達式生成一個對應(yīng)的測試用例??蛇x地,在本實施例中,在生成測試用例時,可以但不限于通過構(gòu)造每一個測試條件中的條件變量來模擬待測函數(shù)運行到該測試條件時的運行情況,例如,運行到第一個分支的第二個測試條件時,可以但不限于將條件變量構(gòu)造為x=5,直接構(gòu)造滿足測試條件的條件變量,從而實現(xiàn)在測試過程中進入該測試條件所在的分支,以達到準確測試該分支的目的。
通過本申請?zhí)峁┑膶嵤├?,通過遍歷待測函數(shù)中的全部函數(shù)語句,獲取到進入待測函數(shù)中任意一個或多個分支時的測試條件,進一步,通過記錄由上述各個測試條件構(gòu)成的表達式集合,其中,表達式集合中的每一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例,從而實現(xiàn)利用上述表達式集合中的表達式生成用于測試該待測函數(shù)的測試用例。也就是說,通過這種自動遍歷進入待測函數(shù)中任意一個或多個分支時的測試條件,記錄各個分支對應(yīng)的表達式,從而實現(xiàn)自動生成不同的測試用例,不 僅大大提高了測試待測函數(shù)的測試效率,而且,遍歷函數(shù)語句還可以保證覆蓋到全部分支,進而實現(xiàn)提高測試覆蓋度的效果。
作為一種可選的方案,步驟S108,根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合包括:
S1,將從表達式集合中依次讀取到的任意一個表達式作為當前表達式,并對當前表達式執(zhí)行以下步驟,以生成當前表達式所對應(yīng)的測試用例,直至遍歷完表達式集合中的表達式:
S12,獲取當前表達式中所涉及的測試條件中的條件變量,其中,條件變量包括以下至少之一:可構(gòu)造對象變量、非構(gòu)造對象變量;和
S14,在生成當前表達式所對應(yīng)的測試用例的過程中,在待測函數(shù)中測試條件的條件變量為可構(gòu)造對象變量時,直接構(gòu)造可構(gòu)造對象變量得到構(gòu)造后的條件變量,并將構(gòu)造后的變量作為當前表達式所對應(yīng)的測試用例中測試條件的條件變量,以生成當前表達式所對應(yīng)的測試用例;和/或,在待測函數(shù)中測試條件的條件變量為非構(gòu)造對象變量時,采用Mock函數(shù)模擬非構(gòu)造對象變量得到模擬后的條件變量,并將模擬后的條件變量作為當前表達式所對應(yīng)的測試用例中測試條件的條件變量,以生成當前表達式所對應(yīng)的測試用例;和
S16,將生成的當前表達式所對應(yīng)的測試用例存儲在用于測試待測函數(shù)的測試用例集合中,其中,測試用例集合中包括表達式集合中每一個表達式所對應(yīng)的測試用例。
可選地,在本實施例中,上述可構(gòu)造對象變量可以但不限于通過函數(shù)參數(shù)值設(shè)定。例如,x>3,則可以設(shè)定x=5,從而使所生成的測試用例在測試過程中可以直接進入該測試條件所在的分支??蛇x地,在本實施例中,上述非構(gòu)造對象變量可以但不限于調(diào)用函數(shù)調(diào)用結(jié)構(gòu)。例如,上述待測函數(shù)中的測試條件為:result=null,其中,result=utf8HexDecode(value),也就是說,條件變量中的參數(shù)是根據(jù)調(diào)用函數(shù)調(diào)用結(jié)果的變化而變化的,無法直接構(gòu)造,因而,在本實施例中,可以通過Mock函數(shù)模擬上述非構(gòu)造對象變量,例如,無論調(diào)用結(jié)果是什么,在運行到上述測試條件時,直接模擬result=null,或者result!=null。
可選地,在本實施例中,
上述步驟S2,在待測函數(shù)中測試條件的條件變量為可構(gòu)造對象變量時,直接構(gòu)造可構(gòu)造對象變量得到構(gòu)造后的條件變量包括:S22,在待測函數(shù)中條件變量所涉及的條件參數(shù)為常量參數(shù)時,直接構(gòu)造常量參數(shù),將構(gòu)造后的常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù);
上述步驟S2,在待測函數(shù)中測試條件的條件變量為非構(gòu)造對象變量時,采用Mock函數(shù)模擬非構(gòu)造對象變量得到模擬后的條件變量包括:S24,在條件變量所涉及的條件參數(shù)為變量參數(shù)時,通過Mock函數(shù)將變量參數(shù)模擬為常量參數(shù),將模擬后的常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù)。
也就是說,在本實施例中,上述可構(gòu)造對象變量中條件變量所涉及的條件參數(shù)為常量參數(shù),例如,x,y,z等;上述非構(gòu)造對象變量所涉及的條件參數(shù)為常量參數(shù),例如,result等調(diào)用函數(shù)。
通過本申請?zhí)峁┑膶嵤├?,通過從表達式集合中依次讀取一個表達式作為當前表達式,對當前表達式可以執(zhí)行如下步驟,直至遍歷完成表達式集合中的全部表達式:獲取當前表達式中每一個測試條件的條件變量,根據(jù)條件變量所涉及的變量參數(shù)的類型來確定如生成造測試用例中的測試條件,即在條件變量所涉及的條件參數(shù)為常量參數(shù)時,該條件變量為可構(gòu)造變量,則可直接構(gòu)造常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù);在條件變量所涉及的條件參數(shù)為變量參數(shù)時,該條件變量為非構(gòu)造變量,則可直接通過Mock函數(shù)將變量參數(shù)模擬為常量參數(shù),并將其作為測試用例中測試條件的條件變量的條件參數(shù)。通過上述分別與各個分支對應(yīng)的表達式,生成對應(yīng)的測試用例,從而得到覆蓋待測函數(shù)全部分支的測試用例集合,以實現(xiàn)提高測試覆蓋度的效果。
作為一種可選的方案,在步驟S106遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件時,還包括:
S1,根據(jù)由待測函數(shù)獲取到的測試條件建立與待測函數(shù)相匹配的樹狀結(jié)構(gòu),其中,樹狀結(jié)構(gòu)中的每一個路徑節(jié)點存儲一個測試條件,樹狀結(jié)構(gòu)中作為根節(jié)點的路徑節(jié)點中的測試條件與作為子節(jié)點的路徑節(jié)點中的測試條件具有嵌套關(guān)系。
可選地,在本實施例中,獲取待測函數(shù)中的測試條件以生成對應(yīng)的測試用例的過程中,可以借助二叉樹,即建立對應(yīng)的樹狀結(jié)構(gòu),也可以通過其他方式映射待測函數(shù)中各個分支的測試條件的對應(yīng)關(guān)系,從而便于生成與各個分支對應(yīng)的測試用例。需要說明的是,上述樹狀結(jié)構(gòu)僅是一種示例,在本實施例中對此不作任何限定。其中,上述與待測函數(shù)相匹配的樹狀結(jié)構(gòu)可以包括但不限于一個或多個樹狀結(jié)構(gòu)。
可選地,在本實施例中,根據(jù)由待測函數(shù)獲取到的測試條件建立與待測函數(shù)相匹配的樹狀結(jié)構(gòu)包括:
S12,依次讀取待測函數(shù)中的函數(shù)語句作為當前函數(shù)語句,對當前函數(shù)語句執(zhí)行以下步驟,直至讀完待測函數(shù)中的全部函數(shù)語句;
S121,判斷當前函數(shù)語句中是否包含測試條件;
S122,若當前函數(shù)語句中包含測試條件,則將測試條件對應(yīng)存儲到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中;
S123,獲取下一個函數(shù)語句作為當前函數(shù)語句。
可選地,在本實施例中,在遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件的同時,建立與該待測函數(shù)對應(yīng)的樹狀結(jié)構(gòu)。其中,需要說明的是,在上述樹狀結(jié)構(gòu)中,若相鄰兩個測試條件為嵌套關(guān)系,則上述測試條件在樹狀結(jié)構(gòu)中的路徑節(jié)點的關(guān)系對應(yīng)為根節(jié)點和子節(jié)點;若相鄰兩個測試條件不為嵌套關(guān)系,則上述測試條件在樹狀結(jié)構(gòu)中的路徑節(jié)點的關(guān)系對應(yīng)為并列節(jié)點,并列節(jié)點可以在同一個樹狀結(jié)構(gòu)中,也可以在不同的樹狀結(jié)構(gòu)中。
具體結(jié)合圖3所示進行說明,依次讀取圖3所示左側(cè)待測函數(shù)中的函數(shù)語句作為當前函數(shù)語句,并判斷讀取到的當前函數(shù)語句中是否包含測試條件,若判斷出包含,則將該測試條件存儲到圖3所示右側(cè)對應(yīng)的樹狀結(jié)構(gòu)的路徑節(jié)點中。例如,通過判斷得知當前函數(shù)語句“if(x≥3)”中包括測試條件“x≥3”,則將其存儲到樹狀結(jié)構(gòu)對應(yīng)的路徑節(jié)點中,如圖3所示。通過判斷得知當前函數(shù)語句“result=utf8HexDecode(value)”中并不包括測試條件,則直接獲取下一個函數(shù)語句作為當前函數(shù)語句。
通過本申請?zhí)峁┑膶嵤├?,通過遍歷的方式依次判斷各個函數(shù)語句中是否包括測試條件,實現(xiàn)全面覆蓋待測函數(shù),從而保證根據(jù)遍歷獲取到的測試條件所生成的測試用例的覆蓋度較高,可以覆蓋待測函數(shù)的全部分支,以克服現(xiàn)有技術(shù)中手動生成測試用例所導(dǎo)致的測試用例覆蓋度較低,影響測試結(jié)果準確性的問題。
作為一種可選的方案,步驟S121,判斷當前函數(shù)語句中是否包含測試條件包括:
S121-1,判斷當前函數(shù)語句中是否包括用于標識測試條件的條件關(guān)鍵字;
S121-2,若讀取到的當前函數(shù)語句中包括條件關(guān)鍵字,則判斷出當前函數(shù)語句為測試條件所在的函數(shù)語句。
可選地,在本實施例中,上述條件關(guān)鍵字可以包括但不限于:用于選擇分支的關(guān)鍵字,例如,if、else等。需要說明的是,在不同程序中用于選擇分支的程序代碼不同,所配置的條件關(guān)鍵字可以調(diào)整為不同內(nèi)容以適應(yīng)不同程序。上述僅是一種示例,本實施例對此不作任何限定。
通過本申請?zhí)峁┑膶嵤├?,通過預(yù)先配置的條件關(guān)鍵字,從待測函數(shù)中的函數(shù)語 句中獲取對應(yīng)的測試條件,從而保證準確獲取到待測函數(shù)中全部的測試條件,以得到待測函數(shù)中的全部分支,進而實現(xiàn)提高對待測函數(shù)測試的測試準確性。
作為一種可選的方案,步驟S122,將測試條件對應(yīng)存儲到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中包括:
S122-1,重復(fù)執(zhí)行以下步驟,直至獲取到測試條件在樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點:
S122-11,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件;
S122-12,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系;
S122-13,若當前函數(shù)語句中的測試條件與當前歷史測試條件具有嵌套關(guān)系,則將當前函數(shù)語句中的測試條件存儲到與當前歷史測試條件對應(yīng)的路徑節(jié)點的子節(jié)點中;
S122-14,若當前函數(shù)語句中的測試條件與當前歷史測試條件不具有嵌套關(guān)系,則判斷當前函數(shù)語句中的測試條件是否為樹狀結(jié)構(gòu)中的根節(jié)點;
S122-15,若當前函數(shù)語句中的測試條件是樹狀結(jié)構(gòu)中的根節(jié)點,則將當前函數(shù)語句中的測試條件存儲到新的樹狀結(jié)構(gòu)的根節(jié)點中;
S122-16,若當前函數(shù)語句中的測試條件不是樹狀結(jié)構(gòu)中的根節(jié)點,則重新獲取在當前歷史測試條件之前出現(xiàn)的相鄰的上一個測試條件作為下一個當前歷史測試條件。
具體結(jié)合圖3所示進行說明,假設(shè)當前函數(shù)語句獲取到的測試條件為result=null,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件,即,x≥3。進一步,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系,在判斷出具有嵌套關(guān)系后,將由當前函數(shù)語句獲取到的測試條件result=null,存儲到當前歷史測試條件x≥3對應(yīng)的路徑節(jié)點的子節(jié)點中,如圖3所示,二者具有從屬關(guān)系。
具體結(jié)合圖3所示進行說明,假設(shè)當前函數(shù)語句獲取到的測試條件為x<0,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件。進一步,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系,在判斷出不具有嵌套關(guān)系后,則判斷當前函數(shù)語句中的測試條件是否為樹狀結(jié)構(gòu)中的根節(jié)點;在當前函數(shù)語句中的測試條件是樹狀結(jié)構(gòu)中的根節(jié)點時,將當前函數(shù)語句中的測試條件存儲到新的樹狀結(jié)構(gòu)的根節(jié)點中,如圖3所示。
此外,若當前函數(shù)語句獲取到的測試條件與當前歷史測試條件不具有嵌套關(guān)系, 且當前函數(shù)語句中的測試條件不是樹狀結(jié)構(gòu)中的根節(jié)點,則將在當前歷史測試條件之前出現(xiàn)的相鄰的上一個測試條件作為下一個當前歷史測試條件,判斷當前函數(shù)語句中的測試條件與新獲取的當前歷史測試條件是否具有嵌套關(guān)系,依次類推,直至找到該當前函數(shù)語句獲取到的測試條件在樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點。
通過本申請?zhí)峁┑膶嵤├?,通過上述方式將讀取到的當前函數(shù)語句中的測試條件映射到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中,從而便于利用待測函數(shù)對應(yīng)的樹狀結(jié)構(gòu)獲取該待測函數(shù)對應(yīng)的表達式。
作為一種可選的方案,步驟S106,記錄由各個分支的測試條件構(gòu)成的表達式集合包括:
S1,讀取從樹狀結(jié)構(gòu)的根節(jié)點分別到每一個葉子節(jié)點的測試條件,其中,樹狀結(jié)構(gòu)的根節(jié)點到一個葉子節(jié)點之間的所有路徑節(jié)點構(gòu)成一個分支的路徑,葉子節(jié)點為分支的最后一個路徑節(jié)點;
S2,將每一條路徑中讀取到的測試條件作為與路徑對應(yīng)的分支的表達式,并存儲到待測函數(shù)的表達式集合中。
具體結(jié)合以下示例進行說明,例如,待測函數(shù)及其對應(yīng)的樹狀結(jié)構(gòu)可以如圖3所示,其中,在該待測函數(shù)中可以依次獲取到測試條件為:x>0、x<3,x≥3,result=null,result?。絥ull,x≤0。進一步,讀取從樹狀結(jié)構(gòu)的根節(jié)點分別到每一個葉子節(jié)點的測試條件所構(gòu)成的一個分支的路徑,作為與路徑對應(yīng)的分支的表達式。其中,由圖3所示樹狀結(jié)構(gòu)的根節(jié)點讀取至最后一個葉子節(jié)點可以如下:第一分支的測試條件所構(gòu)成的表達式可以為:x>0,且x<3;第二分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result=null;第三分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result?。絥ull;第四分支的測試條件所構(gòu)成的表達式可以為:x≤0。將上述四個表達式存儲到待測函數(shù)的表達式集合中。
通過本申請?zhí)峁┑膶嵤├?,利用由待測函數(shù)中的測試條件建立的樹狀結(jié)構(gòu)來映射出待測函數(shù)中各個分支中的測試條件之間的相對關(guān)系,從而更加便于生成該待測函數(shù)的測試用例,進而實現(xiàn)提高生成測試用例的效率的目的。
作為一種可選的實施方式,具體結(jié)合圖4所示待測函數(shù)進行說明:
例如,按照流程讀取待測函數(shù)handleEvent函數(shù)后,遍歷各個函數(shù)語句得到待測函數(shù)的表達式集合,共有3條記錄,具體如下:
1、函數(shù)從line 7結(jié)束,需要傳入的參數(shù)queue=null,value=any string
2、函數(shù)從line 12結(jié)束,需要傳入的參數(shù)queue!=null,value=any string,utf8HexDecode(value)返回不等于空的值。
3、函數(shù)從line 15結(jié)束。需要傳入的參數(shù)為queue?。絥ull,value=any string,utf8HexDecode(value)返回空。
其中,記錄1生成測試用例過程中不需要mock??梢灾苯油ㄟ^構(gòu)造條件變量生成一個測試用例;new一個類A的對象instance;調(diào)用instance的handleEvent函數(shù),并將queue的值設(shè)為null驗證handleEvent函數(shù)是否返回false。
此外,記錄2生成測試用例過程中需要mock。具體步驟:生成一個測試用例;new一個類A的對象instance;測試用例中mock utf8HexDecode函數(shù),使其返回一個非空值;測試用例中mock saveToDatabase函數(shù),使其接收任意參數(shù),并不做操作;調(diào)用instance的handleEvent函數(shù),并將queue的值設(shè)為非空;驗證handleEvent函數(shù)是否返回true。
而記錄3生成測試用例過程中需要mock。具體步驟:生成一個測試用例;new一個類A的對象instance;測試用例中mock utf8HexDecode函數(shù),使其返回一個空值;調(diào)用instance的handleEvent函數(shù),并將queue的值設(shè)為非空;驗證handleEvent函數(shù)是否返回false。
實施例2
根據(jù)本發(fā)明實施例,還提供了一種用于實施上述生成測試用例的方法的生成測試用例的裝置,如圖5所示,該裝置包括:
1)第一獲取單元502,用于獲取待測函數(shù);
2)第二獲取單元504,用于遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件;
3)記錄單元506,用于記錄由各個分支的測試條件構(gòu)成的表達式集合,其中,表達式集合中包含的一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例;
4)生成單元508,用于根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合。
可選地,在本實施例中,上述生成測試用例的方法可以但不限于應(yīng)用于如圖2所示的應(yīng)用場景中,測試服務(wù)器202通過上述生成測試用例的方法生成對被測服務(wù)器204中的待測函數(shù)進行自動化測試的測試用例,從而實現(xiàn)對待測函數(shù)的自動化測試。其中,上述測試服務(wù)器202與被測服務(wù)器204可以為同一服務(wù)器,也就是說,測試服務(wù)器也 可以對自身運行的待測函數(shù)進行自動化測試,本實施例對此不做任何限定。
具體而言,測試服務(wù)器在獲取到需要進行測試的待測函數(shù)后,通過遍歷待測函數(shù)中的全部函數(shù)語句,獲取到進入待測函數(shù)中任意一個或多個分支時的測試條件,進一步,通過記錄由上述各個測試條件構(gòu)成的表達式集合,其中,表達式集合中的每一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例,從而實現(xiàn)利用上述表達式集合中的表達式生成用于測試該待測函數(shù)的測試用例。也就是說,通過這種自動遍歷進入待測函數(shù)中任意一個或多個分支時的測試條件,記錄各個分支對應(yīng)的表達式,從而實現(xiàn)自動生成不同的測試用例,不僅大大提高了測試待測函數(shù)的測試效率,而且,遍歷函數(shù)語句還可以保證覆蓋到全部分支,進而實現(xiàn)提高測試覆蓋度的效果。
可選地,在本實施例中,在遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件時,還可以包括:根據(jù)由待測函數(shù)獲取到的測試條件建立與待測函數(shù)相匹配的樹狀結(jié)構(gòu)。通過將進入任意一個分支的測試條件存儲到對應(yīng)的樹狀結(jié)構(gòu)的路徑節(jié)點中,以便于獲取由測試條件構(gòu)成的一個分支的表達式。其中,樹狀結(jié)構(gòu)中作為根節(jié)點的路徑節(jié)點中的測試條件與作為子節(jié)點的路徑節(jié)點中的測試條件具有嵌套關(guān)系。
進一步,記錄由各個分支的測試條件構(gòu)成的表達式集合可以包括但不限于:讀取樹狀結(jié)構(gòu)的各個分支路徑中各個路徑節(jié)點中的測試條件,其中一個分支路徑中的路徑節(jié)點記錄為一個表達式,樹狀結(jié)構(gòu)中的所有分支路徑的表達式構(gòu)成該待測函數(shù)的表達式集合。
例如,待測函數(shù)及其對應(yīng)的樹狀結(jié)構(gòu)可以如圖3所示,其中,在該待測函數(shù)中可以依次獲取到測試條件為:x>0、x<3,x≥3,result=null,result?。絥ull,x≤0。進一步,由上述樹狀結(jié)構(gòu)可以得出,該待測函數(shù)共包含四個分支。其中,由樹狀結(jié)構(gòu)的根節(jié)點讀取至最后一個葉子節(jié)點可以如下:第一分支的測試條件所構(gòu)成的表達式可以為:x>0,且x<3;第二分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result=null;第三分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result!=null;第四分支的測試條件所構(gòu)成的表達式可以為:x≤0。將上述四個表達式記錄為獲取到的待測函數(shù)的表達式集合。
可選地,在本實施例中,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件可以包括但不限于:通過預(yù)先設(shè)置的條件關(guān)鍵字從待測函數(shù)的每一條函數(shù)語句中查找測試條件所在的函數(shù)語句,并從該函數(shù)語句中獲取測試條件存儲至樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中。例如,條件關(guān)鍵詞可以為:if、else等。
可選地,在本實施例中,根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合可以包括但不限于:依次獲取表達式集合中的表達式,分別按照每一個表達式生成一個對應(yīng)的測試用例。可選地,在本實施例中,在生成測試用例時,可以但不限于通過構(gòu)造每一個測試條件中的條件變量來模擬待測函數(shù)運行到該測試條件時的運行情況,例如,運行到第一個分支的第二個測試條件時,可以但不限于將條件變量構(gòu)造為x=5,直接構(gòu)造滿足測試條件的條件變量,從而實現(xiàn)在測試過程中進入該測試條件所在的分支,以達到準確測試該分支的目的。
通過本申請?zhí)峁┑膶嵤├?,通過遍歷待測函數(shù)中的全部函數(shù)語句,獲取到進入待測函數(shù)中任意一個或多個分支時的測試條件,進一步,通過記錄由上述各個測試條件構(gòu)成的表達式集合,其中,表達式集合中的每一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例,從而實現(xiàn)利用上述表達式集合中的表達式生成用于測試該待測函數(shù)的測試用例。也就是說,通過這種自動遍歷進入待測函數(shù)中任意一個或多個分支時的測試條件,記錄各個分支對應(yīng)的表達式,從而實現(xiàn)自動生成不同的測試用例,不僅大大提高了測試待測函數(shù)的測試效率,而且,遍歷函數(shù)語句還可以保證覆蓋到全部分支,進而實現(xiàn)提高測試覆蓋度的效果。
作為一種可選的方案,生成單元508包括:
1)第一處理模塊,用于將從表達式集合中依次讀取到的任意一個表達式作為當前表達式,并對當前表達式執(zhí)行以下步驟,以生成當前表達式所對應(yīng)的測試用例,直至遍歷完表達式集合中的表達式:獲取當前表達式中所涉及的測試條件中的條件變量,其中,條件變量包括以下至少之一:可構(gòu)造對象變量、非構(gòu)造對象變量;和在生成當前表達式所對應(yīng)的測試用例的過程中,在待測函數(shù)中測試條件的條件變量為可構(gòu)造對象變量時,直接構(gòu)造可構(gòu)造對象變量得到構(gòu)造后的條件變量,并將構(gòu)造后的變量作為當前表達式所對應(yīng)的測試用例中測試條件的條件變量,以生成當前表達式所對應(yīng)的測試用例;和/或,在待測函數(shù)中測試條件的條件變量為非構(gòu)造對象變量時,采用Mock函數(shù)模擬非構(gòu)造對象變量得到模擬后的條件變量,并將模擬后的條件變量作為當前表達式所對應(yīng)的測試用例中測試條件的條件變量,以生成當前表達式所對應(yīng)的測試用例;和將生成的當前表達式所對應(yīng)的測試用例存儲在用于測試待測函數(shù)的測試用例集合中,其中,測試用例集合中包括表達式集合中每一個表達式所對應(yīng)的測試用例。
可選地,在本實施例中,上述可構(gòu)造對象變量可以但不限于通過函數(shù)參數(shù)值設(shè)定。例如,x>3,則可以設(shè)定x=5,從而使所生成的測試用例在測試過程中可以直接進入該測試條件所在的分支。可選地,在本實施例中,上述非構(gòu)造對象變量可以但不限于調(diào)用函數(shù)調(diào)用結(jié)構(gòu)。例如,上述待測函數(shù)中的測試條件為:result=null,其中,result =utf8HexDecode(value),也就是說,條件變量中的參數(shù)是根據(jù)調(diào)用函數(shù)調(diào)用結(jié)果的變化而變化的,無法直接構(gòu)造,因而,在本實施例中,可以通過Mock函數(shù)模擬上述非構(gòu)造對象變量,例如,無論調(diào)用結(jié)果是什么,在運行到上述測試條件時,直接模擬result=null,或者result?。絥ull。
可選地,在本實施例中,
1)第一處理模塊通過以下步驟實現(xiàn)在待測函數(shù)中測試條件的條件變量為可構(gòu)造對象變量時,直接構(gòu)造可構(gòu)造對象變量得到構(gòu)造后的條件變量:在待測函數(shù)中條件變量所涉及的條件參數(shù)為常量參數(shù)時,直接構(gòu)造常量參數(shù),將構(gòu)造后的常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù);
2)第一處理模塊通過以下步驟實現(xiàn)在待測函數(shù)中測試條件的條件變量為非構(gòu)造對象變量時,采用Mock函數(shù)模擬非構(gòu)造對象變量得到模擬后的條件變量:在條件變量所涉及的條件參數(shù)為變量參數(shù)時,通過Mock函數(shù)將變量參數(shù)模擬為常量參數(shù),將模擬后的常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù)。
也就是說,在本實施例中,上述可構(gòu)造對象變量中條件變量所涉及的條件參數(shù)為常量參數(shù),例如,x,y,z等;上述非構(gòu)造對象變量所涉及的條件參數(shù)為常量參數(shù),例如,result等調(diào)用函數(shù)。
通過本申請?zhí)峁┑膶嵤├?,通過從表達式集合中依次讀取一個表達式作為當前表達式,對當前表達式可以執(zhí)行如下步驟,直至遍歷完成表達式集合中的全部表達式:獲取當前表達式中每一個測試條件的條件變量,根據(jù)條件變量所涉及的變量參數(shù)的類型來確定如生成造測試用例中的測試條件,即在條件變量所涉及的條件參數(shù)為常量參數(shù)時,該條件變量為可構(gòu)造變量,則可直接構(gòu)造常量參數(shù)作為測試用例中測試條件的條件變量的條件參數(shù);在條件變量所涉及的條件參數(shù)為變量參數(shù)時,該條件變量為非構(gòu)造變量,則可直接通過Mock函數(shù)將變量參數(shù)模擬為常量參數(shù),并將其作為測試用例中測試條件的條件變量的條件參數(shù)。通過上述分別與各個分支對應(yīng)的表達式,生成對應(yīng)的測試用例,從而得到覆蓋待測函數(shù)全部分支的測試用例集合,以實現(xiàn)提高測試覆蓋度的效果。
作為一種可選的方案,還包括:
1)建立單元,用于在遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件時,根據(jù)由待測函數(shù)獲取到的測試條件建立與待測函數(shù)相匹配的樹狀結(jié)構(gòu),其中,樹狀結(jié)構(gòu)中的每一個路徑節(jié)點存儲一個測試條件,樹狀結(jié)構(gòu)中作為根節(jié)點的路徑節(jié)點中的測試條件與作為子節(jié)點的路徑節(jié)點中的測試條件具有嵌套 關(guān)系。
可選地,在本實施例中,獲取待測函數(shù)中的測試條件以生成對應(yīng)的測試用例的過程中,可以借助二叉樹,即建立對應(yīng)的樹狀結(jié)構(gòu),也可以通過其他方式映射待測函數(shù)中各個分支的測試條件的對應(yīng)關(guān)系,從而便于生成與各個分支對應(yīng)的測試用例。需要說明的是,上述樹狀結(jié)構(gòu)僅是一種示例,在本實施例中對此不作任何限定。其中,上述與待測函數(shù)相匹配的樹狀結(jié)構(gòu)可以包括但不限于一個或多個樹狀結(jié)構(gòu)。
可選地,在本實施例中,建立單元包括:
1)第二處理模塊,用于依次讀取待測函數(shù)中的函數(shù)語句作為當前函數(shù)語句,對當前函數(shù)語句執(zhí)行以下步驟,直至讀完待測函數(shù)中的全部函數(shù)語句;判斷當前函數(shù)語句中是否包含測試條件;在當前函數(shù)語句中包含測試條件時,將測試條件對應(yīng)存儲到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中;獲取下一個函數(shù)語句作為當前函數(shù)語句。
可選地,在本實施例中,在遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件的同時,建立與該待測函數(shù)對應(yīng)的樹狀結(jié)構(gòu)。其中,需要說明的是,在上述樹狀結(jié)構(gòu)中,若相鄰兩個測試條件為嵌套關(guān)系,則上述測試條件在樹狀結(jié)構(gòu)中的路徑節(jié)點的關(guān)系對應(yīng)為根節(jié)點和子節(jié)點;若相鄰兩個測試條件不為嵌套關(guān)系,則上述測試條件在樹狀結(jié)構(gòu)中的路徑節(jié)點的關(guān)系對應(yīng)為并列節(jié)點,并列節(jié)點可以在同一個樹狀結(jié)構(gòu)中,也可以在不同的樹狀結(jié)構(gòu)中。
具體結(jié)合圖3所示進行說明,依次讀取圖3所示左側(cè)待測函數(shù)中的函數(shù)語句作為當前函數(shù)語句,并判斷讀取到的當前函數(shù)語句中是否包含測試條件,若判斷出包含,則將該測試條件存儲到圖3所示右側(cè)對應(yīng)的樹狀結(jié)構(gòu)的路徑節(jié)點中。例如,通過判斷得知當前函數(shù)語句“if(x≥3)”中包括測試條件“x≥3”,則將其存儲到樹狀結(jié)構(gòu)對應(yīng)的路徑節(jié)點中,如圖3所示。通過判斷得知當前函數(shù)語句“result=utf8HexDecode(value)”中并不包括測試條件,則直接獲取下一個函數(shù)語句作為當前函數(shù)語句。
通過本申請?zhí)峁┑膶嵤├ㄟ^遍歷的方式依次判斷各個函數(shù)語句中是否包括測試條件,實現(xiàn)全面覆蓋待測函數(shù),從而保證根據(jù)遍歷獲取到的測試條件所生成的測試用例的覆蓋度較高,可以覆蓋待測函數(shù)的全部分支,以克服現(xiàn)有技術(shù)中手動生成測試用例所導(dǎo)致的測試用例覆蓋度較低,影響測試結(jié)果準確性的問題。
作為一種可選的方案,第二處理模塊通過以下步驟實現(xiàn)判斷當前函數(shù)語句中是否包含測試條件包括:
S1,判斷當前函數(shù)語句中是否包括用于標識測試條件的條件關(guān)鍵字;
S2,若讀取到的當前函數(shù)語句中包括條件關(guān)鍵字,則判斷出當前函數(shù)語句為測試條件所在的函數(shù)語句。
可選地,在本實施例中,上述條件關(guān)鍵字可以包括但不限于:用于選擇分支的關(guān)鍵字,例如,if、else等。需要說明的是,在不同程序中用于選擇分支的程序代碼不同,所配置的條件關(guān)鍵字可以調(diào)整為不同內(nèi)容以適應(yīng)不同程序。上述僅是一種示例,本實施例對此不作任何限定。
通過本申請?zhí)峁┑膶嵤├?,通過預(yù)先配置的條件關(guān)鍵字,從待測函數(shù)中的函數(shù)語句中獲取對應(yīng)的測試條件,從而保證準確獲取到待測函數(shù)中全部的測試條件,以得到待測函數(shù)中的全部分支,進而實現(xiàn)提高對待測函數(shù)測試的測試準確性。
作為一種可選的方案,第二處理模塊通過以下步驟實現(xiàn)將測試條件對應(yīng)存儲到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中包括:
S3,重復(fù)執(zhí)行以下步驟,直至獲取到測試條件在樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點:
S3-1,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件;
S3-2,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系;
S3-3,若當前函數(shù)語句中的測試條件與當前歷史測試條件具有嵌套關(guān)系,則將當前函數(shù)語句中的測試條件存儲到與當前歷史測試條件對應(yīng)的路徑節(jié)點的子節(jié)點中;
S3-4,若當前函數(shù)語句中的測試條件與當前歷史測試條件不具有嵌套關(guān)系,則判斷當前函數(shù)語句中的測試條件是否為樹狀結(jié)構(gòu)中的根節(jié)點;
S3-5,若當前函數(shù)語句中的測試條件是樹狀結(jié)構(gòu)中的根節(jié)點,則將當前函數(shù)語句中的測試條件存儲到新的樹狀結(jié)構(gòu)的根節(jié)點中;
S3-6,若當前函數(shù)語句中的測試條件不是樹狀結(jié)構(gòu)中的根節(jié)點,則重新獲取在當前歷史測試條件之前出現(xiàn)的相鄰的上一個測試條件作為下一個當前歷史測試條件。
具體結(jié)合圖3所示進行說明,假設(shè)當前函數(shù)語句獲取到的測試條件為result=null,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件,即,x≥3。進一步,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系,在判斷出具有嵌套關(guān)系后,將由當前函數(shù)語句獲取到的測試條件result=null,存儲到當前歷史測試條件x≥3對應(yīng)的路徑節(jié)點的子節(jié)點中,如圖3所示,二者具有從屬關(guān)系。
具體結(jié)合圖3所示進行說明,假設(shè)當前函數(shù)語句獲取到的測試條件為x<0,獲取在當前函數(shù)語句之前出現(xiàn)的相鄰的上一個測試條件作為當前歷史測試條件。進一步,判斷當前函數(shù)語句中的測試條件與當前歷史測試條件是否具有嵌套關(guān)系,在判斷出不具有嵌套關(guān)系后,則判斷當前函數(shù)語句中的測試條件是否為樹狀結(jié)構(gòu)中的根節(jié)點;在當前函數(shù)語句中的測試條件是樹狀結(jié)構(gòu)中的根節(jié)點時,將當前函數(shù)語句中的測試條件存儲到新的樹狀結(jié)構(gòu)的根節(jié)點中,如圖3所示。
此外,若當前函數(shù)語句獲取到的測試條件與當前歷史測試條件不具有嵌套關(guān)系,且當前函數(shù)語句中的測試條件不是樹狀結(jié)構(gòu)中的根節(jié)點,則將在當前歷史測試條件之前出現(xiàn)的相鄰的上一個測試條件作為下一個當前歷史測試條件,判斷當前函數(shù)語句中的測試條件與新獲取的當前歷史測試條件是否具有嵌套關(guān)系,依次類推,直至找到該當前函數(shù)語句獲取到的測試條件在樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點。
通過本申請?zhí)峁┑膶嵤├ㄟ^上述方式將讀取到的當前函數(shù)語句中的測試條件映射到樹狀結(jié)構(gòu)中對應(yīng)的路徑節(jié)點中,從而便于利用待測函數(shù)對應(yīng)的樹狀結(jié)構(gòu)獲取該待測函數(shù)對應(yīng)的表達式。
作為一種可選的方案,記錄單元包括:
1)讀取模塊,用于讀取從樹狀結(jié)構(gòu)的根節(jié)點分別到每一個葉子節(jié)點的測試條件,其中,樹狀結(jié)構(gòu)的根節(jié)點到一個葉子節(jié)點之間的所有路徑節(jié)點構(gòu)成一個分支的路徑,葉子節(jié)點為分支的最后一個路徑節(jié)點;
2)記錄模塊,用于將每一條路徑中讀取到的測試條件作為與路徑對應(yīng)的分支的表達式,并存儲到待測函數(shù)的表達式集合中。
具體結(jié)合以下示例進行說明,例如,待測函數(shù)及其對應(yīng)的樹狀結(jié)構(gòu)可以如圖3所示,其中,在該待測函數(shù)中可以依次獲取到測試條件為:x>0、x<3,x≥3,result=null,result?。絥ull,x≤0。進一步,讀取從樹狀結(jié)構(gòu)的根節(jié)點分別到每一個葉子節(jié)點的測試條件所構(gòu)成的一個分支的路徑,作為與路徑對應(yīng)的分支的表達式。其中,由圖3所示樹狀結(jié)構(gòu)的根節(jié)點讀取至最后一個葉子節(jié)點可以如下:第一分支的測試條件所構(gòu)成的表達式可以為:x>0,且x<3;第二分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result=null;第三分支的測試條件所構(gòu)成的表達式可以為:x>0,且x≥3,result!=null;第四分支的測試條件所構(gòu)成的表達式可以為:x≤0。將上述四個表達式存儲到待測函數(shù)的表達式集合中。
通過本申請?zhí)峁┑膶嵤├?,利用由待測函數(shù)中的測試條件建立的樹狀結(jié)構(gòu)來映射出待測函數(shù)中各個分支中的測試條件之間的相對關(guān)系,從而更加便于生成該待測函數(shù) 的測試用例,進而實現(xiàn)提高生成測試用例的效率的目的。
實施例3
本發(fā)明的實施例可以提供一種計算機終端,該計算機終端可以是計算機終端群中的任意一個計算機終端設(shè)備??蛇x地,在本實施例中,上述計算機終端也可以替換為移動終端等終端設(shè)備。
可選地,在本實施例中,上述計算機終端可以位于計算機網(wǎng)絡(luò)的多個網(wǎng)絡(luò)設(shè)備中的至少一個網(wǎng)絡(luò)設(shè)備。
可選地,在本實施例中,如圖6所示,該計算機終端可以包括一個或多個處理器602(處理器602可以包括但不限于微處理器MCU或可編程邏輯器件FPGA等的處理裝置)、用于存儲數(shù)據(jù)的存儲器604、以及用于通信功能的傳輸模塊606。本領(lǐng)域普通技術(shù)人員可以理解,上述僅為示例,其并不對上述電子裝置的結(jié)構(gòu)造成限定。例如,計算機終端還可包括更多或者更少的組件,或者具有與所示示例不同的配置。
存儲器604可用于存儲應(yīng)用軟件的軟件程序以及模塊,例如,待測函數(shù)中的函數(shù)語句即記錄的表達式集合中的表達式,處理器602通過運行存儲在存儲器內(nèi)的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理,即實現(xiàn)上述的生成測試用例的方法中所涉及的生成測試用例的過程。存儲器604可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態(tài)存儲器。在一些實例中,存儲器604可進一步包括相對于處理器遠程設(shè)置的存儲器,這些遠程存儲器可以通過網(wǎng)絡(luò)連接至計算機終端。上述網(wǎng)絡(luò)的實例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動通信網(wǎng)及其組合。
傳輸裝置606用于經(jīng)由一個網(wǎng)絡(luò)接收或者發(fā)送數(shù)據(jù)。上述的網(wǎng)絡(luò)具體實例可包括計算機終端的通信供應(yīng)商提供的無線網(wǎng)絡(luò)。在一個實例中,傳輸裝置606可以但不限于包括一個網(wǎng)絡(luò)適配器(Network Interface Controller,NIC),其可通過基站與其他網(wǎng)絡(luò)設(shè)備相連從而可與互聯(lián)網(wǎng)進行通訊。在一個實例中,傳輸裝置606可以為射頻(Radio Frequency,RF)模塊,其用于通過無線方式與互聯(lián)網(wǎng)進行通訊。
需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到根據(jù)上述實施 例的方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當然也可以通過硬件,但很多情況下前者是更佳的實施方式?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)(如ROM/RAM、磁碟、光盤)中,包括若干指令用以使得一臺終端設(shè)備(可以是手機,計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。
實施例4
本發(fā)明的實施例還提供了一種存儲介質(zhì)??蛇x地,在本實施例中,上述存儲介質(zhì)可以用于保存上述實施例一所提供的生成測試用例的方法所執(zhí)行的程序代碼。
可選地,在本實施例中,上述存儲介質(zhì)可以位于計算機網(wǎng)絡(luò)中計算機終端群中的任意一個計算機終端中,或者位于移動終端群中的任意一個移動終端中。
可選地,在本實施例中,存儲介質(zhì)被設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:
S1,獲取待測函數(shù);
S2,遍歷待測函數(shù)中的函數(shù)語句,獲取進入待測函數(shù)中任意一個或多個分支時的測試條件;
S3,記錄由各個分支的測試條件構(gòu)成的表達式集合,其中,表達式集合中包含的一個表達式用于表征待測函數(shù)中對應(yīng)的一個分支的測試用例;
S4,根據(jù)表達式集合生成用于測試待測函數(shù)的測試用例集合。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
在本發(fā)明的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。
在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到 多個網(wǎng)絡(luò)單元上。可以根據(jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可為個人計算機、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。