欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于執(zhí)行序列的JUnit測(cè)試用例化簡(jiǎn)方法

文檔序號(hào):6601917閱讀:172來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):基于執(zhí)行序列的JUnit測(cè)試用例化簡(jiǎn)方法
技術(shù)領(lǐng)域
本發(fā)明屬于軟件測(cè)試中的測(cè)試用例化簡(jiǎn)技術(shù)領(lǐng)域,是一種針對(duì)Java程序的JUnit 測(cè)試用例化簡(jiǎn)方法。
背景技術(shù)
軟件測(cè)試是確保軟件質(zhì)量的重要手段。由于軟件開(kāi)發(fā)過(guò)程中程序員無(wú)法保證代碼的正確性,因此,軟件測(cè)試是軟件開(kāi)發(fā)階段必不可少的重要過(guò)程。另一方面,軟件測(cè)試代價(jià) 大,占整個(gè)軟件開(kāi)發(fā)和維護(hù)過(guò)程總開(kāi)銷(xiāo)的一半。JUnit是目前主流的針對(duì)Java程序的測(cè)試用例框架,當(dāng)前程序開(kāi)發(fā)人員多手工 或使用JTest,JCrasher, Randoop等工具自動(dòng)生成JUnit形式的測(cè)試用例來(lái)測(cè)試Java程 序。雖然測(cè)試用例生成工具可以方便快捷地為程序開(kāi)發(fā)人員隨機(jī)地生成大量的測(cè)試用例, 但是,大量測(cè)試用例的執(zhí)行會(huì)增大軟件測(cè)試的時(shí)間開(kāi)銷(xiāo)和資源開(kāi)銷(xiāo)。而且,當(dāng)軟件測(cè)試的時(shí) 間或資源受限時(shí),軟件測(cè)試過(guò)程有時(shí)也無(wú)法執(zhí)行所有這些大量的測(cè)試用例。為了有效地利 用現(xiàn)有的測(cè)試用例,在減少軟件測(cè)試各種開(kāi)銷(xiāo)的同時(shí)保證軟件測(cè)試的效果,需要對(duì)手工編 寫(xiě)或工具自動(dòng)生成的測(cè)試用例構(gòu)成的集合進(jìn)行化簡(jiǎn),這是本發(fā)明提出的動(dòng)機(jī)之一。在軟件開(kāi)發(fā)過(guò)程中,為了確保修改后的程序的正確性,程序開(kāi)發(fā)人員需要對(duì)修改 后的代碼進(jìn)行測(cè)試,這一過(guò)程稱(chēng)為回歸測(cè)試。在回歸測(cè)試過(guò)程中,程序員可以使用原程序的 JUnit測(cè)試用例來(lái)測(cè)試修改后的Java程序。但是,針對(duì)原程序的測(cè)試用例很多,為了減少回 歸測(cè)試的開(kāi)銷(xiāo),需要把針對(duì)原程序的JUnit測(cè)試用例進(jìn)行化簡(jiǎn),這是本發(fā)明提出的另一個(gè) 動(dòng)機(jī)。目前已有的測(cè)試用例化簡(jiǎn)技術(shù),主要是用于解決回歸測(cè)試過(guò)程中的測(cè)試用例化簡(jiǎn) 問(wèn)題,而不是一般的軟件測(cè)試過(guò)程。這些技術(shù)主要根據(jù)測(cè)試用例在原程序執(zhí)行過(guò)程中的結(jié) 構(gòu)性覆蓋(比如語(yǔ)句或分支覆蓋)對(duì)測(cè)試用例進(jìn)行化簡(jiǎn),從而保證化簡(jiǎn)前后的測(cè)試用例集 合能夠滿(mǎn)足相同的結(jié)構(gòu)性覆蓋。這種基于測(cè)試用例執(zhí)行信息的化簡(jiǎn)技術(shù),無(wú)法解決一般軟 件測(cè)試過(guò)程中的JUnit測(cè)試用例化簡(jiǎn)問(wèn)題,因?yàn)楹笳邲](méi)有辦法提供JUnit測(cè)試用例的執(zhí)行 fn息ο現(xiàn)有的Jupta技術(shù)是一種測(cè)試用例排序技術(shù),它可以擴(kuò)展用于測(cè)試用例化簡(jiǎn),但 是這一技術(shù)與本發(fā)明要解決的問(wèn)題不同。Jupta技術(shù)分析每條JUnit測(cè)試用例的靜態(tài)調(diào)用 圖,Jupta技術(shù)預(yù)知每條測(cè)試用例在執(zhí)行過(guò)程中可能執(zhí)行到的方法,以此為基礎(chǔ)計(jì)算每條測(cè) 試用例的揭錯(cuò)能力,并對(duì)測(cè)試用例集合進(jìn)行化簡(jiǎn)。使用Jupta技術(shù),化簡(jiǎn)后的測(cè)試用例集合 的揭錯(cuò)能力要明顯小于化簡(jiǎn)前。這是因?yàn)镴upta技術(shù)僅僅根據(jù)測(cè)試用例對(duì)單個(gè)方法的覆蓋 來(lái)選擇測(cè)試用例,可是程序中的某些故障不是源于單個(gè)方法本身的錯(cuò)誤,而是多個(gè)(至少 兩個(gè))方法的調(diào)用順序不當(dāng)。Jupta技術(shù)選出的測(cè)試用例無(wú)法保證揭示這類(lèi)故障,因此,使 用Jupta技術(shù)化簡(jiǎn)后的測(cè)試用例集合的揭錯(cuò)能力要小于原測(cè)試用例集合。

