利用規(guī)則集網(wǎng)絡(luò)生成測試用例的裝置和方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及信息處理技術(shù)領(lǐng)域,更具體地涉及一種利用規(guī)則集網(wǎng)絡(luò)生成測試用例 的裝置和方法。
【背景技術(shù)】
[0002] 在業(yè)務(wù)規(guī)則管理系統(tǒng)(Business Rule Management System,BRMS)中,業(yè)務(wù)邏輯是 通過規(guī)則(Rules)的形式來表示的。BRMS使得用戶可以通過修改規(guī)則而不是修改代碼來改 變業(yè)務(wù)邏輯。由于業(yè)務(wù)規(guī)則相對于代碼來說更便于業(yè)務(wù)專家理解和修改,因此BRMS相對于 傳統(tǒng)軟件來說更加靈活。通過將實例(Facts)與規(guī)則的條件進(jìn)行模式匹配,BRMS規(guī)則引擎 可以找出滿足條件的實例和相應(yīng)的規(guī)則,并在解決沖突后執(zhí)行規(guī)則。其中,Rete是規(guī)則引 擎中的模式匹配算法之一,它通過在節(jié)點之間共享部分匹配結(jié)果來提高模式匹配的效率。
[0003] 對于BRMS來說,其中一個問題是如何對規(guī)則進(jìn)行測試以保證這些規(guī)則的正確性、 完整性和一致性。傳統(tǒng)的BRMS測試方法,如OpenRules,要求用戶手動創(chuàng)建測試用例,這是 很消耗時間的,而且也達(dá)不到很好的覆蓋率。
[0004] 因此,人們希望有一種方法可以自動地生成測試用例,并能夠全面地對規(guī)則進(jìn)行 測試。然而,針對傳統(tǒng)軟件的測試用例自動生成方法并不能適用于BRMS。對于傳統(tǒng)軟件而 言,邏輯通過函數(shù)或方法來描述,因此可以對這些函數(shù)或方法進(jìn)行測試來保證軟件質(zhì)量。同 時,由于函數(shù)或方法明確規(guī)定了輸入輸出參數(shù),所以很容易根據(jù)這些輸入輸出來生成測試 用例。但是,對于BRMS而言,邏輯是通過規(guī)則的條件和動作來表示的,并且規(guī)則的輸入是隱 含地通過對工作內(nèi)存中存在的實例的期望來指定的。從條件和動作中生成測試用例并不 容易,因為與根據(jù)函數(shù)或方法來生成測試用例不同的是,在生成測試用例之前需要計算出 針對每個類需要生成多少個實例才能覆蓋對所有規(guī)則的測試,以及確定實例每個屬性的取 值。
【發(fā)明內(nèi)容】
[0005] 在下文中給出了關(guān)于本發(fā)明的簡要概述,以便提供關(guān)于本發(fā)明的某些方面的基本 理解。但是,應(yīng)當(dāng)理解,這個概述并不是關(guān)于本發(fā)明的窮舉性概述。它并不是意圖用來確定 本發(fā)明的關(guān)鍵性部分或重要部分,也不是意圖用來限定本發(fā)明的范圍。其目的僅僅是以簡 化的形式給出關(guān)于本發(fā)明的某些概念,以此作為稍后給出的更詳細(xì)描述的前序。
[0006] 鑒于現(xiàn)有技術(shù)的上述情形,本發(fā)明的目的是提供一種利用規(guī)則集網(wǎng)絡(luò)生成測試用 例的裝置和方法,以實現(xiàn)在BRMS中自動生成測試用例。
[0007] 為了實現(xiàn)上述目的,根據(jù)本發(fā)明的一個方面,提供了一種利用規(guī)則集網(wǎng)絡(luò)生成測 試用例的裝置,其中所述規(guī)則集網(wǎng)絡(luò)包括根節(jié)點、一個或多個中間節(jié)點以及一個或多個終 端節(jié)點,并且各個節(jié)點設(shè)置有各自的局部約束,所述裝置包括:遍歷單元,其被配置用于通 過遍歷所述規(guī)則集網(wǎng)絡(luò)來計算各個節(jié)點的全局約束,其中各個節(jié)點的全局約束通過組合其 祖先節(jié)點的局部約束和其自身的局部約束而得到;實例信息獲取單元,其被配置用于根據(jù) 所述終端節(jié)點的全局約束,獲取用于生成測試用例的實例信息,其中所述實例信息包括需 要包含在測試用例中的實例集以及每個實例屬性的取值范圍;以及測試用例生成單元,其 被配置用于根據(jù)所述實例信息,生成測試用例。
[0008] 根據(jù)本發(fā)明的另一個方面,還提供了一種利用規(guī)則集網(wǎng)絡(luò)生成測試用例的方法, 其中所述規(guī)則集網(wǎng)絡(luò)包括根節(jié)點、一個或多個中間節(jié)點以及一個或多個終端節(jié)點,并且各 個節(jié)點設(shè)置有各自的局部約束,所述方法包括:通過遍歷所述規(guī)則集網(wǎng)絡(luò)來計算各個節(jié)點 的全局約束,其中各個節(jié)點的全局約束通過組合其祖先節(jié)點的局部約束和其自身的局部約 束而得到;根據(jù)所述終端節(jié)點的全局約束,獲取用于生成測試用例的實例信息,其中所述實 例信息包括需要包含在測試用例中的實例集以及每個實例屬性的取值范圍;以及根據(jù)所述 實例信息,生成測試用例。
[0009] 根據(jù)本發(fā)明的另一個方面,還提供了用于實現(xiàn)上述利用規(guī)則集網(wǎng)絡(luò)生成測試用例 的方法的計算機(jī)程序產(chǎn)品。
[0010] 根據(jù)本發(fā)明的另一個方面,還提供了計算機(jī)可讀介質(zhì),其上記錄有用于實現(xiàn)上述 利用規(guī)則集網(wǎng)絡(luò)生成測試用例的方法的計算機(jī)程序代碼。
[0011] 根據(jù)本發(fā)明的上述技術(shù)方案,可以有效地實現(xiàn)在BRMS中自動生成測試用例。
【附圖說明】
[0012] 本發(fā)明可以通過參考下文中結(jié)合附圖所給出的詳細(xì)描述而得到更好的理解,其中 在所有附圖中使用了相同或相似的附圖標(biāo)記來表示相同或者相似的部件。所述附圖連同下 面的詳細(xì)說明一起包含在本說明書中并形成說明書的一部分,用來進(jìn)一步舉例說明本發(fā)明 的優(yōu)選實施例和解釋本發(fā)明的原理和優(yōu)點。在附圖中:
[0013] 圖1是示出根據(jù)本發(fā)明實施例的生成測試用例的裝置的一種示例結(jié)構(gòu)的框圖;
[0014] 圖2是示意性地示出Rete網(wǎng)絡(luò)的示例圖;
[0015] 圖3是示出全局約束所包含的各種類型的約束之間的關(guān)系的示意圖;
[0016] 圖4是示出根據(jù)本發(fā)明實施例的生成測試用例的方法的一種示例性處理的流程 圖;以及
[0017] 圖5是示出其中實現(xiàn)本發(fā)明的計算機(jī)的示例性結(jié)構(gòu)的框圖。
[0018] 本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,附圖中的元件僅僅是為了簡單和清楚起見而示出的, 而且不一定是按比例繪制的。例如,附圖中某些元件的尺寸可能相對于其它元件放大了,以 便有助于提高對本發(fā)明實施例的理解。
【具體實施方式】
[0019] 在下文中將結(jié)合附圖對本發(fā)明的示范性實施例進(jìn)行描述。為了清楚和簡明起見, 在說明書中并未描述實際實施方式的所有特征。然而,應(yīng)該了解,在開發(fā)任何這種實際實施 例的過程中必須做出很多特定于實施方式的決定,以便實現(xiàn)開發(fā)人員的具體目標(biāo),例如,符 合與系統(tǒng)及業(yè)務(wù)相關(guān)的那些限制條件,并且這些限制條件可能會隨著實施方式的不同而有 所改變。此外,還應(yīng)該了解,雖然開發(fā)工作有可能是非常復(fù)雜和費時的,但對得益于本公開 內(nèi)容的本領(lǐng)域技術(shù)人員來說,這種開發(fā)工作僅僅是例行的任務(wù)。
[0020] 在此,還需要說明的一點是,為了避免因不必要的細(xì)節(jié)而模糊了本發(fā)明,在附圖中 僅僅示出了與根據(jù)本發(fā)明的方案密切相關(guān)的裝置結(jié)構(gòu)和/或處理步驟,而省略了與本發(fā)明 關(guān)系不大的其他細(xì)節(jié)。
[0021] 如上文所述,現(xiàn)有技術(shù)中自動生成測試用例的方法并不能適用于BRMS。本發(fā)明提 出了一種利用規(guī)則集網(wǎng)絡(luò)生成測試用例的裝置和方法,其能夠通過遍歷規(guī)則集網(wǎng)絡(luò)為業(yè)務(wù) 規(guī)則生成測試用例,有效地實現(xiàn)了在BRMS中自動生成測試用例。
[0022] 下面以Rete網(wǎng)絡(luò)作為規(guī)則集網(wǎng)絡(luò)的例子來描述根據(jù)本發(fā)明實施例的生成測試用 例的裝置和方法。但是,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)清楚,本發(fā)明也可以適用于除Rete網(wǎng)絡(luò)之 外的其他規(guī)則集網(wǎng)絡(luò)。
[0023] 下面結(jié)合圖1來詳細(xì)描述根據(jù)本發(fā)明實施例的生成測試用例的裝置的一個示例。
[0024] 如圖1所示,根據(jù)本發(fā)明實施例的生成測試用例的裝置100包括遍歷單元110、實 例信息獲取單元120以及測試用例生成單元130。
[0025] 首先,需要做如下的準(zhǔn)備工作:獲取用戶提供的業(yè)務(wù)規(guī)則,并將由業(yè)務(wù)規(guī)則構(gòu)成的 規(guī)則集編譯成Rete網(wǎng)絡(luò)。
[0026] 然后,可以將該Rete網(wǎng)絡(luò)輸入到遍歷單元110,遍歷單元110可以通過遍歷該 Rete網(wǎng)絡(luò)得到每個節(jié)點的全局約束。實例信息獲取單元120可以根據(jù)各個終端節(jié)點的全局 約束,獲取用于生成測試用例的實例信息。測試用例生成單元130可以根據(jù)所獲得的實例 的信息生成測試用例。
[0027] 如上所述,生成測試用例的裝置100是基于遍歷Rete網(wǎng)絡(luò)來生成測試用例的。因 此,以下先對Rete網(wǎng)絡(luò)以及遍歷Rete網(wǎng)絡(luò)的方案進(jìn)行介紹。
[0028] Rete網(wǎng)絡(luò)是一種有向無環(huán)圖,是規(guī)則的高級表示形式。它包含一個根節(jié)點(也稱為 Rete節(jié)點),一個或多個中間節(jié)點(包括entry point節(jié)點、object type節(jié)點、alpha節(jié)點、 beta節(jié)點、left input adapter節(jié)點、right input adapter節(jié)點等)以及多個終端節(jié)點。 beta節(jié)點又分為join節(jié)點、not節(jié)點、exists節(jié)點、accumulate節(jié)點等。
[0029] 以下以舉例的方式對Rete網(wǎng)絡(luò)進(jìn)行說明。一個規(guī)則集示例(其由兩條簡單的用 drools規(guī)則語言寫成的規(guī)則構(gòu)成)如下:
[0030]
[0031]
end
[0032] 對于上述規(guī)則集,其對應(yīng)的Rete網(wǎng)絡(luò)參見圖2所示,該Rete網(wǎng)絡(luò)包含一個根節(jié)點 (Rete)、多個中間節(jié)點以及兩個終端節(jié)點(TerminalNode)。中間節(jié)點包括entry point節(jié) 點(EntryPointNode)、object type 節(jié)點(ObjectTypeNode)、alpha節(jié)點(AlphaNode)、beta 節(jié)點(JoinNode)和 left input adapter 節(jié)點(LeftInputAdapterNode) 〇
[0033] 實例從根節(jié)點進(jìn)入Rete網(wǎng)絡(luò)。當(dāng)一個節(jié)點接收到一個實例時,它會檢查該實 例與先到達(dá)該節(jié)點的其它實例(如果有的話)一起是否滿足該節(jié)點的局部約束(Local Constraint, LC)。如果滿足,那么這個節(jié)點就會接受這個實例,并將這個使得其局部約束被 滿足的實例集合傳輸給其所有子節(jié)點。一直重復(fù)這個過程,直到某些實例到達(dá)某個終端節(jié) 點。如果某些實例能夠到達(dá)某個終端節(jié)點,那么該終端節(jié)點對應(yīng)的規(guī)則就會被這些實例激 活并被添加到?jīng)_突集中等待解決沖突并執(zhí)行。也就是說,每個終端節(jié)點對應(yīng)一條規(guī)則(每 條規(guī)則可能會對應(yīng)多個終端節(jié)點),例如:圖2中的終端節(jié)點TerminalNode(8)對應(yīng)"find experienced golfer"這條規(guī)則,而終端節(jié)點 TerminalNode(17)對應(yīng)"find solution"這 條規(guī)則。
[0034] Rete網(wǎng)絡(luò)中節(jié)點的局部約束與該節(jié)點的類型有關(guān)。例如,對于object type節(jié)點, 其局部約束為對象類型。對于alpha節(jié)點,其局部約束為屬性名稱、比較符、屬性值或?qū)傩?邊界值組成的三元組。例如,在局部約束(name, ==,"Fred")中,"name"是屬性的名稱, "=="是比較符,"Fred"是屬性值。對于join節(jié)點、not節(jié)點、exists節(jié)點和accumulate節(jié) 點,局部約束為實例之間的關(guān)系。對于left input adapter節(jié)點,其局部約束為空(Φ),因 為它僅僅負(fù)責(zé)將單個的實例轉(zhuǎn)換成一個實例的元組以便作為beta節(jié)點的左邊輸入。對于 根節(jié)點、entry point節(jié)點以及終端節(jié)點,其局部約束都為空。
[0035] 以圖2所示的Rete網(wǎng)絡(luò)為例,可以得到如表1所示的各個節(jié)點的局部約束。
[0036] 表 1 :
[0037]
[0038]
[0039] 在Rete網(wǎng)絡(luò)中,如果某些實例能夠到達(dá)一個節(jié)點并被該節(jié)點接受,那么這些實例 必然滿足這個節(jié)點及其所有祖先節(jié)點的所有局部約束。本發(fā)明中將