專利名稱:一種基于程序運(yùn)行域的軟件測試方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件測試的方法,尤其是一種基于程序運(yùn)行域的軟件 測試方法。
技術(shù)背景軟件測試是軟件開發(fā)流程中的一個(gè)大環(huán)節(jié)。以測試型態(tài)來做分類的話,可以分成建構(gòu)性測試(Construction Testing)、系統(tǒng)測試(System Testing) 以及特殊測試(SpecialTesting)。建構(gòu)性測試是屬于前置性的測試,主要是 偏重于程序端的功能測試,以確保程序執(zhí)行運(yùn)作正常。系統(tǒng)測試是屬于中 后期的整合測試,所進(jìn)行的測試是以使用者的觀點(diǎn)為主,也就是模擬外界 的使用者會如何的使用產(chǎn)品。特殊測試所進(jìn)行的測試需要花費(fèi)更多的時(shí)間 與人力才能完成。就測試模式而言,可分為白盒測試(White Box Testing)與黑盒測試 (Black Box Testing)。這兩種方式的測試方向是不同的,白盒測試是以源 程序結(jié)構(gòu)為主,而黑盒測試是以程序的功能為主。白盒測試也稱為結(jié)構(gòu)性測試(StmcturalTesting),白盒測試有兩大層面 數(shù)據(jù)流面(Data Flow Coverage)以及控制流程面(Control Flow Coverage), 數(shù)據(jù)流面就是測試數(shù)據(jù)在系統(tǒng)的進(jìn)出于程序內(nèi)所經(jīng)過的流程,控制流程面 就是測試程序在執(zhí)行過程中每個(gè)階段的流程。進(jìn)行黑盒測試時(shí),測試人員并不需要對軟件的結(jié)構(gòu)性有足夠深層的了 解,所進(jìn)行的測試是著重于軟件的功能面,所以也有人稱之為功能測試。 為了要控制黑盒測試的執(zhí)行,測試人員必須要按照測試案例(TestCases) 來逐一進(jìn)行,所以測試案例(TestCases)設(shè)計(jì)的好壞就會直接影響到測試 結(jié)果。軟件項(xiàng)目有其不同其它項(xiàng)目的特殊性,例如產(chǎn)品的不可視性、產(chǎn)品執(zhí)行路徑的無窮性、產(chǎn)品質(zhì)量檢測的不可完全性、導(dǎo)致軟件產(chǎn)品質(zhì)量很難完 美保證。對于項(xiàng)目較小的或者對質(zhì)量要求不太高的項(xiàng)目而言,手工方式一 般也能達(dá)到預(yù)期的效果。但是隨著產(chǎn)品系統(tǒng)的不斷龐雜,功能的不斷增加, 同時(shí)用戶對產(chǎn)品質(zhì)量要求的提高,導(dǎo)致必須考慮采用新的測試方式方法去適應(yīng)這一需求。軟件產(chǎn)品的復(fù)雜性,導(dǎo)致在軟件產(chǎn)品整合及送交質(zhì)量部門剛開始測試 時(shí),大量的錯(cuò)誤(bug)出現(xiàn),這些bug需要開發(fā)工程師、測試工程師、開發(fā)主管、測式主管、項(xiàng)目經(jīng)理去處理,浪費(fèi)大量的人力,物力等。一般而言,在產(chǎn)品送測初期產(chǎn)生的bug占到總bug量的70-80%左右, 因此如何快速的、自動化的提早發(fā)現(xiàn)這些bug,是提高產(chǎn)品質(zhì)量、縮短開 發(fā)測試周期以及提高客戶滿意度的關(guān)鍵。要檢驗(yàn)開發(fā)的軟件是否有bug,可以采取各種不同的測試策略。但是, 不論采用哪一種測試策略,設(shè)計(jì)測試方案都是測試階段最關(guān)鍵問題。測試 以前都需要從過程定義域中選取有代表性的測試數(shù)據(jù),這也是測試成功與 否的關(guān)鍵。 發(fā)明內(nèi)容為了解決背景技術(shù)中所述的技術(shù)問題,本發(fā)明提供了一種可快速、自 動化的提早發(fā)現(xiàn)軟件中的bug的軟件測試方法。本發(fā)明的技術(shù)解決方案是本發(fā)明是一種基于程序運(yùn)行域的軟件測試 方法,其特殊之處在于該方法包括以下步驟1) 、首先取得源程序的功能域;2) 、接著對源程序進(jìn)行分析,留下與一變量有關(guān)的語句,形成等價(jià)程序;3) 、根據(jù)步驟2)中形成的等價(jià)程序,取得等價(jià)程序的運(yùn)行域;4) 、最后比較源程序的功能域與等價(jià)程序的運(yùn)行域是否完全重合,如 果不重合,說明軟件存在故障或錯(cuò)誤。上述步驟l)中取得源程序的功能域具體步驟如下 1.1)首先逐行讀入源程序的語句;1.2) 接著讀取源程序的函數(shù),判斷讀入的語句是否為函數(shù),若不是函 數(shù),則返回步驟l.l),若是函數(shù)則進(jìn)至步驟1.3);1.3) 建立函數(shù)參數(shù)表;1.4) 建立函數(shù)調(diào)用表;1.5) 建立變量表;1.6) 建立復(fù)合語句表;1.7) 判斷函數(shù)的讀取是否結(jié)束,如果結(jié)束則迸至步驟1.8),如果沒有 結(jié)束則執(zhí)行步驟1.6);1.8) 、判斷源程序是否讀取結(jié)束,若結(jié)束則進(jìn)至步驟2),若未結(jié)束,則返回步驟l.l)。上述步驟2)中形成等價(jià)程序的具體步驟如下2.1) 掃瞄步驟1.5)所建立的變量表;2.2) 根據(jù)步驟2.1)所掃描的變量表取得一個(gè)變量;2.3) 讀入源程序的一行語句;2.4) 判斷讀入的語句是否與步驟2.2)所取得的變量是否有關(guān),若無 關(guān),則返回步驟2.3)繼續(xù)讀入源程序的語句,若有關(guān)則進(jìn)至步驟2.5);2.5) 記錄至源程序中;2.6) 判斷源程序讀取是否結(jié)束,若未結(jié)束,則回到步驟2.3)繼續(xù)讀 入源程序,若結(jié)束,則進(jìn)至步驟2.7);2.7) 判斷變量表的變量是否讀取完畢,若未讀取完畢,則返回步驟2.2), 若讀取完畢,則進(jìn)至步驟3)。本發(fā)明提出了一種基于程序功能域的運(yùn)行域的測試數(shù)據(jù)自動確定的方 法,該方法通過分析每一個(gè)應(yīng)用源程序的變量類型,完成對應(yīng)用程序功能 域的取得,通過對應(yīng)用程序本身運(yùn)行語句進(jìn)行分析,來獲取其運(yùn)行域,獲 取有代表性的測試數(shù)據(jù)去執(zhí)行測試,來發(fā)現(xiàn)程序中的問題點(diǎn)。由于本發(fā)明 實(shí)現(xiàn)了快速、自動化的提早發(fā)現(xiàn)軟件中的bug,節(jié)省了大量的人力、物力, 所以提高了產(chǎn)品質(zhì)量、縮短了開發(fā)測試周期,提高了客戶滿意度。
圖l是本發(fā)明的檢測流程圖。 圖2是取得源程序P的功能域的流程圖。 圖3是本發(fā)明形成等價(jià)源程序P'的流程圖。
具體實(shí)施方式
在開始說明本發(fā)明之前,先對本發(fā)明所使用的術(shù)語作一簡介與說明。每個(gè)軟件產(chǎn)品或項(xiàng)目都定義有非常詳盡的規(guī)格書(specification),規(guī)格書中 定義有模塊的具體功能及其詳細(xì)的要求范圍,在源程序(source code)中 也會對每個(gè)相關(guān)參數(shù)聲明其具體的類型,可稱之為功能域。各個(gè)程序執(zhí)行 時(shí)都有其運(yùn)行的覆蓋范圍,可稱之為運(yùn)行域?;谝?guī)范的功能測試和基于程序的結(jié)構(gòu)測試是兩類常用的軟件測試方 法。功能測試根據(jù)規(guī)格說明書設(shè)計(jì)測試范例,檢查程序的每一功能是否按 照規(guī)范的要求正確地執(zhí)行。它以軟件規(guī)范為依據(jù)選取測試數(shù)據(jù),其正確性 依賴于規(guī)范的正確性,通過功能域與程序運(yùn)行域的不同范圍,可選擇有代 表性的測試數(shù)據(jù)對程序進(jìn)行測試,從而大量的節(jié)省選擇測試數(shù)據(jù)的時(shí)間。規(guī)格書是對軟件輸入、輸出的定義,而軟件程序則說明實(shí)現(xiàn)規(guī)范的算 法和數(shù)據(jù)結(jié)構(gòu)。雖然軟件規(guī)范規(guī)定了輸入變量的定義域(輸入域),但程序 實(shí)現(xiàn)本身也定義了其定義域。系統(tǒng)在需求階段是由功能域來定義的,而在 開發(fā)和運(yùn)作中是由運(yùn)行域來描述的。軟件規(guī)范給定的功能是定義在輸入空 間的一個(gè)所謂功能域上,而被測程序本身定義了輸入空間的一個(gè)運(yùn)行域。 如果功能域與運(yùn)行域不能完全重合,那么軟件的故障或錯(cuò)誤(bug)就可檢 測出來。參見圖l:本發(fā)明包括以下步驟1) 首先取得源程序P的功能域;2) 根據(jù)步驟1取得的源程序P的功能域,對源程序P進(jìn)行分析,留下 與某一變量有關(guān)的語句,形成等價(jià)程序P',其主要是基于輸入變量以產(chǎn)生 靜態(tài)程序并剔除與輸入變量無關(guān)的語句及函數(shù);3) 根據(jù)步驟2)取得的等價(jià)程序P',取得等價(jià)程序P'的運(yùn)行域。4) 最后比較源程序P的功能域與等價(jià)程序P,的運(yùn)行域是否重合,以得到比較結(jié)果,如果功能域與運(yùn)行域不能完全重合,那么說明軟件在此處存在故障或錯(cuò)誤(bug)。參見圖2,本發(fā)明取得源程序的功能域具體步驟如下 首先逐行讀入源程序P的語句(步驟1.1),接著讀取源程序P的函數(shù),首先判斷讀入的語句是否為函數(shù)(步驟1.2),若不是函數(shù),則繼續(xù)讀入源程序P(步驟l.l)。如果是所讀入的源程序P為函數(shù),則建立函數(shù)參數(shù)表(步驟1.3),并建立函數(shù)調(diào)用表(步驟1.4)、變量表(步驟1.5)、與復(fù)合 語句表(步驟1.6)。步驟1.2)至而步驟1.3)是用來取得源程序P中的函 數(shù);而步驟1.3)至步驟1.6)主要建立數(shù)據(jù)流分析所需的源程序的各種紀(jì) 錄。接著判斷所讀取的函數(shù)是否結(jié)束(步驟1.7)。若未結(jié)束,則繼續(xù)建立 復(fù)合語句表(步驟1.6),若函數(shù)已結(jié)束,則判斷源程序P是否讀取結(jié)束(步 驟1.8),若讀取結(jié)束,則結(jié)束,若未結(jié)束,則回到步驟1.1),繼續(xù)讀入源 程序P。參見圖3:本發(fā)明形成等價(jià)程序的具體步驟如下首先,將掃瞄步驟1.5)所建立的變量表(步驟2.1),以取得一個(gè)變量 (步驟2.2)。接著讀入源程序P的一行語句(步驟2.3),并判斷所讀入的 語句是與步驟2.2)所取得的變量有關(guān)(步驟2.4),若無關(guān),則繼續(xù)讀入源 程序P的語句,若有關(guān),則記錄至源程序P'中(步驟2.5)。接著判斷源 程序P是否讀取結(jié)束(步驟2.6),若未結(jié)束,則回到步驟2.3),繼續(xù)讀入 源程序P。若讀取結(jié)束,則判斷變量表中的變量是否讀取完畢(步驟2.7)。 若讀取完畢,則結(jié)束,若未讀取完畢,則繼續(xù)取得下一個(gè)變量后重復(fù)上述 的步驟2.2)至步驟2.6)。本發(fā)明中,如果函數(shù)中有一些表達(dá)式及其它一些數(shù)學(xué)函數(shù),則應(yīng)該依 據(jù)輸入空間的范圍進(jìn)行選擇劃分。一般而言,輸入空間可以劃分為四部份,即E二E1UE2UE3UE4,其中E2={x |xe }E3={x IxED們nDp》 E4={x|xEnDm-|DP}Df表示輸入變量的功能域,Dp表示運(yùn)行域。El表示規(guī)范與程序有相同的輸入子域,但實(shí)現(xiàn)與說明是否一致,還需進(jìn)一步測試。E2表明程序產(chǎn)生了一個(gè)結(jié)果,但規(guī)范并沒有要求。對于這種情況,可 補(bǔ)充規(guī)范或者縮小其程序的運(yùn)行域。E3表明規(guī)范的某些要求,程序沒有處理。E4關(guān)于例外處理,即規(guī)范既未要求,程序也無從處理對于規(guī)范未指明 的輸入,程序可能產(chǎn)生不可預(yù)料的結(jié)果。因此,在可靠的軟件程序中,例 外處理為必要的程序。根據(jù)以上的說明書,源程序P以文件形式讀入,再建立關(guān)于源程序P 的各種變量紀(jì)錄,并依據(jù)紀(jì)錄提供的信息,從源程序P中抽取出與輸入變 量相關(guān)的部份,形成基于輸入變量的靜態(tài)等價(jià)程序P',然后確定輸入變量 的運(yùn)行域。下面將對本發(fā)明進(jìn)行舉例說明,首先給出源程序P,由函數(shù)main(), xpoint (), f (), power ()組成,其輸入變量為x,給定一源程序P如下int power (int x , int i) int p;for (p=l; i>0; —i) P = P*x; return (p) ^float f (float x)y= ((x-0.5) *x+16.0) *x-80.0; return (y);float xpoint (float xl)float y;y二xl *f (xl) / (f (xl+1.0) -f (3.453)); return (y);void main ()intfloat x, y;printf ("/n-----Print the value of function power-----/n");for (k=0;k<10;k++)printf ("%d%d%d\n", k, power (2, k), power (國3, k));printf (7n-----Print the value of function xpoint-----/n");Scan ("%r, &x}; while (x>0)y=xpoint (x) jprintf ("%f%r, x, y); scanf ("%r, &x);基于輸入變量對上述的源程序P分析,以得到一等價(jià)程序,如下: float f (float x)float y;y= ((x-0.5) *x+16.0) *x-80.0; return (y);float xpoint (float xl)float y;戸l * f (xl) / (f (xl+1.0) -f (3.453)); return (y);void main ()float x, y;scan ("%f', &x);while (x>0)y=xpoint (x);printf ("%f%f', x, y);Scanf ("%r, &x);根據(jù)本發(fā)明所揭露的方法,首先取得紀(jì)錄程序中的變量,此程序變量 列表中只有變量x、 y、 k。接著針對變量x的程序分析,得到等價(jià)程序P',等價(jià)P'中去掉了與輸 入變量x無關(guān)的變量。k及其相關(guān)語句與函數(shù)POWER ()、 P'中變量與函 數(shù)都與輸入變量x有關(guān),并且與P 二者表示等價(jià)。因此,P,與P的運(yùn)行 域一致。但是,P'只分析與輸入變量有關(guān)的部份,有利于程序運(yùn)行域的確 定。接著分析P,以確定運(yùn)行域。對函數(shù)進(jìn)行分析,例如對xpoint ()進(jìn)行分析,其變量為xl,類型為float, float型變量,其功能域定義為 [-3.4028235E38, 3.4028235E38]同時(shí)函數(shù)中,其表達(dá)式中分母不能為0,則 可得xl內(nèi)容不能等于2.453,如此綜合參考其功能域及運(yùn)行域范圍,可得 其可執(zhí)行域范圍,[-3.4028235E38,誦l],[畫l, 0],
, [1, 2.453), (2.453, 3.4028235E38],測試其結(jié)果是否有誤。選擇如上一些特殊值等去測試其結(jié) 果,如此可不需每個(gè)變量值均去執(zhí)行一遍,從而節(jié)約大量時(shí)間。
權(quán)利要求
1. 一種基于程序運(yùn)行域的軟件測試方法,其特征在于該方法包括以下步驟1)、首先取得源程序的功能域;2)、接著對源程序進(jìn)行分析,留下與一變量有關(guān)的語句,形成等價(jià)程序;3)、根據(jù)步驟2)中形成的等價(jià)程序,取得等價(jià)程序的運(yùn)行域;4)、最后比較源程序的功能域與等價(jià)程序的運(yùn)行域是否完全重合,如果不重合,說明軟件存在故障或錯(cuò)誤。
2、 根據(jù)權(quán)利要求1所述的基于程序運(yùn)行域的軟件測試方法,其特征在 于所述步驟O中取得源程序的功能域具體步驟如下1.1) 首先逐行讀入源程序的語句;1.2) 接著讀取源程序的函數(shù),判斷讀入的語句是否為函數(shù),若不是函 數(shù),則返回步驟l.l),若是函數(shù)則進(jìn)至步驟1.3);1.3) 建立函數(shù)參數(shù)表;1.4) 建立函數(shù)調(diào)用表;1.5) 建立變量表;1.6) 建立復(fù)合語句表;1.7) 判斷函數(shù)的讀取是否結(jié)束,如果結(jié)束則進(jìn)至步驟1.8),如果沒有 結(jié)束則執(zhí)行步驟1.6)-,1.8) 、判斷源程序是否讀取結(jié)束,若結(jié)束則進(jìn)至步驟2),若未結(jié)束, 則返回步驟l.l)。3、 根據(jù)權(quán)利要求2所述的基于程序運(yùn)行域的軟件測試方法,其特征在 于所述步驟2)中形成等價(jià)程序的具體步驟如下2.1) 掃瞄步驟1.5)所建立的變量表;2.2) 根據(jù)步驟2.1)所掃描的變量表取得一個(gè)變量;2.3) 讀入源程序的一行語句;2.4) 判斷讀入的語句是否與步驟2.2)所取得的變量是否有關(guān),若無 關(guān),則返回步驟2.3)繼續(xù)讀入源程序的語句,若有關(guān)則進(jìn)至步驟2.5); 2.5) 記錄至源程序中; 2.6) 判斷源程序讀取是否結(jié)束,若未結(jié)束,則回到步驟2.3)繼續(xù)讀 入源程序,若結(jié)束,則進(jìn)至步驟2.7); 2.7) 判斷變量表的變量是否讀取完畢,若未讀取完畢,則返回步驟2.2), 若讀取完畢,則進(jìn)至步驟3)。
全文摘要
本發(fā)明涉及一種軟件測試的方法,該方法包括以下步驟1)首先取得一源程序的功能域;2)接著對源程序進(jìn)行分析,以自源程序中取得與一變量有關(guān)的語句形成一等價(jià)程序;3)根據(jù)步驟2)中的等價(jià)程序,取得等價(jià)程序的運(yùn)行域;4)最后比較源程序的功能域與等價(jià)程序的運(yùn)行域是否重合,如果不重合,說明軟件在此處存在故障或錯(cuò)誤。本發(fā)明實(shí)現(xiàn)了快速、自動化的提早發(fā)現(xiàn)軟件中的故障或錯(cuò)誤,節(jié)省了大量的人力、物力,所以提高了產(chǎn)品質(zhì)量、縮短了開發(fā)測試周期,提高了客戶滿意度。
文檔編號G06F11/36GK101251820SQ20081001791
公開日2008年8月27日 申請日期2008年4月9日 優(yōu)先權(quán)日2008年4月9日
發(fā)明者軍 王, 陳淮琰 申請人:無敵科技(西安)有限公司