發(fā)明內(nèi)容
本發(fā)明的目的是給出一種測(cè)試用例化簡(jiǎn)技術(shù),針對(duì)JUnit形式的測(cè)試用例構(gòu)成的 集合T進(jìn)行化簡(jiǎn),并使化簡(jiǎn)后的測(cè)試用例構(gòu)成的集合T"能夠滿(mǎn)足下面幾個(gè)條件(I)T"對(duì)方法調(diào)用順序不當(dāng)導(dǎo)致的故障的揭錯(cuò)能力與T相同;(2)T"的揭錯(cuò)能力與T的揭錯(cuò)能力接近;(3)Τ〃是T的真子集。本發(fā)明的技術(shù)方案如下JUnit測(cè)試用例是一組方法和類(lèi)構(gòu)成的可執(zhí)行程序。本發(fā)明只關(guān)注每條JUnit測(cè) 試用例包含的方法以及它們之間的順序關(guān)系,忽略程序中的其他語(yǔ)句。不同于已有的測(cè)試 用例化簡(jiǎn)方法,本發(fā)明在測(cè)試用例化簡(jiǎn)前后不僅關(guān)注源于單個(gè)方法本身的故障,也關(guān)注源 于方法調(diào)用順序(比如push和pop之間順序調(diào)用關(guān)系)不當(dāng)引起的故障。本發(fā)明提出了 一種k-序列的表示方法來(lái)描述每條JUnit測(cè)試用例——體現(xiàn)了每條JUnit測(cè)試用例對(duì)方 法的調(diào)用順序,并將所有JUnit測(cè)試用例包含的方法調(diào)用序列作為化簡(jiǎn)前后需要保持不變 的條件,對(duì)JUnit測(cè)試用例集合進(jìn)行化簡(jiǎn),從而保證化簡(jiǎn)前后的測(cè)試用例集合都可以揭示 源于單個(gè)方法調(diào)用不當(dāng)和源于多個(gè)方法調(diào)用順序不當(dāng)?shù)腻e(cuò)誤。簡(jiǎn)單來(lái)說(shuō),本發(fā)明包括兩個(gè)步驟(1)使用k_序列的集合來(lái)表示JUnit測(cè)試用例集合中的每條測(cè)試用例;(2)對(duì)基于k-序列表示的JUnit測(cè)試用例集合進(jìn)行化簡(jiǎn)。下面分別介紹這兩個(gè)步驟的具體過(guò)程。(1)使用k_序列的集合表示每條JUnit測(cè)試用例首先介紹k_序列表示方法。序列的長(zhǎng)度指的是序列中成員的個(gè)數(shù)。長(zhǎng)度為k的 序列稱(chēng)為k-序列,記成[mi,m2,…,mk],其中Hii(KiSk)是這個(gè)序列的成員。位于不同 位置的成員有可能是同一方法。比如,k-序列的成員Hii和%(1彡i興j彡k)可能是同一 方法,只不過(guò)它們?cè)谶@個(gè)序列中的位置不同。接著,將每條JUnit測(cè)試用例拆分成若干條k-序列,再將每條JUnit測(cè)試用例表 示成若干個(gè)上述k-序列構(gòu)成的集合。具體地,形如JUnit測(cè)試用例T = [mi,m2,,-,mn]表示測(cè)試用例T中有η個(gè)方法 Hi1, m2, m3,…,mn被調(diào)用,它們的調(diào)用順序是Hli要比Hlj先被調(diào)用(i < j)。Α.如果測(cè)試用例T只有1個(gè)方法被調(diào)用,即T = [mj,那么它的序列表示如下眷如果k = 1,T的k-序列表示為{[mj}; 如果k > 1,T的k_序列表示為^ ^^^++們〃]};
於-1個(gè)B.如果測(cè)試用例T只有2個(gè)方法被調(diào)用,即T= Dvm2],那么它的序列表示如下 如果 k = 1,T 的 k-序列表示為{[mj,[m2]}; 如果 k = 2,T 的 k-序列表示為{[Iii1, m2]};眷如果k > 2,T 的 k-序列表示為{h,%,f^2++,4^d ;
t一 2個(gè)C.否則, 如果2<k<k+l <n,那么,先將T拆分成k-序列[Hi1,…,mk],[m2,…, mk+1], ...,[mn_k+1...,mn],然后T 表示成 Hm1, ...,mk],[m2, ...,mk+1],...,[mn_k+1...,mn] )■;
如果2彡k < k+1 = n,那么先將T拆分成k_序列[Hi1,…,mk],[m2,…,mk+1], 然后將T表示成{[IV…,mk],[m2,…,mk+1]}; 如果2彡k = n,那么先將T拆分成k-序列[Hi1,…,mk],然后將T表示成 {[m” …,mk]}; 如果k = 1,那么先將T拆分成k-序列[Hi1],[m2],…,[mn],然后將T表示成 {[mj , [m2],…,[mn]};參如果k > η > 3,那么先將T拆分成k_序列^” + ++,^^^^++,們〃]’然后將T表
it—η個(gè)
示成 t-η個(gè)(2)化簡(jiǎn)基于k-序列表示的JUnit測(cè)試用例集合。步驟如下1)根據(jù)JUnit測(cè)試用例包含的方法數(shù)將原測(cè)試用例集合T分成兩個(gè)不相交的子 集T1和T2,T1由方法數(shù)少于k的JUnit測(cè)試用例構(gòu)成,T2由方法數(shù)不少于k的JUnit測(cè)試 用例構(gòu)成。初始時(shí),化簡(jiǎn)后的測(cè)試用例集合T"為空;2)對(duì)于T1中的測(cè)試用例,選擇具有不同k-序列表示的JUnit測(cè)試用例來(lái)構(gòu)造集 合T3。即如果有多條JUnit測(cè)試用例具有相同的k-序列表示,從中任選一條JUnit測(cè)試 用例放入T3中;3)對(duì)于T2中的測(cè)試用例,首先統(tǒng)計(jì)T2中的所有測(cè)試用例的k_序列表示包含的方 法序列構(gòu)成集合R,使用如貪心算法在內(nèi)的任一化簡(jiǎn)算法,從T2中挑選出部分測(cè)試用例構(gòu)成 集合T4,使得R中任意方法序列都至少可以被T4中的某條測(cè)試用例對(duì)應(yīng)的k-序列表示包 含;
4)T3和T4兩集合的并就是化簡(jiǎn)后的JUnit測(cè)試用例集合T"。利用本發(fā)明提出的測(cè)試用例化簡(jiǎn)技術(shù),不僅可以如傳統(tǒng)的測(cè)試用例化簡(jiǎn)技術(shù)一樣 揭示單個(gè)方法上的故障,而且還可以揭示由于方法調(diào)用順序不當(dāng)引起的故障。本發(fā)明提出 的測(cè)試用例化簡(jiǎn)技術(shù)可以提高化簡(jiǎn)后測(cè)試用例集合的揭錯(cuò)能力,減少測(cè)試用例化簡(jiǎn)過(guò)程造 成的測(cè)試效果損失。


