《軟件系統(tǒng)開(kāi)發(fā)技術(shù)》課件第6章_第1頁(yè)
《軟件系統(tǒng)開(kāi)發(fā)技術(shù)》課件第6章_第2頁(yè)
《軟件系統(tǒng)開(kāi)發(fā)技術(shù)》課件第6章_第3頁(yè)
《軟件系統(tǒng)開(kāi)發(fā)技術(shù)》課件第6章_第4頁(yè)
《軟件系統(tǒng)開(kāi)發(fā)技術(shù)》課件第6章_第5頁(yè)
已閱讀5頁(yè),還剩191頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

6.1檢驗(yàn)的基本概念6.2軟件評(píng)審6.3測(cè)試的基本概念6.4白盒法6.5黑盒法6.6測(cè)試步驟6.7聯(lián)合測(cè)試6.8系統(tǒng)測(cè)試6.9測(cè)試計(jì)劃習(xí)題六大型軟件系統(tǒng)的開(kāi)發(fā)經(jīng)歷了需求分析、設(shè)計(jì)和編程三個(gè)階段,近二十年來(lái),軟件工作者提出了許多方法指導(dǎo)人們?cè)诜治觥⒃O(shè)計(jì)和編程中改進(jìn)軟件的質(zhì)量并盡量避免錯(cuò)誤的產(chǎn)生,本書(shū)前幾章已介紹了這些方法。但是,由于分析、設(shè)計(jì)和編程是由人來(lái)完成的,人在工作中難免會(huì)犯各種各樣的錯(cuò)誤,如在相互交流中產(chǎn)生誤會(huì),或在表達(dá)中有不精確性等,所以盡管采用了先進(jìn)的方法,軟件中的錯(cuò)誤仍然在所難免,對(duì)于規(guī)模大、復(fù)雜性高的大型軟件系統(tǒng)更是如此。例如本書(shū)中的許多實(shí)例,雖經(jīng)編者反復(fù)檢查,但細(xì)心的讀者仍會(huì)發(fā)現(xiàn)其中存在著錯(cuò)誤,這是不足為怪的。6.1檢驗(yàn)的基本概念據(jù)統(tǒng)計(jì),一個(gè)素質(zhì)較好的程序員,在他交付的程序中,錯(cuò)誤率為1%,即每100個(gè)語(yǔ)句中約含有一個(gè)錯(cuò)誤;而水平差的程序員,其早期編寫(xiě)的程序中,每個(gè)語(yǔ)句就可能含有一個(gè)甚至兩個(gè)錯(cuò)誤。所以我們必須接受這樣一個(gè)事實(shí):軟件中存

在著錯(cuò)誤,這是由人類本身能力的局限性造成的,對(duì)此我們不必大驚小怪,或?qū)﹂_(kāi)發(fā)人員、過(guò)多地抱怨或責(zé)備。這是問(wèn)題的一個(gè)方面,另一方面是當(dāng)代計(jì)算機(jī)逐步應(yīng)用到國(guó)民經(jīng)濟(jì)的一些重要領(lǐng)域,如銀行管理、經(jīng)濟(jì)決策部門(mén)的信息收集、空中交通管理或核反應(yīng)堆控制等,軟件系統(tǒng)的任何一個(gè)錯(cuò)誤,都可能使財(cái)產(chǎn),甚至生命遭到慘重?fù)p失,所以人們對(duì)軟件系統(tǒng)的可靠性提出了很高的要求,這就同前面所述的基本事實(shí)構(gòu)成了一對(duì)尖銳的矛盾。

面對(duì)這對(duì)矛盾,人們得出的結(jié)論是:伴隨著軟件的開(kāi)發(fā),必須在技術(shù)上、管理上采取措施對(duì)軟件進(jìn)行嚴(yán)格檢驗(yàn),正如有了鉛筆就必需有橡皮一樣,檢驗(yàn)是軟件開(kāi)發(fā)過(guò)程中不可缺少的部分。檢驗(yàn)的目的在于發(fā)現(xiàn)其中的錯(cuò)誤并及時(shí)糾正。檢驗(yàn)時(shí)應(yīng)想方設(shè)法,力圖多發(fā)現(xiàn)錯(cuò)誤,發(fā)現(xiàn)的錯(cuò)誤越多就說(shuō)明檢驗(yàn)的收效越大、越成功。目前軟件檢驗(yàn)的手段有三類,即動(dòng)態(tài)檢查、靜態(tài)檢查和正確性證明。

動(dòng)態(tài)檢查就是指?jìng)鹘y(tǒng)的“測(cè)試”,這種方法是使程序有控制地運(yùn)行,并從多種角度觀察程序運(yùn)行時(shí)的行為,以發(fā)現(xiàn)其中的錯(cuò)誤。

“測(cè)試”是否能夠發(fā)現(xiàn)所有的錯(cuò)誤呢?回答是“不可能”,下面用例子來(lái)說(shuō)明這一點(diǎn)。

測(cè)試的關(guān)鍵問(wèn)題是如何設(shè)計(jì)測(cè)試用例,設(shè)計(jì)測(cè)試用例的方法一般有兩類:

·黑盒法。

·白盒法。

如果使用黑盒法,測(cè)試人員將程序看成為一個(gè)“黑盒”,也就是說(shuō),他不關(guān)心程序內(nèi)部是怎么做的,而只是想檢查程序是否符合它的“功能說(shuō)明”。所以使用黑盒法時(shí),測(cè)試用例是完全根據(jù)程序的功能說(shuō)明來(lái)設(shè)計(jì)的。如果想用黑盒法發(fā)現(xiàn)程序中所有的錯(cuò)誤,則必須用輸入數(shù)據(jù)的所有可能值來(lái)檢查程序是否都能產(chǎn)生正確的結(jié)果。圖6.1是一個(gè)很簡(jiǎn)單的程序,圖6.1它有兩個(gè)輸入變量X、Y,一個(gè)輸出變量Z。假定程序是在字長(zhǎng)為32位的計(jì)算機(jī)上運(yùn)行,又假定X、Y都是整數(shù),則輸入數(shù)據(jù)的可能值有

232×232=264種

如果這個(gè)程序執(zhí)行一次約需一毫秒,那么用所有這些輸入數(shù)據(jù)來(lái)測(cè)試這個(gè)程序?qū)⑿枰鍍|年!所以要試遍輸入數(shù)據(jù)是不可能的。圖6.1如用白盒法,則需了解程序內(nèi)部的結(jié)構(gòu),此時(shí)測(cè)試用例是根據(jù)程序的內(nèi)部邏輯來(lái)設(shè)計(jì)的。如果想用白盒法發(fā)現(xiàn)程序中所有的錯(cuò)誤,則至少必須使程序中每種可能的路徑都執(zhí)行

一次。

圖6.2是一個(gè)小程序的控制流程圖,這個(gè)程序由一個(gè)循環(huán)語(yǔ)句組成,循環(huán)次數(shù)可達(dá)20次,循環(huán)體中是一組嵌套的IF語(yǔ)句,其可能的路徑有5條,所以從程序的入口A到出口B的路徑數(shù)就達(dá)

520=1014圖6.2如果編寫(xiě)一個(gè)例子,并用它來(lái)測(cè)試這個(gè)程序共花次

5分鐘,則試遍每一條路徑要花十億年!所以同試遍所有的輸入數(shù)據(jù)一樣,要試遍所有的路徑也是不可能的。

使用白盒法時(shí),還應(yīng)認(rèn)識(shí)到:即使試遍所有的路徑,仍不能保證程序符合它的功能要求,因?yàn)槌绦蛑杏行╁e(cuò)誤是同數(shù)據(jù)有關(guān)的,例如程序錯(cuò)誤地將語(yǔ)句X:=Y+Z編寫(xiě)成X:=Y—Z,但測(cè)試中執(zhí)行該語(yǔ)句時(shí),變量z的值恰好是零,這個(gè)錯(cuò)誤就不能被發(fā)現(xiàn)。另外,程序中還可能遺漏了某些路徑。上述討論的結(jié)論是:雖然試遍輸入數(shù)據(jù)的可能值比試遍所有路徑更合理些,但是二者都是不可能的,所以無(wú)論測(cè)試時(shí)選用了多少個(gè)例子,它們都僅僅是所有可能的例子中極小的一部分,如果執(zhí)行這些例子的結(jié)果是錯(cuò)的,則說(shuō)明程序中確實(shí)存在錯(cuò)誤;然而如果執(zhí)行這些例子的結(jié)果是正確的,我們并不能認(rèn)為程序中就沒(méi)有錯(cuò)誤了,這就是Dijksrta說(shuō)的:

“測(cè)試只能證明錯(cuò)誤的存在,但不能證明錯(cuò)誤不存在”。靜態(tài)檢查一般是指人工評(píng)審軟件文檔或程序,借以發(fā)現(xiàn)其中的錯(cuò)誤。由于被評(píng)審的文檔或程序不必運(yùn)行,所以稱為是“靜態(tài)”的。人工評(píng)閱的手續(xù)雖然比較簡(jiǎn)單,但事實(shí)證明這是一個(gè)相當(dāng)有效的檢驗(yàn)手段,相當(dāng)比例的錯(cuò)誤往往是通過(guò)評(píng)審發(fā)現(xiàn)的,評(píng)審已成為軟件開(kāi)發(fā)過(guò)程中一項(xiàng)必不可少的質(zhì)量保證措施。

由于人的評(píng)閱能力有限,靜態(tài)檢查顯然不可能發(fā)現(xiàn)所有的錯(cuò)誤。靜態(tài)檢查也可以用計(jì)算機(jī)自動(dòng)進(jìn)行,只需開(kāi)發(fā)一些檢查程序,使它們能“閱讀”軟件文檔和程序,并發(fā)現(xiàn)其中某些類型的錯(cuò)誤就可以了。

動(dòng)態(tài)檢查和靜態(tài)檢查的基本問(wèn)題在于不可能說(shuō)明軟件中不存在錯(cuò)誤,人們所能做到的最好結(jié)果只是發(fā)現(xiàn)錯(cuò)誤,因此自然希望找到某種方法能確切地證明程序是沒(méi)有錯(cuò)誤的,這

就出現(xiàn)了程序正確性的研究領(lǐng)域。

程序證明最常用的方法是歸納斷言法,它對(duì)程序提出一組命題,如能用數(shù)學(xué)方法證明這些命題成立,就可保證程序中不存在錯(cuò)誤,即它對(duì)所有的輸入都會(huì)產(chǎn)生預(yù)期的正確輸出。程序證明是一個(gè)鼓舞人心的想法,它也許對(duì)未來(lái)的軟件開(kāi)發(fā)會(huì)有深遠(yuǎn)影響,但它也是有問(wèn)題的,其一是設(shè)置命題和證明命題需要大量艱苦的腦力勞動(dòng),其間的公式推導(dǎo)是極其

冗長(zhǎng)的,例如某個(gè)433行ALGOL程序,其證明長(zhǎng)達(dá)46頁(yè)!人們不禁要懷疑這46頁(yè)的證明中是否又會(huì)有錯(cuò)誤呢?其二是究竟什么“錯(cuò)誤”,例如1.3節(jié)提到的美國(guó)woonsocket市計(jì)

算稅率的系統(tǒng)能否算是“正確無(wú)誤”的呢?

