王瑩瑩
(廣東機(jī)電職業(yè)技術(shù)學(xué)院信息工程學(xué)院,廣東 廣州 510515)
在這科技日新月異的時(shí)代,數(shù)據(jù)庫在各個(gè)領(lǐng)域發(fā)揮著極為重要的作用。數(shù)據(jù)庫是軟件程序的核心部分。軟件測試是保證軟件質(zhì)量的重要手段,數(shù)據(jù)庫測試已被高度重視。數(shù)據(jù)庫測試與傳統(tǒng)軟件測試有所區(qū)別。因?yàn)樵趯?shí)際應(yīng)用中,增、刪、改、查是最常用的數(shù)據(jù)操作,所以數(shù)據(jù)庫測試是要驗(yàn)證并確保數(shù)據(jù)的映射、事務(wù)的ACID屬性、數(shù)據(jù)的完整性及業(yè)務(wù)的準(zhǔn)確性,這些測試工作主要以SQL程序的方式進(jìn)行。設(shè)計(jì)、執(zhí)行測試用例要求有相應(yīng)的數(shù)據(jù)庫測試數(shù)據(jù)。理想的測試數(shù)據(jù)應(yīng)是實(shí)際的、有效的、覆蓋盡可能多的應(yīng)用場景的最小數(shù)據(jù)集合,并且包括某些特殊數(shù)據(jù)。
目前,已有不少成熟的專用測試數(shù)據(jù)生成工具可以快速產(chǎn)生大量有效的測試數(shù)據(jù)。如DataFactory能建立復(fù)雜數(shù)據(jù)關(guān)系,允許測試人員毫不費(fèi)力地產(chǎn)生百萬行有意義的測試數(shù)據(jù);在使用中首先讀取數(shù)據(jù)庫中表的schema,即表的定義之類的內(nèi)容,以列表的形式顯示;然后由用戶定制要產(chǎn)生數(shù)據(jù)的具體內(nèi)容,如數(shù)字范圍、字符串長度、要產(chǎn)生數(shù)據(jù)記錄的個(gè)數(shù)等;最后運(yùn)行工程,生成數(shù)據(jù)。再如TestDataBuilder可以幫助程序開發(fā)或測試人員自動(dòng)生成數(shù)據(jù)庫中的測試數(shù)據(jù),并且具有期望的值分布和列間相關(guān)性,生成的測試數(shù)據(jù)既能直接插入到數(shù)據(jù)表中,也能以Insert語句形式記錄在文件中。當(dāng)然,還可以使用自動(dòng)化測試工具、其它數(shù)據(jù)庫輔助工具等生成數(shù)據(jù)庫測試數(shù)據(jù)。但以上這些方法只能生成一般的測試數(shù)據(jù),很可能與實(shí)際測試工作中要執(zhí)行的測試用例無關(guān)。為了解決這一問題,Binning等人提出了 RQP和Multi-RQP(簡稱MRQP)方法,將Select查詢語句(組)、期望結(jié)果(組)與數(shù)據(jù)庫模式作為輸入,得到滿足該查詢語句(組)、期望結(jié)果(組)與數(shù)據(jù)庫模式的一個(gè)數(shù)據(jù)庫實(shí)例。
定義1(RQP) 給出一個(gè)SQL查詢語句Q和該語句相應(yīng)的期望結(jié)果R,以及一個(gè)關(guān)系數(shù)據(jù)庫模式S(包括數(shù)據(jù)庫的完整性約束),找到一個(gè)數(shù)據(jù)庫實(shí)例D,使得R=Q(D),同時(shí)D滿足S及其各種完整性約束。
定義2(Multi-RQP) 給出一組任意的SQL查詢語句Q={Q1,Q2,…,Qn}和這些語句相應(yīng)的一組期望結(jié)果 R={R1,R2,…,Rn},以及一個(gè)關(guān)系數(shù)據(jù)庫模式S(包括數(shù)據(jù)庫的完整性約束),找到一個(gè)數(shù)據(jù)庫實(shí)例D,使D對(duì)于任意一個(gè)Ri=Q(Di)(1≤i≤n),同時(shí)D滿足S及其各種完整性約束。
MRQP的數(shù)據(jù)生成算法如下:
其中,Q表示一組任意的SQL查詢語句;R表示和查詢語句組Q對(duì)應(yīng)的一組期望結(jié)果;S表示一個(gè)關(guān)系數(shù)據(jù)庫模式(包括數(shù)據(jù)庫的完整性約束);Query Refinements(Fi,RFi)表示對(duì)應(yīng)Q的查詢改進(jìn)語句組及其期望結(jié)果。
該算法首先生成一個(gè)空的數(shù)據(jù)庫實(shí)例D。接著檢查Q中的每一個(gè)查詢語句Qi是否存在查詢改進(jìn)語句Fi。如果存在,則遞歸調(diào)用MRQP,根據(jù)Fi、Rfi和S生成一個(gè)數(shù)據(jù)庫實(shí)例DFi,然后調(diào)整Ri(從原來的Ri中移除Qi在DFi上的查詢結(jié)果),調(diào)整Qi使Qi與Fi不相交。跟著,將原來的D與DFi及使用RQP(根據(jù)調(diào)整后的Qi,調(diào)整后的Ri與S)得到的數(shù)據(jù)庫實(shí)例合并,生成新的D。如果合并出錯(cuò),或合并后的D不滿足主鍵約束或唯一約束,則返回錯(cuò)誤,否則返回?cái)?shù)據(jù)庫實(shí)例D。
成功使用MRQP生成數(shù)據(jù)庫測試數(shù)據(jù)有一個(gè)前提:查詢語句組Q必須為RQP-disjoint,即查詢語句組中Q的任意一對(duì)查詢語句(Qj,Qk)(j≠k)必須為RQP-disjoint。如果由Qj定義的視圖的更新獨(dú)立于用RQP(Qk,Rk,S)方法得到的任意更新操作(如 insert語句),反之亦然,則這對(duì)查詢語句(Qj,Qk)為RQP-disjoint。
例如數(shù)據(jù)庫模式S為:
現(xiàn)有兩個(gè)查詢語句與相應(yīng)的期望結(jié)果:
可見,即使R1、R2變?yōu)槠渌?,Q1的視圖更新獨(dú)立于I2,Q2的視圖更新獨(dú)立于 I1。因此 Q1和 Q2為RQP-disjoint。
通過對(duì) Q1和 R1,Q2和 R2應(yīng)用 MRQP,最終得到數(shù)據(jù)庫測試數(shù)據(jù)如下,滿足數(shù)據(jù)庫模式與完整性約束,如表1和表2所示。
表1 book表中的數(shù)據(jù)
表2 course表中的數(shù)據(jù)
在實(shí)際測試工作中,找到符合數(shù)據(jù)庫實(shí)際應(yīng)用場景且滿足RQP-disjoint的一組查詢語句并不容易。如,將上例中的 Q1和 R1,Q2和 R2變?yōu)?
則可能使用MRPQ生成的數(shù)據(jù)庫實(shí)例滿足數(shù)據(jù)庫模式的完整性約束,但不符合實(shí)際應(yīng)用場景,如表3、表4所示。
表3 book表中的數(shù)據(jù)
表4 course表中的數(shù)據(jù)
在表4中的列bookid值均為'b0000001',表示該課程所用的教材編號(hào)均為'b0000001',即均使用'VB'這本書,雖滿足與表book主鍵列bookid的參照完整性,卻不符合實(shí)際授課所用教材的實(shí)際情況。
為此,可引入對(duì)應(yīng)Q的Query Refinement,即查詢改進(jìn)語句組。在上例中,已有Q1和R1,Q2和R2的基礎(chǔ)上增加查詢改進(jìn)語句F21及期望查詢結(jié)果RF21(對(duì)應(yīng)Q2):
應(yīng)用MRQP生成數(shù)據(jù)庫測試數(shù)據(jù)的過程如下:
D1(即 RQP(Q1,R1,S)):得到的結(jié)果如表3 所示。
DF21(即 MRQP(F21,RF21,S)):得到的表 book 的數(shù)據(jù)與表3相同,表course中的數(shù)據(jù)如表5所示。
表5 course表中的數(shù)據(jù)
R2(即 R2Q2(DF21)):為空;
D2(即 RQP(Q2,R2,S)∪DF21):其中 RQP(Q2,R2,S)的結(jié)果與表5相同,該結(jié)果與DF21合并后則得到表book(詳見表3)與表course(詳見表5)。
最終得到的數(shù)據(jù)庫測試數(shù)據(jù)為D1∪D2,即表book(詳見表3)與表course(詳見表5)。
MRQP方法只能針對(duì)查詢語句生成數(shù)據(jù)庫實(shí)例,無法對(duì)其他數(shù)據(jù)操作(增、刪、改等)生成測試數(shù)據(jù)。如果能把插入語句、刪除語句、修改語句轉(zhuǎn)化為等價(jià)的查詢語句,那么問題就基本解決了。
例如,根據(jù)前面的例子,設(shè)有Delete語句:delete from course where courseid=‘c0000001’,若要使該刪除操作成功,那么數(shù)據(jù)庫實(shí)例中應(yīng)有courseid值為‘c0000001’的記錄。則可將該刪除語句轉(zhuǎn)化為對(duì)應(yīng)的查詢語句select*from course where courseid=‘c0000001’,期望結(jié)果包含courseid值為‘c0000001’的記錄(如{<‘c0000001’,‘VB programming’,3,54,‘b0000001’>}。類似地,可將插入語句、修改語句轉(zhuǎn)化為等價(jià)的查詢語句。之后,應(yīng)用MRQP方法求得相應(yīng)的測試數(shù)據(jù)庫。
通過以上應(yīng)用分析可知,成功使用MRQP生成數(shù)據(jù)庫測試數(shù)據(jù)要求符合 RQP-disjoint,具有Query Refinement。但在實(shí)際測試工作中,面對(duì)大型數(shù)據(jù)庫測試,找到符合數(shù)據(jù)庫實(shí)際應(yīng)用場景且滿足RQP-disjoint的查詢語句組以及Query Refinement,確實(shí)比較繁瑣、困難。因此,進(jìn)一步的研究方向應(yīng)是考慮根據(jù)非RQP-disjoint的任意查詢語句組生成數(shù)據(jù)庫測試數(shù)據(jù)的方法,其中的關(guān)鍵就是保證表間參照完整性。
[1]Vijay.Tips to Design Test Data Before Executing Your Test Cases[EB/OL].http://www.softwaretestinghelp.com/tips-to-design-test-data-before-executing-your-test-cases,2008-01-29.
[2]Carsten Binning,Donail Kossmann,Eric Lo.Reverse query processing[C]//IEEE 23rd International Conference on Data Engineering.Washington,DC:ICDE,2007:506-515.
[3]Carsten Binning,Donail Kossmann,Eric Lo.Multi-RQP generating test database for the functional testing of OLTP applications[C]//Proceeding of the 1st International Wordshop on Testing Database Systems.Newwork:ACM,2008:1-6.
[4]馮麗云,洪玫,楊秋輝,等.基于逆向查詢處理算法的數(shù)據(jù)庫系統(tǒng)測試數(shù)據(jù)生成方法[J].計(jì)算機(jī)應(yīng)用,2011,31(4):948-951.
[5]董敏,畢盛,齊德昱.基于正則表達(dá)式的測試數(shù)據(jù)自動(dòng)生成技術(shù)[J].計(jì)算機(jī)工程,2009,35(16):29-31.
[6]朱如龍.SQL Server 2005數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社,2010.
[7]鞏文化,畢學(xué)軍,劉娟.基于數(shù)據(jù)庫的快速測試數(shù)據(jù)生成方法研究[J].電腦知識(shí)與技術(shù),2010,6(4):775-777.
[8]曾明,洪玫,王卓,等.數(shù)據(jù)庫系統(tǒng)測試中測試用例的自動(dòng)規(guī)范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(15):3577-3580.
[9]陳鄭珍.基于數(shù)據(jù)庫應(yīng)用系統(tǒng)的數(shù)據(jù)庫測試[J].科技與生活,2012(15):112.
[10]何湘智,郭得廣,王榮春.一種基于數(shù)據(jù)庫的測試程序自動(dòng)生成設(shè)計(jì)[J].機(jī)械工程與自動(dòng)化,2010(5):166-167.
[11]李征宇,陳磊.數(shù)據(jù)庫性能評(píng)測指標(biāo)及其測試方法研究[J].電子設(shè)計(jì)工程,2011,19(4):4-5.
[12]費(fèi)雯悅.一種基于改進(jìn)遺傳算法的測試用例自動(dòng)生成研究[J].北京石油化工學(xué)院學(xué)報(bào),2011,19(4):43-48.
[13]陳劍.基于RQP的測試數(shù)據(jù)庫生成技術(shù)研究[D].長沙:長沙大學(xué),2010.
[14]潘福霞.大型關(guān)系數(shù)據(jù)庫自動(dòng)化測試方法研究[D].武漢:華中科技大學(xué),2009.