圖1為構(gòu)造JUnit測(cè)試用例的k-序列表示的流程圖;圖2為化簡(jiǎn)基于k-序列的JUnit測(cè)試用例集合的流程圖。
具體實(shí)施例方式下面用一個(gè)具體例子來(lái)對(duì)本發(fā)明作進(jìn)一步說(shuō)明,但本發(fā)明的范圍并不僅限于該例子。Java 類(lèi) IntStack 代碼如下public class IntStack{private iht [] store ;private int size ;
private static final int INITIAL_CAPACITY = 10 ;public IntStackO{this, store = new int[INITIAL_CAPACITY];this, size = 0 ;}public void push (int value){if (this, size = = this, store, length){int[]store = new int[this, store. length*2];System, arraycopy (this, store, 0, store, this, size);this, store = store ;}this, store [this, size++] = value ;}public int pop (){return this, store[—this.size];}...}JUnit測(cè)試用例代碼如下public class Testcases{...public void testl (){IntStack si = new IntStackO ;si. push (5);si. pop ();//Assertion ;}public void test2(){IntStack s2 = new IntStackO ;s2. push (3);//Assertion ;}
public void test3(){IntStack s3 = new IntStackO ;s3. pop ();//Assertion ;}}已知類(lèi)IntStack的JUnit測(cè)試用例集合T中包含testl,test2,和test3這三條 測(cè)試用例,本發(fā)明的目的在于對(duì)JUnit測(cè)試用例集合T(Τ = {testl, test2,test3})進(jìn)行化 簡(jiǎn)。下面按照上面給出的方案描述詳細(xì)解釋本發(fā)明的實(shí)施過(guò)程。(考慮到IntStack類(lèi)的特 點(diǎn),程序員選擇k = 2,即程序員只關(guān)心由于兩個(gè)方法調(diào)用順序不當(dāng)或者單個(gè)方法使用不 當(dāng)引起的錯(cuò)誤。)(1)使用2-序列的集合表示這三條測(cè)試用例。testl 調(diào)用的方法有 IntStackO,push (),禾口 pop (),因此,testl 表示成 {[IntStack (),push () ],[push (), pop () ]}。test2 調(diào)用的方法有 IntStack ()禾口 push (), 因此,test2 表示成{[IntStack (), push () ]}。test3 調(diào)用的方法有 IntStackO 禾口 pop(),因此,test3 表示成{[IntStack(), pop () ]} ο這三條測(cè)試用例包含的方法數(shù)目都不小于k(k = 2),因此,將上述三條測(cè)試用例 {[IntStackO , push()], [push (), pop () ]}, {[IntStack (), push () ]},禾口 {[IntStackO, pop()]}都放入集合T2中。(2)化簡(jiǎn)2-序列表示的JUnit測(cè)試用例集合。(2. 1)T2中的所有測(cè)試用例對(duì)應(yīng)的2-序列表示包含的序列包括[IntStackO, push () ],[push (),pop ()],禾口 [IntStack 0 , pop ()]。因此,集合 R = {[IntStack (), push () ], [push (), pop () ], [IntStack (), pop () ]}。(2. 2)使用貪心算法從T2中選擇少量測(cè)試用例使得R中的每個(gè)2-序列都可以被 選出測(cè)試用例對(duì)應(yīng)的2-序列表示包含。使用貪心算法,不難發(fā)現(xiàn)testl —定優(yōu)先被選出, 因?yàn)閠estl可以包含集合R中的兩個(gè)元素,而test2和test3分別只能包含R中一個(gè)元素。 于是,testl被選出放到集合T4中。(2.3)由于 testl 包含序列[IntStack (), push ()]和[push (),pop ()],因此,再?gòu)?T2中選擇測(cè)試用例時(shí),不必再考慮R中的這兩個(gè)元素。于是,接下來(lái)需要再選擇測(cè)試用例使 之包含R中的另一個(gè)元素[IntStackO,pop()]。顯然,只有test3能夠包含這一序列。于 是test3被選出放到集合T4中。(2. 4)T4包含測(cè)試用例testl和test3,并且R中的任意元素(2_序列)都可以被 T4中的測(cè)試用例對(duì)應(yīng)的2-序列包含。因此,對(duì)于集合T2的化簡(jiǎn)過(guò)程結(jié)束。由于1\為空,所 以T3也為空。所以,化簡(jiǎn)后的測(cè)試用例集合T"就是T4本身,S卩T〃 = {testl, test3}0雖然通過(guò)實(shí)施例詳細(xì)描述了本發(fā)明基于執(zhí)行序列的JUnit測(cè)試用例化簡(jiǎn)方法,但 是本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,本發(fā)明并不限于實(shí)施例中所公開(kāi)的內(nèi)容和范圍,在不脫離 本發(fā)明的實(shí)質(zhì)和精神范圍內(nèi),可以對(duì)本發(fā)明進(jìn)行各種變換、修改和替換。
權(quán)利要求
一種JUnit測(cè)試用例化簡(jiǎn)方法,化簡(jiǎn)后的測(cè)試用例是化簡(jiǎn)前測(cè)試用例的真子集,化簡(jiǎn)后的測(cè)試用例的揭錯(cuò)能力與化簡(jiǎn)前接近,其特征在于化簡(jiǎn)后的測(cè)試用例對(duì)方法調(diào)用順序不當(dāng)導(dǎo)致的故障的揭錯(cuò)能力與化簡(jiǎn)前相同;化簡(jiǎn)方法包括以下步驟第一步把JUnit測(cè)試用例集合中的每條測(cè)試用例都表示成一個(gè)k-序列的集合;第二步對(duì)第一步中得到的k-序列集合進(jìn)行化簡(jiǎn)。
2.如權(quán)利要求1所述的方法,其特征在于,第一步的實(shí)現(xiàn)方法為先將每條JUnit測(cè)試 用例拆分成多條k-序列,再將每條JUnit測(cè)試用例表示成多個(gè)k-序列構(gòu)成的集合。
3.如權(quán)利要求1或2所述的方法,其特征在于,對(duì)形如JUnit的測(cè)試用例T=[mi, m2,, ,mn],表示測(cè)試用例T中有n個(gè)方法n^,m2,m3, ,mn被調(diào)用,它們的調(diào)用順序是n^ 要比%先被調(diào)用(i < j),則把它表示成k-序列形式的過(guò)程如下A.如果測(cè)試用例T只有1個(gè)方法被調(diào)用,即T= [mj,那么它的序列表示如下 如果k= 1,T的k-序列表示為{[mj}; 如果k > 1,T的k-序列表示為;於-1個(gè)B.如果測(cè)試用例T只有2個(gè)方法被調(diào)用,即T= [mi, m2],那么它的序列表示如下 如果k= 1,T的k-序列表示為{[mj, [m2]}; 如果k = 2,T的k-序列表示為{[mi,m2]};參如果k > 2,T的k-序列表示為^, ^們〃]};k-2今C.否則, 如果2≤k < k+1 < n,那么,先將T拆分成k-序列:[mi,. [mn_k+1. . . , mn],然后奪 T 表示成{[m” ,mk], [m2, . . . , mk+1],. 如果2≤k < k+1 = n,那么先將T拆分成k-序列[mi, 后將 T 表示成{[m” …,mk], [m2, . . . , mk+1]}; 如果2≤k = n,那么先將T拆分成k-序列0V...,mk],然后將T表示成{[n^,..., mk]}。 如果k = 1,那么先將T拆分成k-序列[mi],[m2],. . .,[mn],然后將T表示成{[mj, [m2], . . . , [mj};參如果k > n > 3,那么先將T拆分成k-序列jA^+Mffe+ff] ’然后將T表示成k-n今{[講”…,/^,^^^..^^//]}。k-n今
4.如權(quán)利要求1所述的方法,其特征在于,第二步的實(shí)現(xiàn)步驟為1)根據(jù)JUnit測(cè)試用例包含的方法數(shù)將原測(cè)試用例集合T分成兩個(gè)不相交的子集 和T2,由方法數(shù)少于k的JUnit測(cè)試用例構(gòu)成,T2由方法數(shù)不少于k的JUnit測(cè)試用例 構(gòu)成,初始時(shí),化簡(jiǎn)后的測(cè)試用例集合T"為空;2)對(duì)于中的測(cè)試用例,選擇具有不同k-序列表示的JUnit測(cè)試用例來(lái)構(gòu)造集合T3, 即如果有多條JUnit測(cè)試用例具有相同的k-序列表示,從中任選一條JUnit測(cè)試用例放 入T3中;3)對(duì)于T2中的測(cè)試用例,首先統(tǒng)計(jì)T2中的所有測(cè)試用例的k-序列表示包含的方法序列構(gòu)成集合R,使用如貪心算法在內(nèi)的任一化簡(jiǎn)算法,從T2中挑選出部分測(cè)試用例構(gòu)成集合 T4,使得R中任意方法序列都至少可以被T4中的某條測(cè)試用例對(duì)應(yīng)的k-序列表示包含; 4)T3和T4兩集合的并就是化簡(jiǎn)后的JUnit測(cè)試用例集合T"。
全文摘要
本發(fā)明提供了一種基于執(zhí)行序列的JUnit測(cè)試用例化簡(jiǎn)方法,屬于軟件測(cè)試中的測(cè)試用例化簡(jiǎn)技術(shù)領(lǐng)域。本發(fā)明提出了一種k-序列的表示方法來(lái)描述每條JUnit測(cè)試用例,用以體現(xiàn)每條JUnit測(cè)試用例對(duì)方法的調(diào)用順序,并將所有JUnit測(cè)試用例包含的方法調(diào)用序列作為化簡(jiǎn)前后需要保持不變的條件,對(duì)JUnit測(cè)試用例集合進(jìn)行化簡(jiǎn),從而保證化簡(jiǎn)后的測(cè)試用例集合可以揭示源于單個(gè)方法調(diào)用不當(dāng)和源于多個(gè)方法調(diào)用順序不當(dāng)?shù)腻e(cuò)誤。本發(fā)明提出的測(cè)試用例化簡(jiǎn)技術(shù)可以提高化簡(jiǎn)后測(cè)試用例集合的揭錯(cuò)能力,減少測(cè)試用例化簡(jiǎn)過(guò)程造成的測(cè)試效果損失。
文檔編號(hào)G06F11/36GK101833508SQ20101016534
公開(kāi)日2010年9月15日 申請(qǐng)日期2010年5月7日 優(yōu)先權(quán)日2010年5月7日
發(fā)明者張令明, 張路, 梅宏, 郝丹 申請(qǐng)人:北京大學(xué)
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
金坛市| 五家渠市| 勃利县| 虞城县| 广宗县| 潍坊市| 安化县| 额济纳旗| 固阳县| 西丰县| 新源县| 揭阳市| 淮滨县| 桃江县| 谢通门县| 鸡西市| 清远市| 太原市| 泊头市| 廊坊市| 金沙县| 日喀则市| 纳雍县| 桦甸市| 康平县| 扶沟县| 开远市| 石泉县| 长岭县| 石棉县| 广丰县| 射阳县| 华坪县| 巢湖市| 德昌县| 台州市| 武宁县| 应城市| 思茅市| 牟定县| 巴中市|