總之,正確性證明技術(shù)目前還處于它的早期,近期內(nèi)還不適用于大型軟件系統(tǒng)。測(cè)試、評(píng)審和證明都是卓有成效的,但其功效也是有限的,任一種技術(shù)都不足以保證軟件的質(zhì)量,所以軟件檢驗(yàn)應(yīng)該是一種綜合性的技術(shù)。開(kāi)發(fā)一個(gè)軟件系統(tǒng)時(shí),這三種技術(shù)

往往都要予以考慮:例如對(duì)系統(tǒng)最關(guān)鍵的核心部分可以采用正確性證明的技術(shù);開(kāi)發(fā)過(guò)程中每個(gè)階段都要對(duì)交付的文檔進(jìn)行正規(guī)的評(píng)審;程序完成后還要進(jìn)行全面的測(cè)試(已證明

是正確的部分也要進(jìn)行測(cè)試),只有將三種技術(shù)結(jié)合起來(lái)才有希望獲得質(zhì)量較好的軟件產(chǎn)品(當(dāng)然不能奢望獲得絕對(duì)正確的產(chǎn)品)。檢驗(yàn)工作應(yīng)該由另一個(gè)獨(dú)立部門(mén)(即不負(fù)責(zé)該系統(tǒng)開(kāi)發(fā)的部門(mén))來(lái)主持,因?yàn)闄z驗(yàn)的目的是發(fā)現(xiàn)錯(cuò)誤,從心理學(xué)的角度來(lái)說(shuō),大多數(shù)開(kāi)發(fā)人員不能有效地檢驗(yàn)他們自己設(shè)計(jì)、編

寫(xiě)的軟件;此外,如果開(kāi)發(fā)人員對(duì)問(wèn)題已經(jīng)理解錯(cuò)了,由本人來(lái)檢驗(yàn)顯然不能查出這類錯(cuò)誤。

通常,系統(tǒng)中各個(gè)部件的檢驗(yàn),可在開(kāi)發(fā)人員間交換進(jìn)行,而整個(gè)系統(tǒng)的評(píng)審和驗(yàn)收,則應(yīng)由用戶或不參加該系統(tǒng)開(kāi)發(fā)的其他專家來(lái)完成。必須說(shuō)明的是:在發(fā)現(xiàn)錯(cuò)誤之后,“排錯(cuò)”(即找出錯(cuò)誤的原因并加以糾正)應(yīng)由軟件的作者來(lái)完成。

本節(jié)的結(jié)論是:為了保證軟件質(zhì)量,檢驗(yàn)是極其重要的。遺憾的是我們目前尚未掌握理想的檢驗(yàn)方法,檢驗(yàn)所需開(kāi)支大、難度高,但其效果卻遠(yuǎn)遠(yuǎn)不能令人滿意,我們能夠做到的只是在一定的成本和時(shí)間進(jìn)度限制下,盡可能多地發(fā)現(xiàn)一些錯(cuò)誤。因此,在質(zhì)量保證的兩類技術(shù)——事前預(yù)防和事后檢驗(yàn)——之中,我們只能寄希望于前者,也就是說(shuō),軟件質(zhì)量主要是開(kāi)發(fā)時(shí)決定的,而不是靠檢驗(yàn)來(lái)保證的;開(kāi)發(fā)時(shí)掉以輕心,指望由檢驗(yàn)來(lái)發(fā)現(xiàn)警錯(cuò)誤的僥幸心理是錯(cuò)誤的?,F(xiàn)在,再回顧一下“先苦后甜"的座右銘,讀者也許又有了進(jìn)一步的認(rèn)識(shí)。6.2.1評(píng)審過(guò)程

對(duì)軟件作靜態(tài)分析的手段之一是人工閱讀文檔或程序,從而發(fā)現(xiàn)其中的錯(cuò)誤,這種技術(shù)稱為評(píng)審(Review)。近年來(lái)的實(shí)踐已證明評(píng)審是一種很有效的技術(shù),它綜合了技術(shù)性和管理性措施,手續(xù)并不復(fù)雜,難度也不很大,所需開(kāi)支也不高,但效果甚好,專家們已經(jīng)公認(rèn):正規(guī)的評(píng)審制度對(duì)軟件的成功是絕對(duì)必要的。

6.2軟件評(píng)審評(píng)審的種類很多,包括需求復(fù)查、概要設(shè)計(jì)復(fù)查、詳細(xì)設(shè)計(jì)復(fù)查、程序復(fù)查和走查等等,其正規(guī)化的程度、方式和參加的人員略有不同。本節(jié)就軟件生命期中幾個(gè)主要的評(píng)審活動(dòng),概括地討論評(píng)審過(guò)程和評(píng)審條款等問(wèn)題。

按照早期的軟件開(kāi)發(fā)模式(圖1.2),檢驗(yàn)工作是放在程序完成之后進(jìn)行的,所以,軟件錯(cuò)誤要到最后的測(cè)試階段才能發(fā)現(xiàn)(也可能仍然發(fā)現(xiàn)不了)并進(jìn)行糾正,這往往要對(duì)系統(tǒng)作很多的修改才能完成,造成人力、物力上的浪費(fèi)和進(jìn)度上的壓力。近年來(lái),為了盡早發(fā)現(xiàn)錯(cuò)誤盡早糾正,從而達(dá)到降低成本、提高質(zhì)量的目的,人們將評(píng)審工作與開(kāi)發(fā)過(guò)程結(jié)合起來(lái),使評(píng)審成為每個(gè)階段之后必經(jīng)的一道手續(xù),這樣的模式可用圖6.3來(lái)說(shuō)明。

圖6.3根據(jù)這一模式,需求分析階段完成后,即對(duì)需求說(shuō)明書(shū)進(jìn)行復(fù)查;設(shè)計(jì)階段完成后,即對(duì)設(shè)計(jì)文檔進(jìn)行復(fù)查;編程后可對(duì)程序進(jìn)行復(fù)查或走查。由于設(shè)計(jì)分為概要設(shè)計(jì)和詳細(xì)

設(shè)計(jì)兩步,所以其評(píng)審也有兩次,分別在概要設(shè)計(jì)或詳細(xì)設(shè)計(jì)完成后進(jìn)行。復(fù)查的目的是避免錯(cuò)誤傳遞到下一階段。

由于錯(cuò)誤發(fā)現(xiàn)得越早就越易修改,而且副作用亦越小,所以開(kāi)發(fā)活動(dòng)和評(píng)審活動(dòng)并行進(jìn)行是重要的質(zhì)量保證措施之一。需求分析和概要設(shè)計(jì)階段所犯的錯(cuò)誤是二些比較重大的、整體性的錯(cuò)誤,其修改涉及面廣,糾正的代價(jià)較高,相對(duì)地說(shuō),編程階段的錯(cuò)誤則比較孤立,修改較易。另一方面,由于需求分析和設(shè)計(jì)的結(jié)果是不可執(zhí)行的軟件文檔,其描述方式通常也不是形式化的,所以測(cè)試和證明技術(shù)均無(wú)法使用,只有評(píng)審是唯一可以發(fā)現(xiàn)錯(cuò)誤的手段;而編程的結(jié)果是可以運(yùn)行的程序,此時(shí),測(cè)試、證明技術(shù)都可用來(lái)發(fā)現(xiàn)錯(cuò)誤。由于上述兩方面的原因,需求復(fù)查和概要設(shè)計(jì)復(fù)查就特別重要,必須邀請(qǐng)一些資歷較高的專家,以較正規(guī)的方式,慎重、認(rèn)真地進(jìn)行,相比之下,詳細(xì)設(shè)計(jì)復(fù)查和程序復(fù)查則在同事之間相互進(jìn)行檢查就可,其正規(guī)化程度亦可略低。由于評(píng)審的目的是發(fā)現(xiàn)錯(cuò)誤,為了獲得較好的效果,評(píng)審應(yīng)由開(kāi)發(fā)人員之外的人來(lái)主持,開(kāi)發(fā)人員與評(píng)審人員相互獨(dú)立也是質(zhì)量保證的重要措施之一,評(píng)審人員應(yīng)在軟件開(kāi)發(fā)技術(shù)、檢驗(yàn)技術(shù)方面均受過(guò)良好的訓(xùn)練,也應(yīng)具有較豐富的實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)。

需求復(fù)查的參加人員可以包括開(kāi)發(fā)部門(mén)的負(fù)責(zé)人、用戶(包括各個(gè)層次的代表),熟悉這類應(yīng)用系統(tǒng)的專家和開(kāi)發(fā)軟件系統(tǒng)的專家等。

概要設(shè)計(jì)復(fù)查的參加人員可以是開(kāi)發(fā)部門(mén)的負(fù)責(zé)人、用戶(主要是評(píng)審用戶手冊(cè))、以及開(kāi)發(fā)軟件系統(tǒng)的專家等。詳細(xì)設(shè)計(jì)復(fù)查和程序復(fù)查可在開(kāi)發(fā)部門(mén)內(nèi)部同事之間交換進(jìn)行。

一般認(rèn)為評(píng)審人員不必太多,3至10人均可,可由開(kāi)發(fā)部門(mén)負(fù)責(zé)人擔(dān)任組長(zhǎng)。

評(píng)審的過(guò)程如下:評(píng)審組長(zhǎng)在評(píng)審會(huì)舉行前1至2周將評(píng)審材料(文檔或程序)發(fā)給評(píng)審員,要求各人仔細(xì)閱讀,評(píng)審員閱畢應(yīng)給評(píng)審組長(zhǎng)一個(gè)書(shū)面通知證實(shí)已讀過(guò)所有材料。

評(píng)審會(huì)上先由材料作者用投影儀、幻燈等設(shè)備介紹情況,通常在作者向評(píng)審員介紹情況時(shí),他就可能邊講邊發(fā)現(xiàn)材料中的一些錯(cuò)誤。作者介紹之后,評(píng)審員按照評(píng)審條款逐條對(duì)材料進(jìn)行檢查,發(fā)現(xiàn)其中的錯(cuò)誤和不足之處,評(píng)審條款將在6.2.2中討論。對(duì)評(píng)審會(huì)進(jìn)行的情況應(yīng)有詳細(xì)的記錄,會(huì)議結(jié)束后,組長(zhǎng)應(yīng)交出一份評(píng)審報(bào)告,列出發(fā)現(xiàn)的錯(cuò)誤及對(duì)修改工作的具體要求。

評(píng)審會(huì)上應(yīng)注意以下幾點(diǎn):

1)必須強(qiáng)調(diào)評(píng)審是針對(duì)軟件文檔,而不是軟件文檔的作者,評(píng)審會(huì)上的發(fā)言除為了修改軟件之外決不作他用(如作為編寫(xiě)人員晉升、調(diào)資的參考)。排除了這類心理障礙,評(píng)審

員才能暢所欲言,發(fā)揮其經(jīng)驗(yàn)、學(xué)識(shí)方面的專長(zhǎng),取得良好的評(píng)審效果。

2)評(píng)審會(huì)的任務(wù)只是發(fā)現(xiàn)錯(cuò)誤而不是糾正錯(cuò)誤,糾正錯(cuò)誤一般應(yīng)由軟件作者在會(huì)后再進(jìn)行。

3)為了保證效果,評(píng)審會(huì)不要持續(xù)過(guò)長(zhǎng),一般認(rèn)為以1~2小時(shí)為宜。如果系統(tǒng)較大,材料較多,評(píng)審可分幾次進(jìn)行。程序走查(CodeWalkThrough)是另一種有效的評(píng)審活動(dòng)。同程序復(fù)查一樣,它也需要先將材料發(fā)給評(píng)審人員,然后召集他們參加會(huì)議,但在會(huì)議上采取的步驟卻有所不同,它

不是按評(píng)審條款逐條檢查程序,所以不要求與會(huì)者充當(dāng)“計(jì)算機(jī)”多與會(huì)者需要攜帶一組典型的測(cè)試用例來(lái)參加會(huì)議,會(huì)上由程序作者在紙上或黑板上“運(yùn)行”每個(gè)測(cè)試用例,即用這些測(cè)試數(shù)據(jù)沿著程序邏輯走一遍,與會(huì)者追蹤程序的狀態(tài)(檢查變量的值)。當(dāng)然,這樣的“運(yùn)行”速度是極慢的,所以測(cè)試用例必須很簡(jiǎn)單,走查的關(guān)鍵在于:以人工“運(yùn)行”作為媒介,通過(guò)他啟發(fā)與會(huì)者向程序員提出種種問(wèn)題,從而發(fā)現(xiàn)程序中的錯(cuò)誤。實(shí)際證明,通過(guò)向程序員提出發(fā)現(xiàn)的錯(cuò)誤比直接由測(cè)試用例發(fā)現(xiàn)的錯(cuò)誤要多。6.2.2評(píng)審條款

評(píng)審的目的在于盡量快、盡量多地發(fā)現(xiàn)錯(cuò)誤,所以一般的做法是將軟件中常見(jiàn)的備類錯(cuò)誤列成清單,作為評(píng)審條款(Checklist),評(píng)審會(huì)上按照評(píng)審條款有針對(duì)性地進(jìn)行檢查,就可達(dá)到多快好省的目的。

評(píng)審條款有不同的風(fēng)格,可以是比較原則性的,也可以比較具體,可視評(píng)審員的經(jīng)驗(yàn)和習(xí)慣而定。下面是美國(guó)波音計(jì)算機(jī)服務(wù)公司的評(píng)審條款:需求復(fù)查條款:

1)完整性:系統(tǒng)的所有需求是否都寫(xiě)在需求說(shuō)明書(shū)上了?

2)正確性:需求說(shuō)明書(shū)上的每個(gè)條目是否均敘述正確?

3)精確性:需求說(shuō)明書(shū)上的每個(gè)條目是否表達(dá)得確切,而且只有一種解釋?

4)一致性:是否有條目同其他的條目相互沖突?

5)可測(cè)試性:在系統(tǒng)驗(yàn)收時(shí),是否有界面能夠明確地說(shuō)某個(gè)條目滿足或不滿足?

6)可行性:在已知經(jīng)費(fèi)、進(jìn)度和技術(shù)條件的限制下,每個(gè)條目是否可能實(shí)現(xiàn)?

7)可追蹤性:每個(gè)條目在現(xiàn)實(shí)的用戶環(huán)境中都能找到它的根據(jù)嗎?

8)相關(guān)性:每個(gè)條目是否確與系統(tǒng)的需求相關(guān)?

……

概要設(shè)計(jì)復(fù)查條款:

1)可追溯性:設(shè)計(jì)文檔中的每個(gè)條目是否都能在需求說(shuō)明書(shū)中找到它的根據(jù)?

2)現(xiàn)實(shí)性:設(shè)計(jì)方案是否是一個(gè)現(xiàn)實(shí)的解決辦法?

3)可維護(hù)性:某個(gè)部分作修改時(shí)是否會(huì)牽涉到許多其他部分?

4)質(zhì)量:設(shè)計(jì)方案是否體現(xiàn)了良好的軟件結(jié)構(gòu)應(yīng)具有的種種特征?

5)界面:系統(tǒng)各部分之間的界面是否明確定義了?

6)清晰性:設(shè)計(jì)文檔是否表達(dá)得清楚?

7)其他方案:是否已考慮過(guò)其他的設(shè)計(jì)方案?為什么最后選擇了當(dāng)前這個(gè)方案?

可以看出,上面兩個(gè)評(píng)審條款列出了需求分析階段和概要設(shè)計(jì)階段最易犯、最常見(jiàn)的一些錯(cuò)誤和不足之處,所以按照評(píng)審條款進(jìn)行評(píng)審將會(huì)是很有效的。上面兩個(gè)評(píng)審條款的風(fēng)格均是較抽象,較原則性的,也有不少公司采用一些很具體的

評(píng)審條款,如需求評(píng)審條款是:

1)分層數(shù)據(jù)流圖中的父圖和子圖是否平衡?

2)數(shù)據(jù)流圖中的數(shù)據(jù)是否守恒?”

3)數(shù)據(jù)流圖中出現(xiàn)的數(shù)據(jù)名在數(shù)據(jù)詞典中是否都已定義了?

4)數(shù)據(jù)詞典中各個(gè)條目同數(shù)據(jù)流圖是否有沖突?

5)每個(gè)數(shù)據(jù)項(xiàng)的值范圍是否都確定了?

6)每個(gè)小說(shuō)明是否表達(dá)得清晰、精確?概要設(shè)計(jì)評(píng)審條款是:

l)是否用了“信息隱蔽”這個(gè)原則?

2)模塊是否具有最大的聚合度?

3)模塊閫耦合度是否最小飛

4)軟件結(jié)構(gòu)的形態(tài)是否合理?

5)輸入和輸出是否平衡?

6)作用范圍是否在控制范圍之內(nèi)?

7)模塊間是否有病態(tài)的聯(lián)系?

8)結(jié)構(gòu)圖中描述的數(shù)據(jù)流是否與數(shù)據(jù)流圖相對(duì)應(yīng)?

9)設(shè)計(jì)方案中是否避免了重復(fù)功能?顯然,評(píng)審條款只能是一種參考,評(píng)審會(huì)上應(yīng)根據(jù)具體情況作增刪。

因篇幅所限,本書(shū)不再列出詳細(xì)設(shè)計(jì)復(fù)查和程序復(fù)查的評(píng)審條款,讀者可參閱參考文獻(xiàn)[1]和[6]。

6.2.3評(píng)審的特點(diǎn)

在實(shí)際使用中,人們發(fā)現(xiàn),同測(cè)試技術(shù)相比,評(píng)審有其獨(dú)特的優(yōu)點(diǎn):

1)早發(fā)現(xiàn)錯(cuò)誤早糾正,所以降低了開(kāi)發(fā)成本。

2)由作者之外的其他人參加,可吸收各家之長(zhǎng),效果較好。

3)排錯(cuò)比較容易。測(cè)試從跡象斷定錯(cuò)誤存在(如實(shí)際輸出與預(yù)期輸出不符),再根據(jù)各種現(xiàn)象分析、判斷錯(cuò)誤的原因,這是一個(gè)極其困難的過(guò)程;而評(píng)審是直接檢查軟件文檔本身,當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí)(如規(guī)格說(shuō)明書(shū)中有兩條相互沖突),原因也是顯然的。

4)測(cè)試需對(duì)一個(gè)個(gè)錯(cuò)誤分別進(jìn)行分析、定位,并糾正;而評(píng)審按評(píng)審條款檢查時(shí),往往可成批地發(fā)現(xiàn)錯(cuò)誤(如按需求分析評(píng)審條款查精確性時(shí),發(fā)現(xiàn)規(guī)格說(shuō)明書(shū)中有5個(gè)條目

的敘述帶有二義性)成批糾正,所以效率較高。

5)測(cè)試發(fā)現(xiàn)錯(cuò)誤時(shí),程序員心理比較緊張,總是急于排錯(cuò),而不能冷靜地考慮修改方案,往往錯(cuò)上加錯(cuò);而評(píng)審安排在系統(tǒng)開(kāi)發(fā)的早期,發(fā)現(xiàn)錯(cuò)誤后,開(kāi)發(fā)人員一般不緊張,可以較全面地權(quán)衡,選擇修改方案。所以,評(píng)審看上去是一種平凡普遍的手續(xù),似乎比較單調(diào)、枯燥,但其效果卻都是顯著的。據(jù)統(tǒng)計(jì),在較典型的軟件開(kāi)發(fā)項(xiàng)目中,30%到70%的錯(cuò)誤是通過(guò)評(píng)審發(fā)現(xiàn)的。所以,我們可以得到這個(gè)結(jié)論:正規(guī)的評(píng)審制度對(duì)軟件的成功是絕對(duì)必要的。

當(dāng)然,對(duì)大型系統(tǒng)的大量文檔和程序,憑人工進(jìn)行評(píng)審,其效果還是有限的,部分評(píng)審活動(dòng)完全可以由計(jì)算機(jī)自動(dòng)完成,第十章將介紹具有這類功能的自動(dòng)工具。人們往往有這樣一種錯(cuò)覺(jué):程序編寫(xiě)出來(lái)以后,研制工作就接近尾聲了,但是事實(shí)并非如此,本書(shū)圖1.3說(shuō)明了研制一個(gè)軟件系統(tǒng)的大部分工作量是花在程序編寫(xiě)出來(lái)之后,即測(cè)試和維護(hù)階段,其中測(cè)試階段的工作量約占開(kāi)發(fā)期的一

半,測(cè)試一個(gè)大型程序系統(tǒng)的難度,可能比設(shè)計(jì)這個(gè)系統(tǒng)還要大。.6.3測(cè)試的基本概念下面先看一個(gè)小程序的測(cè)試工作。

程序TRIANGLE輸入三個(gè)整數(shù),它們表示一個(gè)三角形的三條邊長(zhǎng),該程序產(chǎn)生一個(gè)結(jié)果指出該三角形是等腰三角形、等邊三角形還是不等邊三角形(見(jiàn)圖6.4)。圖6.4這個(gè)程序是很簡(jiǎn)短的,有一定經(jīng)驗(yàn)的讀者可能認(rèn)為測(cè)試這個(gè)程序非常容易,可以很自信地隨手寫(xiě)下一些“測(cè)試用的例子”(下面簡(jiǎn)稱“測(cè)試用例”、或“例子”),例如:

a=3,b=4,c=5

a=5,b=5,c=6

a=6,b=6,c=6

……等

如果對(duì)這些測(cè)試用例,程序都能給出正確的結(jié)果,那么就認(rèn)為程序是正確的了。下面,請(qǐng)這些讀者檢查一下,你選用的測(cè)試用例是否包括了以下一些情況:

1)合理的不等邊三角形(輸入數(shù)據(jù)為1、2、3或2、5、10等不能算這一類)。

2)合理的等邊三角形(輸入數(shù)據(jù)為0、0、0等不能算這一類)。

3)合理的等腰三角形(輸入數(shù)據(jù)為2、2、4等不能算這一類)。

4)等腰三角形的三種排列次序(如3、3、4;3、4、3和4、3、3等)。

5)三個(gè)正數(shù),其中兩個(gè)之和等于第三個(gè)。

6)第5種情況的三種排列次序(如1、2、3;1、3、2和3、1、2等)。

7)三個(gè)正數(shù),其中兩個(gè)之和小于第三個(gè)。

8)第7種情況的三種排列次序(如1、2、4;l、4、2和4、1、2等)。

9)輸入數(shù)據(jù)含有零值。

10)輸入數(shù)據(jù)含有負(fù)數(shù)。

11)輸入數(shù)據(jù)含有非整數(shù)值。

12)三個(gè)數(shù)均為零。

13)輸入數(shù)據(jù)不是三個(gè)數(shù)(如只有兩個(gè)輸入數(shù))。實(shí)際調(diào)查說(shuō)明,即使是較有經(jīng)驗(yàn)的軟件人員,在測(cè)試該程序時(shí)往往也只考慮到上述情況中的六七種。上述13種情況是在分析了某些程序員編寫(xiě)的TRIANGLE程序之后,根據(jù)

一些常見(jiàn)的錯(cuò)誤列出的,所以它們確實(shí)是測(cè)試中需要考核的,而不是故意吹毛求疵,此外,還應(yīng)注意到:即使測(cè)試用例中包括了上述13種情況,我們?nèi)圆荒鼙WC經(jīng)過(guò)測(cè)試的程序就不再含有其他錯(cuò)誤了。

TRIANGLE一例說(shuō)明了,即使是測(cè)試一個(gè)很小的程序,它也不是輕而易舉的任務(wù),測(cè)試工作比我們所預(yù)料的要復(fù)雜得多。不難想像,如果要測(cè)試10000個(gè)語(yǔ)句以上的軟件系

統(tǒng),例如一個(gè)編譯程序或銀行管理系統(tǒng),將會(huì)是多么困難!

什么是“測(cè)試”?許多人對(duì)它的理解是完全錯(cuò)誤的,這也是測(cè)試工作做得很差的原因之一,例如有人認(rèn)為“測(cè)試的目的是說(shuō)明程序能正確地執(zhí)行它應(yīng)有的功能”,或者“測(cè)試是表明程序中不再含有錯(cuò)誤”等。事實(shí)上,同這些人的理解正好相反,“測(cè)試”是假定程序中存在錯(cuò)誤(這個(gè)假定幾乎對(duì)所有程序都是合理的),因而想通過(guò)執(zhí)行這個(gè)程序來(lái)發(fā)現(xiàn)盡可能多的錯(cuò)誤。所以“測(cè)試”的恰當(dāng)定義應(yīng)該是“為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行程序”。這一定義為測(cè)試階段指出了一個(gè)正確的目標(biāo),這將對(duì)如何成功地進(jìn)行測(cè)試產(chǎn)生深遠(yuǎn)的影響:如果測(cè)試的目標(biāo)是說(shuō)明程序中沒(méi)有錯(cuò)

誤,程序員則會(huì)向著這個(gè)目標(biāo)靠攏,因而下意識(shí)地選用一些不易暴露錯(cuò)誤的測(cè)試用例。但是,如果我們的目標(biāo)是證實(shí)程序中有錯(cuò)誤,程序員就會(huì)選用一些更能暴露錯(cuò)誤的測(cè)試用例。所以這個(gè)定義對(duì)如何設(shè)計(jì)測(cè)試用例、誰(shuí)應(yīng)該參加測(cè)試、誰(shuí)不該參加等一系列問(wèn)題都有很大的影響。

“測(cè)試”是否能夠發(fā)現(xiàn)所有的錯(cuò)誤呢?6.1已指出:“測(cè)試只能證明錯(cuò)誤的存在,但不能證明錯(cuò)誤不存在”。

既然“徹底地測(cè)試”是不可能的,所以測(cè)試階段要考慮的基本問(wèn)題就是“經(jīng)濟(jì)性”了。我們的策略是:在一定的研制時(shí)間、研制經(jīng)費(fèi)的限制下,通過(guò)執(zhí)行有限個(gè)測(cè)試用例,盡可能多發(fā)現(xiàn)一些錯(cuò)誤。那些只能使程序正確地執(zhí)行的測(cè)試用例是沒(méi)有什么意義的,執(zhí)行這些測(cè)試用例只是白白浪費(fèi)時(shí)間和金錢(qián)而已,而能夠發(fā)現(xiàn)錯(cuò)誤的測(cè)試用例才是成功的例子。如果將某個(gè)測(cè)試用例發(fā)現(xiàn)的錯(cuò)誤看作是它的“產(chǎn)品”,則理想的測(cè)試用例應(yīng)該是“高產(chǎn)”的。顯然,隨意選擇的一組測(cè)試用例不可能是高產(chǎn)的,所以測(cè)試的關(guān)鍵就成為如何設(shè)計(jì)高產(chǎn)的測(cè)試用例了。

下面討論測(cè)試階段應(yīng)注意的一些基本原則:

1)測(cè)試用例應(yīng)該由以下兩部分組成:

·輸入數(shù)據(jù)。

·預(yù)期的輸出結(jié)果。這就是說(shuō),在執(zhí)行程序之前應(yīng)該對(duì)期望的輸出有很明確的描述,這樣,測(cè)試后就可將程序的輸出同它仔細(xì)地對(duì)照檢查。如果不事先確定預(yù)期的輸出,就可能把似乎是正確而實(shí)際是錯(cuò)誤的結(jié)果當(dāng)成是正確的結(jié)果。

2)不僅要選用合理的輸入數(shù)據(jù)作為測(cè)試用例,還應(yīng)選用不合理的輸入數(shù)據(jù)作為測(cè)試用例。許多人往往只注意前者而忽略了后者。為了提高程序的可靠性,輸入數(shù)據(jù)不合理的

各種情況是應(yīng)該認(rèn)真檢查的,例如測(cè)試程序TRlANGLE時(shí),就應(yīng)選用“a=1,b=2,c=5”等例子,以便證實(shí)該程序不會(huì)錯(cuò)誤地認(rèn)為這是不等邊三角形。

3)除了檢查程序是否做了它應(yīng)做的工作之處,還應(yīng)檢查程序是否還做了它不應(yīng)做的事情。例如除了檢查工資管理程序是否為每個(gè)職工正確地產(chǎn)生一份工資單之外,還應(yīng)檢查它是否還產(chǎn)生了多余的工資單。。

4)應(yīng)該長(zhǎng)期保留所有的測(cè)試用例,直至這個(gè)程序系統(tǒng)被廢棄不用為止。設(shè)計(jì)測(cè)試用例是很費(fèi)人工的,如果將用過(guò)的測(cè)試用例丟棄了,以后一旦需要再測(cè)試這個(gè)程序(例如因?yàn)槌绦騼?nèi)部作了某些修改)就需要再花很多人工,人們往往懶得再次認(rèn)真地設(shè)計(jì)測(cè)試用例,因而“再測(cè)試”很少像初次測(cè)試那樣“徹底”。如果程序的修改使得前面已測(cè)試過(guò)的部分產(chǎn)生了錯(cuò)誤,“再測(cè)試”往往就不能發(fā)現(xiàn)這些錯(cuò)誤。所以,所有的測(cè)試用例應(yīng)作為軟件的一部分長(zhǎng)期保存下來(lái),這將為維護(hù)工作提供有利的條件。

最后,再重復(fù)一下本節(jié)的一些重要結(jié)論:

1)測(cè)試是為了發(fā)現(xiàn)錯(cuò)誤而執(zhí)行某個(gè)程序。

2)測(cè)試不能發(fā)現(xiàn)所有的錯(cuò)誤。

3)測(cè)試的關(guān)鍵是設(shè)計(jì)一組“高產(chǎn)”的測(cè)試用例。測(cè)試是相當(dāng)困難的,它需要有一定的軟件方法來(lái)指導(dǎo),也需要有軟件工具來(lái)輔助。目前人們對(duì)測(cè)試階段的了解或許比對(duì)其他階段更少,這一階段還有許多問(wèn)題需要研究和探

索,“測(cè)試技術(shù)”正是軟件人員目前熱心研究的課題之一。本章著重討論測(cè)試階段最重要的問(wèn)題——如何設(shè)計(jì)有效的測(cè)試用例6.4和6.5將分別介紹設(shè)計(jì)測(cè)試用例的白盒法和黑盒

法,6.6和6.8討論聯(lián)合測(cè)試和系統(tǒng)測(cè)試。這里介紹的方法都有一定程度的試探性,在使用它們時(shí),測(cè)試人員的經(jīng)驗(yàn)和創(chuàng)造能力仍然是非常重要的。設(shè)計(jì)測(cè)試用例(Testcase)的一類方法是白盒法,它以程序的內(nèi)部邏輯為基礎(chǔ)設(shè)計(jì)測(cè)試,用例,所以又稱為邏輯覆蓋法。應(yīng)用白盒法時(shí),手頭必須有程序的規(guī)格說(shuō)明以及程序清單。

白盒法考慮的是測(cè)試用例對(duì)程序內(nèi)部邏輯的覆蓋程度,6.1已指出,最徹底的白盒法爭(zhēng)是覆蓋程序中的每一條路徑,但是由于程序中一般含有循環(huán),所以路徑的數(shù)目極大,要執(zhí)|行每一條路徑是不可能的,所以我們只能希望覆蓋的程度盡可能高些。6.4白盒法為了衡量測(cè)試的覆蓋程度,需要建立一些標(biāo)準(zhǔn),目前常用的一些覆蓋標(biāo)準(zhǔn)從低到高分別是:

·語(yǔ)句覆蓋。

·判定覆蓋。

·條件覆蓋。

·判定/條件覆蓋。

·條件組合覆蓋。

6.4.1至6.4.5先介紹這些覆蓋標(biāo)準(zhǔn),6.4.6再討論一下應(yīng)用白盒法的實(shí)例。6.4.1語(yǔ)句覆蓋

程序的某次運(yùn)行一般并不能執(zhí)行到其中的每一個(gè)語(yǔ)句,因此,如果某語(yǔ)句中含有一個(gè)錯(cuò)誤,而它在測(cè)試中沒(méi)被執(zhí)行,這個(gè)錯(cuò)誤就不可能被發(fā)現(xiàn)。為了提高發(fā)現(xiàn)錯(cuò)誤的可能性,應(yīng)該在測(cè)試時(shí)執(zhí)行程序中的每一個(gè)語(yǔ)句。

“語(yǔ)句覆蓋”是一個(gè)比較弱的測(cè)試標(biāo)準(zhǔn),它的含義是:選擇足夠的測(cè)試用例,使得程序中每個(gè)語(yǔ)句至少都能被執(zhí)行一次。

圖6.5是一個(gè)被測(cè)試的程序,它的源程序是:

PROCEDUREM(VARA,B,X:REAL);

BEGIN

IF(A~1)AND(B=O)

THENX:=X/A)

IF(A一2)OR(X>1)

THENX:=X+1

END.圖6.5為使程序中每個(gè)語(yǔ)句至少執(zhí)行一次,只需設(shè)計(jì)一個(gè)能通

過(guò)路徑ace的例子就可以了,例如選擇輸入數(shù)據(jù)為:

A=2,B=O,X=3

就可達(dá)到“語(yǔ)句覆蓋”標(biāo)準(zhǔn)。

從本例可看出,語(yǔ)句覆蓋實(shí)際上是很弱的,如果第一個(gè)

條件語(yǔ)句中的.AND錯(cuò)誤地編寫(xiě)成OR,上面的測(cè)試用例是不

能發(fā)現(xiàn)這個(gè)錯(cuò)誤的;又如第二個(gè)條件語(yǔ)句中X>1誤寫(xiě)成X

>0,這個(gè)測(cè)試用例也不能暴露它;此外,沿著路徑礎(chǔ)執(zhí)行

時(shí),x的值應(yīng)該保持不變,如果這一方面有錯(cuò)誤,上述測(cè)試數(shù)據(jù)也不能發(fā)現(xiàn)它們。6.4.2判定覆蓋

比“語(yǔ)句覆蓋”稍強(qiáng)的覆蓋標(biāo)準(zhǔn)是“判定覆蓋”(或稱分支覆蓋)。這個(gè)標(biāo)準(zhǔn)是:執(zhí)行足夠的測(cè)試用例,使和程序中每個(gè)判定至少都獲得一次“真”值和“假”值,或者說(shuō)使得程序中的每一個(gè)分支至少都通過(guò)一次。

對(duì)圖6.5的程序,如果設(shè)計(jì)兩個(gè)例子,使它們能通過(guò)路徑ace和abd,或者通過(guò)路徑a以和abe,就可達(dá)到“判定覆蓋”標(biāo)準(zhǔn),為此,我們可以選擇輸入數(shù)據(jù)為:

①A=3,B=O,x=1(沿路徑abd執(zhí)行);

②A=2,B=1,x=3(沿路徑abe執(zhí)行)。程序中含有判定的語(yǔ)句包括lF-THEN-ELSE、DO-wHILE、REPEAT-uNTIL等,除了雙值的判定語(yǔ)句外,還有多值的判定語(yǔ)句,如PASCAL中的CASE語(yǔ)句、FORTRAN中帶有三個(gè)分支的IF語(yǔ)句等。所以“判定覆蓋”更一般的含義是:使得每一個(gè)判定獲得每一種可能的結(jié)果。

“判定覆蓋’’比“語(yǔ)句覆蓋”嚴(yán)格,因?yàn)槿绻總€(gè)分支都執(zhí)行過(guò)了,則每個(gè)語(yǔ)句也就執(zhí)行過(guò)了。但是,“判定覆蓋”還是很不夠的,例如上面兩個(gè)測(cè)試用例未能檢查沿著路徑捌執(zhí)行時(shí),X的值是否保持不變。6.4.3條件覆蓋

一個(gè)判定中往往包含了若干個(gè)條件,例如圖6.5。的程序中,判定(A>1)AND(B=O)包含了兩個(gè)條件:A>1以及B=0,所以可引進(jìn)一個(gè)更強(qiáng)的覆蓋標(biāo)準(zhǔn)——“條件覆蓋”。“條件覆蓋”的含義是:執(zhí)行足夠的測(cè)試用例,使得判定中的每個(gè)條件獲得各種可能的結(jié)果。

圖6.5的程序有四個(gè)條件:

A>1、B=0、A=2、X>1為了達(dá)到“條件覆蓋”標(biāo)準(zhǔn),需要執(zhí)行足夠的測(cè)試用例使得在a點(diǎn)有:

A>1、A≤1、B=0、B≠0

等各種結(jié)果出現(xiàn),以及在6點(diǎn)有:

A=2、A≠2、X>1、X≤1

等各種結(jié)果出現(xiàn)。

我們只需設(shè)計(jì)以下兩個(gè)測(cè)試用例就可滿足這一標(biāo)準(zhǔn):

①A=2,B=0,X=4(沿路徑ace執(zhí)行);

②A=l,B=1,X=1(沿路徑abd執(zhí)行)。雖然同樣只要兩個(gè)測(cè)試用例,但這兩個(gè)測(cè)試用例比642中的兩個(gè)更有效了。

“條件覆蓋”通常比“判定覆蓋”強(qiáng),因?yàn)樗挂粋€(gè)判定中的每一個(gè)條件都取到了兩個(gè)不同的結(jié)果,而判定覆蓋則不保證這一點(diǎn)。但是也可能有相反的情況,如對(duì)語(yǔ)句

IF(AANDB)THENS

設(shè)計(jì)兩個(gè)測(cè)試用例,使其滿足“條件覆蓋”:即使A為“真”并使B為“假”,以及使A為“假”而且B為“真”,但是這兩個(gè)測(cè)試用例都未能使語(yǔ)句S得以執(zhí)行。又如,對(duì)圖6.5的程序,下面兩個(gè)例子滿足“條件覆蓋”,但不滿足“判定覆蓋”:

①A=1,B=0,X=3

②A=2,B=1,X=1

因?yàn)樗鼈兾茨苁钩绦蛑械谝粋€(gè)判定的結(jié)果為“真”,也未能使第二個(gè)判定的結(jié)果為“假”。6.4.4判斷/條件覆蓋

針對(duì)上面的問(wèn)題引出了另一種覆蓋標(biāo)準(zhǔn)——“判定/條件覆蓋”,它的含義是:執(zhí)行足夠的測(cè)試用例,使得判定中每個(gè)條件取到各種可能的值,并使每個(gè)判定取到各種可能的結(jié)果。

對(duì)圖6.5的程序,上一節(jié)中的兩個(gè)例子

①A=2,B=O,X=4

②A=1,B=1,X=1

是滿足這一標(biāo)準(zhǔn)的。

“判定/條件覆蓋”似乎是比較合理的,但事實(shí)并非如此,因?yàn)榇蠖鄶?shù)計(jì)算機(jī)不能用一條指令對(duì)多個(gè)條件作出判定,而必須將源程序中對(duì)多個(gè)條件的判定分解成幾個(gè)簡(jiǎn)單判定,所以較徹底的測(cè)試應(yīng)使每一個(gè)簡(jiǎn)單判定都真正取到各種可能的結(jié)果。圖6.6是由編譯系統(tǒng)產(chǎn)生的圖6.5的目標(biāo)程序。上面的兩個(gè)例子未能使目標(biāo)程序中的每一個(gè)簡(jiǎn)單判定取到各種可能的結(jié)果:它們不能使判定I為“假”也不能使判定K為“真”,其原因在于:含有AND或OR的邏輯表達(dá)式中,某些條件將抑制其他條件,例如邏輯表達(dá)式AANDB,如果A為“假”,目標(biāo)程序就不再檢查條件B了,這樣B中的錯(cuò)誤就發(fā)現(xiàn)不了。上面的討論說(shuō)明了,盡管“判定/條件覆蓋”看起來(lái)能使各種條件取到所有可能的值,但實(shí)際上并不一定能檢查到這樣的程度。圖6.66.4.5條件組合覆蓋

針對(duì)上述問(wèn)題又提出了另一種標(biāo)準(zhǔn)——“條件組合覆蓋”。它的含義是:執(zhí)行足夠的例子,使得每個(gè)判定中條件的各種可能組合都至少出現(xiàn)一次。顯然,滿足“條件組合覆蓋”的測(cè)試用例是一定滿足“判定覆蓋”、“條件覆蓋”和“判定/條件覆蓋”的。再看圖6.5的程序,我們需要選擇適當(dāng)?shù)睦?,使得下?種條件組合都能夠出現(xiàn):

1)A>1,B=0

2)A>1,B≠0

3)A≤1,B=0

4)A≤1,B≠0

5)A一2,X>1

6)A一2,X≤1

7)A≠2,X>l

8)A≠2,x≤1必須注意到,5)、6)、7)、8)四種情況是第二個(gè)IF語(yǔ)句的條件組合,而x的值在該語(yǔ)句之前是要經(jīng)過(guò)計(jì)算的,所以我們還必須根據(jù)程序的邏輯推算出在程序的入口點(diǎn)x的輸入

值應(yīng)是什么。

下面四個(gè)例子可以使上述8種條件組合至少出現(xiàn)一次:

①A=2,B=0,X=4使1)、5)兩種情況出現(xiàn);

②A=2,B=1,X=1使2)、6)兩種情況出現(xiàn);

⑧A=1,B=0,X=2使3)、7)兩種情況出現(xiàn);

④A=l,B=1,X=1使4)、8)兩種情況出現(xiàn)。細(xì)心的讀者會(huì)發(fā)現(xiàn),上面四個(gè)例子雖然滿足條件組合覆蓋,但并不能覆蓋程序中的每一條路徑,例如路徑acd就沒(méi)有執(zhí)行。

注意到該程序一共只有四條路徑,就可以看出條件組合覆蓋標(biāo)準(zhǔn)仍然是多么不徹底了。6.4.6實(shí)例——工資管理程序

前幾節(jié)敘述了白盒法的幾種常用覆蓋標(biāo)準(zhǔn),應(yīng)用白盒法的基本步驟如下:

(1)按照某種覆蓋標(biāo)準(zhǔn),選擇一組需覆蓋的路徑。

(2)確定覆蓋上述路徑所需的輸入數(shù)據(jù)。

(3)計(jì)算與輸入數(shù)據(jù)相應(yīng)的輸出。

這里每一步都是相當(dāng)困難的,需要人們做大量艱辛的工作。下面以工資管理程序?yàn)槔f(shuō)明白盒法的運(yùn)用過(guò)程。工資管理程序BONUS的輸入數(shù)據(jù)是職員表(EmployeeTable)和部門(mén)表(DepartmentTable)(圖6.7)。職員表由姓名(Name)、職務(wù)(JobCode)、部門(mén)(Dept.)和工資(salary)四項(xiàng)組成,部門(mén)表由部門(mén)(Dept.)和銷售量(sales)兩項(xiàng)組成。程序的功能是:“為銷售量最大的部門(mén)中每一個(gè)職員增加200元工資,但是,如果某個(gè)職員的原有工資已達(dá)15000元,或者

他的職務(wù)是經(jīng)理,則只給他增加100元,如果程序能正常地完成,則輸出出錯(cuò)碼0;如果輸入表格中沒(méi)有任何條目,則輸出出錯(cuò)碼1;如果沒(méi)有職員在部門(mén)表中銷售量最大的部門(mén)中工作,則輸出出錯(cuò)碼2”。

圖6.7表6.l是BONUS的源程序,參數(shù)表中EMPTAB、DEPTTAB分別是職員表和部門(mén)表,ESIZE、DSIZE分別是這兩個(gè)表的長(zhǎng)度,ERRCODE是出錯(cuò)碼。為簡(jiǎn)單起見(jiàn),這里略去了說(shuō)明部分和注釋。我們相信這個(gè)程序中含有錯(cuò)誤,所以需要對(duì)它進(jìn)行測(cè)試,這里先用白盒法設(shè)計(jì)測(cè)試用例。

不管采用哪一種覆蓋標(biāo)準(zhǔn),首先都需列出程序中的判定,所以必須考慮所有的條件句和循環(huán)句。本例中只要輸入表格不空,循環(huán)句總會(huì)經(jīng)歷進(jìn)入循環(huán)體和跳過(guò)循環(huán)體這兩種情況(因?yàn)檠h(huán)終值都大于等于循環(huán)初值),所以就不必專門(mén)考慮了,需要分析的只是表6.2六個(gè)條件語(yǔ)句中的判定。

一般說(shuō)來(lái),采用“條件組合覆蓋”效果較好,這里為了作出比較,我們依次采用各種覆蓋標(biāo)準(zhǔn)(語(yǔ)句覆蓋除外,因?yàn)樗窒蘖?。為了達(dá)到“判定覆蓋”標(biāo)準(zhǔn),我們需要選擇足夠的測(cè)試用例,使得上述6個(gè)判定都取到兩種結(jié)果,這就需要使表6.3列出的12種情況出現(xiàn)。

圖6.8的兩個(gè)測(cè)試用例可以滿足這一要求,按照6.1指出的原則,每個(gè)測(cè)試用例要說(shuō)明輸入數(shù)據(jù)和期望的輸出結(jié)果(圖中“職務(wù)”一欄,“E”表示是一般職員,“M”表示是經(jīng)理)。圖6.8雖然這兩個(gè)例子滿足“判定覆蓋”標(biāo)準(zhǔn),但是它們不能發(fā)現(xiàn)程序中許多其他可能的錯(cuò)誤,例如沒(méi)有檢查ERRCODE為0、職員是經(jīng)理、部門(mén)表為“空”等情況。

如果采用“條件覆蓋”標(biāo)準(zhǔn),則必須使判定中的每一個(gè)條件取到兩種可能的值,這就要使表6.4列出的l6種情況出現(xiàn)。這里可以看出一個(gè)問(wèn)題,盡管圖6.9的測(cè)試用例滿足“條件覆蓋”標(biāo)準(zhǔn),但是它們可能比圖6.8中滿足“判定覆蓋”標(biāo)準(zhǔn)的測(cè)試用例差,因?yàn)樗鼈儾荒軋?zhí)行每一個(gè)語(yǔ)句(如語(yǔ)句19),而且它們起的作用也不比圖6.8的測(cè)試用例多許多,如未能使ERRCODE=0,如果語(yǔ)句2誤寫(xiě)成(ESIZE=0)AND(DSIZE=0),這個(gè)錯(cuò)誤也不能被發(fā)現(xiàn)。使用“判定/條件覆蓋”標(biāo)準(zhǔn),就可克服圖6.9中例子的弱點(diǎn),我們需要提供足夠的測(cè)試用例使得所有判定和條件都取到兩個(gè)不同的值,這里只需使圖6.9中的職員JONES為

經(jīng)理,而使LORIN不是經(jīng)理,則判定l6就可取到兩種結(jié)果,語(yǔ)句19因而得以執(zhí)行。

但是這樣做實(shí)際上并不一定比圖6.8的測(cè)試用例好,如果所用的編譯系統(tǒng)將含有“OR”的表達(dá)式處理成:遇到第一項(xiàng)為“真”就不再檢查后面的項(xiàng),則這樣的兩個(gè)測(cè)試用例并不能檢查到JOB(K)=“M”這一部分。最后我們考慮“條件組合覆蓋”標(biāo)準(zhǔn),它需要足夠的例子,使得每個(gè)判定中條件的各種組合情況都出現(xiàn)一次。本例中判定6、9、13和21各有兩種組合,判定2和16各有4種組

合。我們可以先選一個(gè)測(cè)試用例使其包含盡可能多的組合情況,再選另一測(cè)試用例使其包含盡可能多的余下的組合情況……,直至得到一組測(cè)試用例能包含所有的組合情況。圖

6.10是滿足“條件組合覆蓋”標(biāo)準(zhǔn)的一組測(cè)試用例,它比前面幾組測(cè)試用例都全面,這也就說(shuō)明了,我們?cè)谝婚_(kāi)始就應(yīng)采用這個(gè)覆蓋標(biāo)準(zhǔn)。圖6.10極其重要的一點(diǎn)是:即使是滿足“條件組合覆蓋”標(biāo)準(zhǔn)的例子(圖6.10)仍不能發(fā)現(xiàn)BONUS中許多其他的錯(cuò)誤,例如沒(méi)有檢查ERRCODE—O的情況,所以如果語(yǔ)句l被遺漏

了就查不出,又如語(yǔ)句l6中l(wèi)5000.00誤寫(xiě)成15000.01也是發(fā)現(xiàn)不了的,或者SALARY(K)≥15000誤寫(xiě)成SALARY(K)>15000也是發(fā)現(xiàn)不了的;又如果BONUS程序沒(méi)有對(duì)部門(mén)表或職員表的最后一行進(jìn)行處理,這個(gè)錯(cuò)誤也不一定能發(fā)現(xiàn)。通過(guò)對(duì)工資管理程序的討論,可以得到兩點(diǎn)結(jié)論:

·“條件組合覆蓋”標(biāo)準(zhǔn)比其他標(biāo)準(zhǔn)優(yōu)越。

·即使達(dá)到任何一種覆蓋標(biāo)準(zhǔn),其測(cè)試效果仍然是不徹底的,我們還需要用其他的測(cè)試方法(如黑盒法)作補(bǔ)充。設(shè)計(jì)測(cè)試用例的另一種方法是黑盒法。與白盒法不同,黑盒法不關(guān)心程序內(nèi)部的邏輯,而只是根據(jù)程序的功能說(shuō)明來(lái)設(shè)計(jì)測(cè)試用例。所以,應(yīng)用黑盒法時(shí),手頭只需有程序

的功能說(shuō)明書(shū)就夠了。

黑盒法有以下幾種:

·等價(jià)分類法。

·邊緣值分析法。

·因果圖法。

·錯(cuò)誤推測(cè)法。

同白盒法一樣,這里沒(méi)有一種方法能提供一組完整的測(cè)試用例,我們必須把各種方法結(jié)合起來(lái)使用。6.5黑盒法6.5.1等價(jià)分類法

6.1已指出,徹底的黑盒法需用所有可能的輸入數(shù)據(jù)來(lái)測(cè)試某個(gè)程序,這是不可行的,我們只能在輸入數(shù)據(jù)中選擇一個(gè)子集。因此問(wèn)題就歸結(jié)為如何選擇一個(gè)適當(dāng)?shù)淖蛹?,使?/p>

可能發(fā)現(xiàn)較多的錯(cuò)誤。

很自然,人們希望所選擇的測(cè)試用例具有“代表性”,即一個(gè)測(cè)試用例可以代表一大類其他的測(cè)試用例,這一想法形成了一種黑盒方法——“等價(jià)分類法”。如果將輸入數(shù)據(jù)的可能值分成若干個(gè)“等價(jià)類”,我們就可以合理地假定:每一類的一個(gè)代表性的值在測(cè)試中的作用等價(jià)于這一類中的其他值,也就是說(shuō),如果某一類中的一個(gè)測(cè)試用例發(fā)現(xiàn)了錯(cuò)誤,這一等價(jià)類中的其他測(cè)試用例也能發(fā)現(xiàn)同樣的錯(cuò)誤;反之,如果某一類中的一個(gè)測(cè)試用例沒(méi)有發(fā)現(xiàn)錯(cuò)誤,則這一類中的其他測(cè)試用例也不會(huì)查出錯(cuò)誤(除非

等價(jià)類中的某些測(cè)試用例又屬于另一等價(jià)類,因?yàn)閹讉€(gè)等價(jià)類是可能相交的)。對(duì)程序TRIANGLE來(lái)說(shuō),它的某一個(gè)“等價(jià)類”可以是“大于零的三個(gè)等值數(shù)”,如果這個(gè)等價(jià)類中的某一測(cè)試用例(如a=b=c=4)沒(méi)有發(fā)現(xiàn)錯(cuò)誤,那么這一等價(jià)類的其他測(cè)試用例(如a=b=c=10、a=b=c=256、……等)也不會(huì)發(fā)現(xiàn)錯(cuò)誤,我們就可以把精力轉(zhuǎn)移到其他方面(即其他等價(jià)類)。用等價(jià)分類法設(shè)計(jì)測(cè)試用例可分兩步進(jìn)行:

·劃分等價(jià)類。

·選擇測(cè)試用例。

下面分別討論這兩步。

1.劃分等價(jià)類

這一步先從程序的功能說(shuō)明中找出一些輸入條件(通常是功能說(shuō)明中的一句話或一個(gè)短語(yǔ)),然后為每個(gè)輸入條件劃分兩個(gè)或更多個(gè)等價(jià)類,此時(shí)可以使用表6.5的表格。該表格中有“不合理等價(jià)類”兩項(xiàng),“合理等價(jià)類”是指程序的合理輸入數(shù)據(jù),“不合理等價(jià)類”指所有其他的數(shù)據(jù)(即非法的輸入數(shù)據(jù)),這樣做是符合6.1中指出的第三條基本原則的。劃分等價(jià)類在很大程度上是試探性的,下面幾點(diǎn)可供參考:

1)如果某個(gè)輸入條件說(shuō)明了輸入值的范圍(如“數(shù)據(jù)值”是從1到999),則可劃分一個(gè)合理等價(jià)類(大于等于1而小于等于999的數(shù))和兩個(gè)不合理等價(jià)類(小于1的數(shù),以及大

于999的數(shù))。

2)如果某個(gè)輸入條件說(shuō)明了輸入數(shù)據(jù)的個(gè)數(shù)(如每個(gè)學(xué)生可以選修1至3門(mén)課程),則可劃分一個(gè)合理等價(jià)類(選修l~3門(mén)課程)和兩個(gè)不合理等價(jià)類(沒(méi)選修課程,以及超過(guò)3門(mén)課程)。

3)如果一個(gè)輸入條件說(shuō)明了一個(gè)“必須成立”的情況(如標(biāo)識(shí)符的第一個(gè)字符必須是字母),則可劃分一個(gè)合理等價(jià)類(第一字符是字母),和一個(gè)不合理等價(jià)類(第一字符不是

字母)。

4)如果某個(gè)輸入條件說(shuō)明了輸入數(shù)據(jù)的一組可能的值,而且認(rèn)為程序是用不同的方式處理每一種值的(如職稱的輸入值可以是助教、講師、副教授和教授4種),則可為每一種值劃分一個(gè)合理等價(jià)類(如助教、講師、副教授和教授4種),并劃分一個(gè)不合理等價(jià)類(上述4種職稱之外的任意值)。

5)如果認(rèn)為程序?qū)床煌姆绞絹?lái)處理某個(gè)等價(jià)類中的各種測(cè)試用例,則應(yīng)將這個(gè)等價(jià)類再分成幾個(gè)更小的等價(jià)類。如上面第4)點(diǎn)就是將一個(gè)合理等價(jià)類又分成助教、講師

等4個(gè)等價(jià)類。

2.選擇測(cè)試用例

這一步又可分三步進(jìn)行:

1)為每個(gè)等價(jià)類編號(hào)。

2)設(shè)計(jì)一個(gè)新的測(cè)試用例,使它能包括盡可能多的尚未被包括的合理等價(jià)類;重復(fù)做這一步,直至這些測(cè)試用例已包括所有的合理等價(jià)類。

3)設(shè)計(jì)一個(gè)新的測(cè)試用例,使它包括一個(gè)(而且僅僅一個(gè))尚未被包括的不合理等價(jià)類,重復(fù)做這一步,直至測(cè)試用例已包括所有的不合理等價(jià)類。必須注意的是,這一步應(yīng)使每個(gè)例子僅包括一個(gè)不合理等價(jià)類。這樣做的原因是:程序中的某些錯(cuò)誤檢測(cè)往往會(huì)抑制其他的錯(cuò)誤檢測(cè),例如某個(gè)程序的功能說(shuō)明中指出:輸入

數(shù)據(jù)是書(shū)的“類型”(它可以是“精裝”、“平裝”和“線裝”)和書(shū)的“數(shù)量’’(其允許值是l~999),如果某個(gè)測(cè)試用例中,書(shū)的“類型”是“活頁(yè)”,書(shū)的“數(shù)量”是0,他包括了兩個(gè)不合理的條件(“類型”和“數(shù)量”都不合理),程序在發(fā)現(xiàn)“類型”不合理之后,可能不會(huì)再去檢查

“數(shù)量”是否合理,因此這一部分程序?qū)嶋H上并沒(méi)有測(cè)試到。假定我們?yōu)镕ORTRAN語(yǔ)言設(shè)計(jì)了一個(gè)編譯系統(tǒng),現(xiàn)在要測(cè)試該編譯系統(tǒng)中對(duì)DI—MENSION語(yǔ)句作語(yǔ)法檢查的部門(mén),這一部門(mén)的功能說(shuō)明是:

“DIMENSION語(yǔ)句的形式是:

DIMENSION以[,以]..…·

這里以ad是數(shù)組描述,它的形式是n(d[,d]……),n是數(shù)組名,d是界偶。數(shù)組名由1至6字母或數(shù)字組成,其中第一個(gè)字符必須是字母。界偶可以有1至7個(gè),它的形式是[lb:]ub。和ub分別是下界和上界,它們可以是一65534至65535之間的常數(shù),或者是整數(shù)變量名(但不能是數(shù)組元素名)。如果沒(méi)有l(wèi)b,則認(rèn)為下界是1。ub的值必須大于或等于lb)。如果有l(wèi)b,lb的值可以是負(fù)數(shù)、零或正數(shù)。同其它語(yǔ)句一樣,DIMENSION語(yǔ)句可以連續(xù)幾行。”

使用等價(jià)分類法的第一步是根據(jù)功能說(shuō)明中的輸入條件劃分等價(jià)類,這就得到了表6.6,表格中括號(hào)內(nèi)的數(shù)字是等價(jià)類的編號(hào)。

DIMENSIONA(2)

它包括合理等價(jià)類1、4、7、10、12、l5、24、28、29和40。

還要再設(shè)計(jì)一個(gè)或幾個(gè)例子使它們包括余下的合理等價(jià)類,例如

DIMENSION

A12345(I,9,J4XXXX,65534,1,KLM,100),

1BBB(一65534:100,0:l000,10:10,1:65535)

這個(gè)例子把余下的合理等價(jià)類都包括了。還需要設(shè)計(jì)一些例子,使每個(gè)例子包含一個(gè)不合理的等價(jià)類,例如:

DIMENSION (3)

DIMENSION

(10) (5)

DIMENSIONA234567(2)(6)

DIMENSIONA

I(2) (9)

DIMENSIONlA(10) (11)

DIMENSIONB (13)

DIMENSIONS(4,4,4,4,4,4,4,4)(14)

DIMENSIONB(4,A(2)) (16)

DIMENSIONB(4,,7) (18)

DIMENSIONC(I.,l0) (20)

DIMENSIONC(10,1J) (23)

DIMENSIOND(一65535:1) (25)

DIMENSIOND(65536) (26)

DIMENSIOND(4:3) (30)

DIMENSIOND(A(2):4)(36)

DIMENSIOND(.:4)(38)

(右邊括號(hào)內(nèi)的數(shù)是該例子所包含的等價(jià)類之編號(hào))

這樣,共選擇l8個(gè)測(cè)試用例就可以包括所有等價(jià)類。

等價(jià)分類法比隨機(jī)地選擇測(cè)試用例要優(yōu)越得多。這個(gè)方法的缺點(diǎn)是沒(méi)有注意選用某些“高產(chǎn)的”測(cè)試用例,下一節(jié)介紹邊緣值分析法,可以彌補(bǔ)這一缺點(diǎn)。6.5.2邊緣值分析法

經(jīng)驗(yàn)告訴我們,程序往往在處理邊緣情況時(shí)易犯錯(cuò)誤,所以檢查邊緣情況的測(cè)試用例是比較高效的。這里“邊緣情況”是指輸入等價(jià)類或輸出等價(jià)類邊界上的情況。

邊緣值分析法與等價(jià)分類法的差別在于:

1)邊緣值分析法不是從一個(gè)等價(jià)類中任選一個(gè)例子作代表,而是選一個(gè)或幾個(gè)例子,使得該等價(jià)類的邊界情況成為測(cè)試的主要目標(biāo)。

2)邊緣值分析不僅注意輸入條件,它還根據(jù)輸出的情況(即按輸出等價(jià)類)設(shè)計(jì)測(cè)試用例。

運(yùn)用邊緣值分析法,需要有一定的創(chuàng)造性,以下幾點(diǎn)供使用時(shí)參考:

1)如果某個(gè)輸入條件說(shuō)明了值的范圍,則可選擇一些恰好取到邊界值的例子,另外,再編寫(xiě)一些代表不合理輸入數(shù)據(jù)的例子,它們的值恰好越過(guò)邊界。例如:輸入值的范圍是一1.0至1.0,則可選一1.0、1.0、一1.00l和1.001等例子。

2)如果一個(gè)輸入條件指出了輸入數(shù)據(jù)的個(gè)數(shù),則為最小個(gè)數(shù)、最大個(gè)數(shù)、比最小個(gè)數(shù)少1、比最大個(gè)數(shù)多1、分別設(shè)計(jì)例子。例如:一個(gè)輸入文件可以有1~255個(gè)記錄,則分別

設(shè)計(jì)有0個(gè)、1個(gè)、255個(gè)和256個(gè)記錄的輸入文件。

3)為每個(gè)輸出條件使用上面第1)點(diǎn)。例如:某個(gè)程序的功能是計(jì)算折扣量,最低折扣量是0元,最高折扣量是1050元,則設(shè)計(jì)一些例子,使它們恰好產(chǎn)生0元或1050元的結(jié)果,此外還應(yīng)考慮是否可設(shè)計(jì)結(jié)果為負(fù)值或大于1050元的例子。由于輸入值的邊界并不與輸出值的邊界相對(duì)應(yīng)(例如計(jì)算SIN(X)的程序),所以要檢查輸出的邊界值不一定可能,要產(chǎn)生輸出值域之外的結(jié)果也不一定可能,盡管如此,考慮

這種情況還是非常值得的。

4)為每個(gè)輸出條件使用上面第2)點(diǎn)。例如一個(gè)情報(bào)檢索系統(tǒng)根據(jù)用戶打入的命令顯示有關(guān)文獻(xiàn)的摘要,但是最多只提供4篇摘要,則可設(shè)計(jì)一些例子,使得程序分別產(chǎn)生0篇、1篇或4篇摘要,并設(shè)計(jì)一個(gè)有可能使程序錯(cuò)誤地顯示5篇摘要的例子。

5)如果程序的輸入和輸出是有序集合(如順序文件、線性表等),則應(yīng)特別注意集合的第一個(gè)或最后一個(gè)元素。

下面以程序TRIANGLE為例說(shuō)明邊緣值分析法與等價(jià)分類法的差別。程序的功能說(shuō)明中指出了:三個(gè)輸入數(shù)據(jù)表示一個(gè)三角形的三條邊長(zhǎng),所以其中任意兩個(gè)之和應(yīng)大于第三

個(gè)。如果采用等價(jià)分類法,我們至少可找出兩個(gè)等價(jià)類:一類是滿足上述條件的合理等價(jià)一類,另一類是兩個(gè)輸入數(shù)之和不大于第三個(gè)的不合理等價(jià)類,因此可以設(shè)計(jì)兩個(gè)例子:

①a=3,b=4,c=5

②a=l,b=2,c=4如果程序中將表達(dá)式a+b>c錯(cuò)誤地寫(xiě)成a+b≥c,上述兩個(gè)例子是不能發(fā)現(xiàn)這一錯(cuò)誤的。而采用邊緣值分析法,則會(huì)選擇例子:

a=1,b=2,c=3

從而使上述錯(cuò)誤暴露出來(lái)。所以等價(jià)分類法與邊緣值分析法的主要差別在于:后者是著重檢查等價(jià)類邊界上的情況。最后用一個(gè)實(shí)例說(shuō)明如何使用邊緣值分析法。

程序MTEST的功能是批閱試卷,并產(chǎn)生成績(jī)報(bào)告(試題全是選擇題)。輸入文件的格式見(jiàn)圖6.11,文件中每一個(gè)記錄均由一張80個(gè)字符的卡片組成。第一張卡片是標(biāo)題,其內(nèi)容用于產(chǎn)生成績(jī)報(bào)告的標(biāo)題。后面一組卡片描述了試卷的標(biāo)準(zhǔn)答案,其中每張卡片撮后一個(gè)字符都是“2”。這組卡片的第一張中,第1~3位是試題數(shù)(1~999題),第10~59位是第1~50題的標(biāo)準(zhǔn)答案(如A、B、C、D等),后面的卡片在10~59位依次給出第51~100、第101~150題……的標(biāo)準(zhǔn)答案。第三組卡片表示學(xué)生的答卷,其中每張卡片的最后一個(gè)字符是“3”。圖6.11每一個(gè)學(xué)生的第一張卡片中,對(duì)1~9位是學(xué)號(hào),第10~59位是學(xué)生對(duì)第1~50題的回答,后面卡片的第10~59位依次是這個(gè)學(xué)生對(duì)第5l~100題、第101~150題……的回答。學(xué)生人數(shù)不超過(guò)200人。

程序的輸出是4個(gè)報(bào)告:

1)按學(xué)號(hào)排列的成績(jī)報(bào)告,列出每個(gè)學(xué)生的成績(jī)(百分制)和名次。

2)同第一張報(bào)告類似,但是按成績(jī)排序。

3)平均成績(jī)和標(biāo)準(zhǔn)偏差的報(bào)告。

4)試題分析報(bào)告:按試題號(hào)排序,列出能正確回答該題的學(xué)生百分?jǐn)?shù)。使用邊緣值分析法首先要仔細(xì)閱讀程序的功能說(shuō)明,以便找出輸入條件。

本例中第一個(gè)輸入條件的邊緣值是“空”的輸入文件二第二個(gè)輸入條件是標(biāo)題卡,其邊緣值是沒(méi)有標(biāo)題卡、最短標(biāo)題和最長(zhǎng)標(biāo)題。

下一輸入條件是關(guān)于標(biāo)準(zhǔn)答案和試題數(shù)的。試題數(shù)的合理等價(jià)類可以是1~999,但考慮到對(duì)第50個(gè)試題,程序要作些特殊處理,所以將這個(gè)等價(jià)類再劃分成1~50題和51~999題更好些。我們可以設(shè)計(jì)試題數(shù)分別為0、1、50、51和999的例子,它們也包括了標(biāo)準(zhǔn)答案卡片數(shù)的邊緣值。另外三個(gè)值得注意的情況是:沒(méi)有標(biāo)準(zhǔn)答案卡、標(biāo)準(zhǔn)答案卡過(guò)多

和標(biāo)準(zhǔn)答案卡過(guò)少(例如試題數(shù)是60,但標(biāo)準(zhǔn)答案卡卻有三張或只有一張)。至此,我們可以選擇以下一些測(cè)試用例:

1)“空”的輸入文件。

2)沒(méi)有標(biāo)題卡。

3)一個(gè)字符的標(biāo)題。

4)80字符的標(biāo)題。

5)試題數(shù)為l。

6)試題數(shù)為50。

7)試題數(shù)為5l。

8)試題數(shù)為999。

9)試題數(shù)為0。10)試題數(shù)中含有非數(shù)字的字符。

11)標(biāo)題卡后沒(méi)有標(biāo)準(zhǔn)答案卡。

12)標(biāo)準(zhǔn)答案卡過(guò)多。

13)標(biāo)準(zhǔn)答案卡過(guò)少。

·

下一個(gè)輸入條件與學(xué)生人數(shù)以及學(xué)生的答卷有關(guān),用邊緣值分析法可以編寫(xiě)下面一些例子:

14)

0個(gè)學(xué)生。

15)

1個(gè)學(xué)生。16)200個(gè)學(xué)生。

17)201個(gè)學(xué)生。

18)有2張標(biāo)準(zhǔn)答案卡,但是某個(gè)學(xué)生只有一張答卷卡。

19)例18)中的學(xué)生是第一個(gè)學(xué)生。

20)例18)中的學(xué)生是最后一個(gè)學(xué)生。

21)有1張標(biāo)準(zhǔn)答案卡,但是某個(gè)學(xué)生有2張答卷卡。

22)例21)中的學(xué)生是第一個(gè)學(xué)生。

23)例21)中的學(xué)生是最后一個(gè)學(xué)生。再考慮輸出的邊緣情況,上面的例子實(shí)際上已包括了一些輸出的邊緣值,如例1)產(chǎn)生“空”的報(bào)告,例14)、15)、16)表示0個(gè)、1個(gè)、200個(gè)學(xué)生等。我們還可再設(shè)計(jì)其他一些

例子:

24)所有學(xué)生的成績(jī)都相等。

25)每個(gè)學(xué)生的成績(jī)都不相等。

26)部分學(xué)生的成績(jī)相等(檢查是否能正確地排名次)。

27)有個(gè)學(xué)生得,0分。

28)有個(gè)學(xué)生得100分。

29)有個(gè)學(xué)生的學(xué)號(hào)取最小值(檢查按學(xué)號(hào)排序是否正確)。

30)有個(gè)學(xué)生的學(xué)號(hào)取最大值。

31)適當(dāng)?shù)膶W(xué)生人數(shù),使產(chǎn)生的報(bào)告恰好印滿一頁(yè)(檢查是否會(huì)輸出多余的頁(yè))。

32)學(xué)生人數(shù)比例31)再多1個(gè)。

第三個(gè)報(bào)告的邊緣情況是:

33)平均成績(jī)?yōu)?00(所有學(xué)生都得滿分)。

34)平均成績(jī)?yōu)?(所有學(xué)生都得零分)。

35)標(biāo)準(zhǔn)偏差為最大值(一個(gè)學(xué)生得0分,其他學(xué)生都得100分)。

36)標(biāo)準(zhǔn)偏差為0(所有學(xué)生的成績(jī)都相同)。第四個(gè)報(bào)告的邊緣值是:

37)所有學(xué)生都答對(duì)了試題1。

38)所有學(xué)生都答錯(cuò)了試題1。

39)所有學(xué)生都答對(duì)了最后一題。

40)所有學(xué)生都答錯(cuò)了最后一題。

41)選擇適當(dāng)?shù)脑囶}數(shù),使第四個(gè)報(bào)告恰好印滿一頁(yè)。

42)試題數(shù)比例41)再多1道。有經(jīng)驗(yàn)的程序員都會(huì)認(rèn)為上述42個(gè)測(cè)試用例可以發(fā)現(xiàn)程序中大部分常見(jiàn)的錯(cuò)誤了,而用隨機(jī)雜湊方式產(chǎn)生的例子就未必能發(fā)現(xiàn)這些錯(cuò)誤。如果使用得當(dāng),邊緣值分析法是很

有效的,但是這個(gè)方法雖然表面上看起來(lái)簡(jiǎn)單,然而許多程序的邊緣情況極其復(fù)雜,要找出適當(dāng)?shù)睦舆€是頗費(fèi)心血的。6.5.3因果圖法

等價(jià)分類法和邊緣值分析法的缺點(diǎn)是沒(méi)有檢查各種輸入條件的組合,例如上一節(jié)的程序MTEST應(yīng)該檢查試題數(shù)和學(xué)生人數(shù)的乘積是否超過(guò)了存儲(chǔ)的容量,而用邊緣值分析法

是不能檢查程序在這類問(wèn)題上是否有錯(cuò)誤的。

要檢查輸入條件的組合并非易事,因?yàn)榧词箍梢詫⑤斎霔l件分成等價(jià)類,但它們的組合情況可能極多,如果沒(méi)有一個(gè)系統(tǒng)的方法是難以設(shè)計(jì)測(cè)試用例的。

3.5.3已指出:程序的功能說(shuō)明可以用判定表的形式來(lái)書(shū)寫(xiě)(如該節(jié)討論的“檢查訂購(gòu)單”一例),這些程序?qū)⒏鶕?jù)輸入條件的組合情況執(zhí)行某些操作。很自然地,我們應(yīng)該為判

定表中的每一列設(shè)計(jì)一個(gè)測(cè)試用例,以便檢查程序在輸入條件的某種組合情況下,其操作是否有誤。

因果圖法著重檢查輸入條件的備件組合情況,其基本思想是:從用自然語(yǔ)言書(shū)寫(xiě)的功能說(shuō)明中找出因(輸入條件)和果(輸出或程序狀態(tài)的修改),通過(guò)畫(huà)因果圖將功能說(shuō)明轉(zhuǎn)換

成一張判定表,然后為判定表的第一列設(shè)計(jì)測(cè)試用例。.6.5.4錯(cuò)誤推測(cè)法

人們也可以通過(guò)經(jīng)驗(yàn)或直覺(jué)推測(cè)程序中可能存在的各種錯(cuò)誤,從而有針對(duì)性地編寫(xiě)檢查這些錯(cuò)誤的例子,這就是錯(cuò)誤推測(cè)法。

錯(cuò)誤推測(cè)法沒(méi)有確定的步驟,很大程度上是憑經(jīng)驗(yàn)進(jìn)行的。例如輸入數(shù)據(jù)為零或輸出數(shù)據(jù)為零是容易發(fā)生錯(cuò)誤的情況,所以可選擇輸入值為零的例子,以及使輸出值為零的例

子;又如輸入表格為“空”或輸入表格只有一行是較易出錯(cuò)誤的情況,所以可選擇表示這些情況的例子。下面看幾個(gè)例子。

[例1]對(duì)一個(gè)排序程序,我們可以列出以下幾種特別需要檢查的情況:

1)輸入表為空。

2)輸入表中只有一行。

3)輸入表中所有的行都具有相同的值。

4)輸入表已經(jīng)是排序的。

換句話說(shuō),這幾點(diǎn)正是編程序時(shí)容易忽略的情況,所以應(yīng)當(dāng)重點(diǎn)檢查。

[例2]對(duì)一個(gè)采用兩分法的檢索程序,可以列出以下這些需要檢查的情況。

1)被檢索的表格只有一行。

2)表格的行數(shù)恰好是2的冪次(如16)。

3)表格的行數(shù)比2的冪次多1或少1(如15、17)。

[例3]對(duì)上一節(jié)的程序MTEST,用錯(cuò)誤推測(cè)法還可設(shè)計(jì)一些例子:

1)這個(gè)程序是否認(rèn)為“空”(即學(xué)生沒(méi)有做某道題)也是一種回答。

2)在答卷卡中又混有標(biāo)準(zhǔn)答案卡。

3)除了標(biāo)題卡之外,還有一些卡片的最后一個(gè)字符既不是“2”又不是“3”。

4)有兩個(gè)學(xué)生的學(xué)號(hào)相同。

5)試題數(shù)為負(fù)值。6.5.5綜合策略

6.4和6.5分別介紹了設(shè)計(jì)測(cè)試用例的白盒法和黑盒法,這些方法各有長(zhǎng)處和短處,每種方法都可提供一組有用的測(cè)試用例,這組測(cè)試用例容易發(fā)現(xiàn)某種類型的錯(cuò)誤,但不易

發(fā)現(xiàn)其他類型的錯(cuò)誤,然而沒(méi)有一種方法能提供一組“完整的”測(cè)試用例。

為了檢驗(yàn)各種測(cè)試方法的實(shí)際效果,IBM公司的Myers曾經(jīng)做過(guò)一個(gè)試驗(yàn),請(qǐng)一些軟件專家測(cè)試一個(gè)PL/I程序,該程序長(zhǎng)度為70行,已知其中至少有15個(gè)錯(cuò)誤;軟件專家共59人,每人都有豐富的實(shí)際經(jīng)驗(yàn),平均工齡11年(最短7年,最長(zhǎng)20年)。

Myers將專家分為3組,第1組采用白盒法,即為他們提供程序的功能要求及程序清單,請(qǐng)他們用計(jì)算機(jī)測(cè)試;第2組用黑盒法,即只提供程序的功能要求,請(qǐng)他們上機(jī)測(cè)試;

第3組用評(píng)審的方法,即提供程序功能要求和程序清單,請(qǐng)他們?cè)u(píng)閱程序。3組人員均無(wú)測(cè)試時(shí)間的限制。這個(gè)試驗(yàn)的結(jié)果是:每個(gè)專家平均發(fā)現(xiàn)5.1個(gè)錯(cuò)誤,成績(jī)最好的發(fā)現(xiàn)9個(gè)錯(cuò)誤,最差的發(fā)現(xiàn)1個(gè)錯(cuò)誤,3個(gè)小組的情況大致相同。

從這個(gè)試驗(yàn)可以得出兩個(gè)結(jié)論:

1)運(yùn)用目前的測(cè)試手段,其效果是很有限的。.

2)評(píng)審法、白盒法和黑盒法的效果是相近的。

開(kāi)發(fā)實(shí)際系統(tǒng)時(shí),為了較全面而嚴(yán)格地進(jìn)行檢驗(yàn),必須綜合運(yùn)用前面介紹的各種方法,下面繼續(xù)以程序BONUS為例說(shuō)明之。

6.4.6用白盒法為程序BONUS設(shè)計(jì)了4個(gè)測(cè)試用例,這4個(gè)測(cè)試用例是不夠的,現(xiàn)在我們?cè)儆煤诤蟹ㄑa(bǔ)充一些測(cè)試用例。

從BONUS的功能說(shuō)明可看出,該例不必檢查輸入條件的組合情況,所以不需要用因果圖法,這里我們先用邊緣值分析法。該程序中輸入的邊緣情況有:

1)EMPTAB具有1個(gè)記錄。

2)EMPTAB具有最大個(gè)數(shù)的記錄(女1365535個(gè)記錄)。

3)EMPT.AB具有零個(gè)記錄。

4)DEPTTAB具有1個(gè)記錄。

5)DEPTTAB具有65535個(gè)記錄。

6)DEPTTAB具有零個(gè)記錄。

7)銷售量最大的部門(mén)有1個(gè)職員。

8)銷售量最大的部門(mén)有65535個(gè)職員。

9)銷售量最大的部門(mén)沒(méi)有職員。

10)所有部門(mén)的銷售量相等。

11)DEPTTAB中,第一個(gè)部門(mén)的銷售量最大。

12)DEPTTAB中,最后一個(gè)部門(mén)的銷售量

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論