2017年全國計(jì)算機(jī)等級(jí)考試四級(jí)綱要輔導(dǎo)3

字號(hào):


     3.信息隱蔽
     信息隱蔽是開發(fā)整體程序結(jié)構(gòu)時(shí)使用的法則,即將每個(gè)程序的成分隱蔽或封裝在一個(gè)單一的設(shè)計(jì)模塊中,定義每一個(gè)模塊時(shí)盡可能少地顯露其內(nèi)部的處理。在設(shè)計(jì)時(shí)首先列出一些可能發(fā)生變化的因素,在劃分模塊時(shí)將一個(gè)可能發(fā)生變化的因素隱蔽在某個(gè)模塊的內(nèi)部,使其他模塊與這個(gè)因素?zé)o關(guān)。在這個(gè)因素發(fā)生變化時(shí),我們只需修改含有這個(gè)因素的模塊,而與其他模塊無關(guān)。隱蔽的對(duì)象可以有:什么的決策,可能修改的決策,數(shù)據(jù)結(jié)構(gòu)的內(nèi)部連接以及對(duì)它所做的操作細(xì)節(jié),內(nèi)部特征碼,與計(jì)算機(jī)硬件有關(guān)的細(xì)節(jié)等。信息隱蔽原則對(duì)提高軟件的可修改性、可測(cè)試性和可移植性都有重要的作用。
     4.模塊獨(dú)立
     模塊獨(dú)立是指每個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的特定子功能,并且與其他模塊之間的聯(lián)系簡單。衡量模塊獨(dú)立程序的度量標(biāo)準(zhǔn)有兩個(gè):耦合和內(nèi)聚。耦合是指模塊之間聯(lián)系的緊密程度。耦合度越高則模塊的獨(dú)立性越差。內(nèi)聚是指模塊內(nèi)部各元素之間聯(lián)系的緊密程度。例如一個(gè)完成多個(gè)功能的模塊的內(nèi)聚度就比完成單一功能的模塊的內(nèi)聚度低。內(nèi)聚度越低模塊的獨(dú)立性越差。因此,模塊獨(dú)立就是希望每個(gè)模塊都是高內(nèi)聚低耦合的。
     (1)耦合
     兩個(gè)模塊之間的耦合方式通常有如下7種,下面按它們的耦合度從低到高的次序依次作介紹。
     ① 非直接耦合:非直接耦合是指兩個(gè)模塊沒有直接的聯(lián)系,它們中的任一個(gè)都能不依賴于對(duì)方而獨(dú)立地工作。來源:www.examda.com
     ② 數(shù)據(jù)耦合:數(shù)據(jù)耦合是指兩個(gè)模塊借助于參數(shù)表傳遞簡單數(shù)據(jù)。
     ③ 標(biāo)記耦合(stamp coupling):當(dāng)一個(gè)數(shù)據(jù)結(jié)構(gòu)的一部分(如記錄的一部分)借助于模塊接口被傳遞時(shí)就發(fā)生標(biāo)記耦合。
     ④ 控制耦合:控制耦合指兩個(gè)模塊間傳遞的信息中包含用于控制模塊內(nèi)部邏輯的控制信息。
     ⑤ 外部耦合:當(dāng)模塊與軟件以外的環(huán)境有關(guān)時(shí)就發(fā)生外部耦合。例如,輸入/輸出把一個(gè)模塊與特定的設(shè)備、格式、通信協(xié)議耦合在一起。
     ⑥ 公共耦合:多個(gè)模塊引用一全局?jǐn)?shù)據(jù)區(qū)的模式稱為公共耦合。例如FORTRAN語言中的COMMON語句,C語言中的external數(shù)據(jù)類型,一個(gè)磁盤文件等都是全局?jǐn)?shù)據(jù)區(qū)。
     ⑦內(nèi)容耦合:內(nèi)容耦合指兩上模塊之間出現(xiàn)了下列情況之一:
     一個(gè)模塊訪問另一個(gè)模塊的內(nèi)部數(shù)據(jù);
     一個(gè)模塊不通過正常入口轉(zhuǎn)到另一模塊的內(nèi)部;
     兩個(gè)模塊有一部分程序代碼重疊;
     一個(gè)模塊有多個(gè)入口。
     (2)內(nèi)聚
     模塊的內(nèi)聚種類通??煞殖?種,下面按內(nèi)聚度從低到高的次序依次作介紹。
     ①偶然內(nèi)聚:如果一個(gè)模塊完成一組任務(wù),這組任務(wù)彼此間即使有關(guān)系,其關(guān)系也是很松散的,這個(gè)模塊屬于偶然內(nèi)聚。
     ②邏輯內(nèi)聚:如果一個(gè)模塊完成邏輯上相關(guān)的一組任務(wù),這個(gè)模塊是邏輯內(nèi)聚的。例如,產(chǎn)生與類型無關(guān)的全部輸出的模塊。
     ③瞬時(shí)內(nèi)聚(temporal cohesion):如果一個(gè)模塊所包含的任務(wù)必須在同一時(shí)間間隔內(nèi)執(zhí)行,這個(gè)模塊屬于瞬時(shí)內(nèi)聚。例如初始化模塊。
     ④過程內(nèi)聚:如果一個(gè)模塊的處理元素是相關(guān)的,而且必須按特定的次序執(zhí)行,這個(gè)模塊屬于過程內(nèi)聚。
     ⑤通信內(nèi)聚:如果一個(gè)模塊的所有處理元素集中在一個(gè)數(shù)據(jù)結(jié)構(gòu)的區(qū)域上,該模塊屬于通信內(nèi)聚。例如,一個(gè)模塊中的所有處理元素使用同一輸入數(shù)據(jù)。
     ⑥順序內(nèi)聚:如果一個(gè)模塊的處理元素是相關(guān)的,而且必須順序執(zhí)行,這個(gè)模塊屬于順序內(nèi)聚。
     ⑦功能內(nèi)聚:如果一個(gè)模塊完成一個(gè)單一的功能,模塊中的各部分在此目標(biāo)下協(xié)同工作,而且都是為完成這一功能而不可缺少的,那么這個(gè)模塊是功能內(nèi)聚的。
     5.模塊分解時(shí)應(yīng)遵循的準(zhǔn)則
     (1)滿足信息隱蔽原則
     (2)盡量使得模塊的內(nèi)聚度高,模塊間的耦合度低。
     (3)模塊的大小適中(通常一個(gè)模塊以50~100個(gè)語句行為適宜)。
     (4)模塊的調(diào)用深度不宜過大。一個(gè)模塊A可以調(diào)用另一模塊B,模塊B還可調(diào)用模塊C,稱模塊A直接調(diào)用模塊B,模塊A間接調(diào)用模塊C,被間接調(diào)用的模塊還可調(diào)其他模塊,這樣可形成一棵調(diào)用樹,我們把以某個(gè)模塊為根結(jié)點(diǎn)的調(diào)用樹的深度稱為該模塊的調(diào)用深度。
     (5)模塊的扇入應(yīng)盡量大,扇出不宜過大。一個(gè)模塊的扇入是指直接調(diào)用該模塊的上級(jí)模塊個(gè)數(shù)。一個(gè)模塊的扇出是指該模塊直接調(diào)用的下級(jí)模塊的個(gè)數(shù)。扇入大表示模塊的復(fù)用程序高,扇出大表示模塊的復(fù)雜度高。
     (6)設(shè)計(jì)單入口和單出口的模塊。
     (7)模塊的作用域應(yīng)在控制域之內(nèi)。模塊的作用域是指受該模塊內(nèi)一個(gè)判定影響的所在模塊的集合。模塊的控制域是指該模塊本身以及被該模塊直接或間接調(diào)用的所有模塊的集合。在設(shè)計(jì)時(shí),作用域應(yīng)是控制域的子集,作用域是做出判定的模塊本身以及它的直屬下級(jí)模塊(直接調(diào)用的模塊)。
     (8)模塊的功能應(yīng)是可以預(yù)測(cè)的,功能可預(yù)測(cè)是指對(duì)相同的輸入數(shù)據(jù)能產(chǎn)生相同的輸出。
     三、軟件測(cè)試
     在軟件開發(fā)的一列活動(dòng)中,為了保證軟件的可靠性,人們研究并使用了很多方法進(jìn)行分析、設(shè)計(jì)及編碼實(shí)現(xiàn)。但是由于軟件產(chǎn)品本身無形態(tài),它是復(fù)雜的、知識(shí)高度密集的邏輯產(chǎn)品,其中不可能沒有錯(cuò)誤。物理產(chǎn)品在出廠前都要進(jìn)行嚴(yán)格的檢驗(yàn),軟件產(chǎn)品也不例外。軟件開發(fā)總伴隨著軟件質(zhì)量保證的活動(dòng),而軟件測(cè)試是主要活動(dòng)之一。軟件測(cè)試代表了需求分析、設(shè)計(jì)、編碼的最終復(fù)審。測(cè)試是一項(xiàng)很艱苦的工作,其工作量約占軟件開發(fā)總工作量的40%以上,特別對(duì)一些關(guān)系到人的生命安全的軟件,共測(cè)試成本可能相當(dāng)于開發(fā)階段總成本的3~5倍。來源:www.examda.com
     (一) 測(cè)試的基本概念
     1.測(cè)試的目的
     軟件測(cè)試的目的是盡可能多地發(fā)現(xiàn)軟件產(chǎn)品(主要是指程序)中的錯(cuò)誤和缺陷。明確測(cè)試的目的是一件非常重要的事,因?yàn)樵诂F(xiàn)實(shí)世界中對(duì)測(cè)試工作存在著許多模糊或者錯(cuò)誤的看法,這些看法嚴(yán)重影響著測(cè)試工作的順利進(jìn)行。有人認(rèn)為測(cè)試是為了證明程序是正確的,也就是說程序不再有錯(cuò)誤,事實(shí)證明這是不現(xiàn)實(shí)的。因?yàn)橐ㄟ^測(cè)試來發(fā)現(xiàn)程序中的所有錯(cuò)誤就要窮舉所有可能的輸入數(shù)據(jù),檢查它們是否產(chǎn)生正確的結(jié)果。例如,一個(gè)需要3個(gè)16位字長的整型輸入數(shù)據(jù)的程序,輸入數(shù)據(jù)的所有組合情況大約有3×10 14 種,若每組數(shù)據(jù)的測(cè)試時(shí)間為1ms,那么即使一年365天,每天24小時(shí)地測(cè)試,也大約需要1萬年的時(shí)間。
     2.測(cè)試用例
     要進(jìn)行測(cè)試,除了要有測(cè)試數(shù)據(jù)(或稱輸入數(shù)據(jù))外,還應(yīng)同時(shí)給出該組測(cè)試數(shù)據(jù)應(yīng)該得以怎樣的輸出結(jié)果,我們稱它為預(yù)期結(jié)果。在測(cè)試時(shí)將實(shí)際的輸出結(jié)果與預(yù)期結(jié)果比較,若不同則表示發(fā)現(xiàn)了錯(cuò)誤,因此測(cè)試用例是由測(cè)試數(shù)據(jù)和預(yù)期結(jié)果構(gòu)成的。為了發(fā)現(xiàn)程序中的錯(cuò)誤,應(yīng)竭力設(shè)計(jì)能暴露錯(cuò)誤的測(cè)試用例。一個(gè)好的測(cè)試用例是極有可能發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試用例。一次成功的測(cè)試是發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯(cuò)誤的測(cè)試。
     3.測(cè)試的原則
     基于上述測(cè)試目的,我們可以考慮以下有關(guān)測(cè)試的原則:
     (1)確定預(yù)期輸出結(jié)果是測(cè)試用例必不可少的一部分。如果只有測(cè)試數(shù)據(jù)而無預(yù)期結(jié)果,那么就不易判斷測(cè)試結(jié)果是否正確。
     (2)程序員應(yīng)避免測(cè)試自己的程序,程序設(shè)計(jì)機(jī)構(gòu)不應(yīng)測(cè)試自己的程序。這是因?yàn)槌绦蛑械腻e(cuò)誤往往是由于程序員對(duì)問題說明的誤解,由他來測(cè)試自己的程序就不易找出因這種誤解而產(chǎn)生的錯(cuò)誤。此外,開發(fā)程序是一項(xiàng)建設(shè)性的工作,而測(cè)試則是一項(xiàng)破壞性的工作(證明程序有錯(cuò)),這對(duì)開發(fā)人員或機(jī)構(gòu)來說在心理上是難以容忍的。為了證明自己的程序沒有錯(cuò)誤或錯(cuò)誤很少,他們往往不去選擇容易發(fā)現(xiàn)錯(cuò)誤的測(cè)試用例,而選擇容易通過的測(cè)試用例。當(dāng)然,這并不意味著程序員都不能測(cè)試自己的程序,如單元測(cè)試通常就是由程序員自己測(cè)試的。
     (3)徹底檢查每個(gè)測(cè)試結(jié)果。如果不仔細(xì)檢查測(cè)試結(jié)果,有些已經(jīng)測(cè)試出來的錯(cuò)誤也可能被遺漏掉。
     (4)對(duì)非法的非預(yù)期的輸入數(shù)據(jù)也要像合法的和預(yù)期的輸入數(shù)據(jù)一樣編寫測(cè)試用例。
     (5)檢查程序是否做了應(yīng)做的事是成功的一半,另一半是看程序是否做了不該做的事。
     (6)除了真正沒有用的程序外,一定不要扔掉測(cè)試用例。因?yàn)樵诟恼e(cuò)誤或程序維護(hù)后還要進(jìn)行重新測(cè)試。
     (7)在規(guī)劃測(cè)試時(shí)不要設(shè)想程序中不會(huì)查出錯(cuò)誤。
     (8)程序模塊經(jīng)測(cè)試后,殘存的錯(cuò)誤數(shù)目往往與已發(fā)現(xiàn)的錯(cuò)誤數(shù)目成比例。實(shí)踐證明,程序中的大量錯(cuò)誤僅與少量的程序模塊有關(guān),因此當(dāng)A模塊找出的錯(cuò)誤比B模塊多得多時(shí),很可能A模塊殘存的錯(cuò)誤仍比B模塊殘存的錯(cuò)誤多多。
     4.白盒測(cè)試和黑盒測(cè)試
     測(cè)試的關(guān)鍵是測(cè)試用例的設(shè)計(jì),其方法可分成兩類:白盒測(cè)試和黑盒測(cè)試。白盒測(cè)試是把程序看成裝在一只透明的白盒子里,測(cè)試者完全了解程序結(jié)構(gòu)和處理過程。它根據(jù)程序的內(nèi)部邏輯來設(shè)計(jì)測(cè)試用例,檢查程序中的邏輯通路是否都按預(yù)定的要求正確地工作。黑盒測(cè)試是把程序看成一只黑盒子,測(cè)試者完全不了解(或不考慮)程序的結(jié)構(gòu)和處理過程。它根據(jù)規(guī)格說明書規(guī)定的功能來設(shè)計(jì)測(cè)試用例,檢查程序的功能是否符合規(guī)格說明的要求。
     (二) 測(cè)試步驟
     軟件測(cè)試的主要步驟有單元測(cè)試,集成測(cè)試和確認(rèn)測(cè)試。
     1.單元測(cè)試(unit testing)
     單元測(cè)試也稱模塊測(cè)試。通常單元測(cè)試可放在編碼階段,程序員在編寫好一個(gè)模塊后,總會(huì)(也應(yīng)該)對(duì)自己編寫的模塊進(jìn)行測(cè)試,檢查它是否實(shí)現(xiàn)了詳細(xì)設(shè)計(jì)說明書中規(guī)定的模塊功能 和算法。單元測(cè)試主要發(fā)現(xiàn)編碼和詳細(xì)設(shè)計(jì)中產(chǎn)生的錯(cuò)誤,通常采用白盒測(cè)試。測(cè)試一個(gè)模塊時(shí)需要編寫一個(gè)驅(qū)動(dòng)模塊和若干個(gè)樁(stub)模塊,如下圖所示。驅(qū)動(dòng)模塊的功能是向被測(cè)試模塊提供測(cè)試數(shù)據(jù),驅(qū)動(dòng)(即調(diào)用)被測(cè)模塊,并從被測(cè)模塊中接受測(cè)試結(jié)果。樁模塊的功能是模擬被模塊所調(diào)用的子模塊,它接受被測(cè)模塊的調(diào)用,檢驗(yàn)調(diào)用參數(shù),模擬被調(diào)用的子模塊功能,把結(jié)果送回給被測(cè)模塊。在模塊結(jié)構(gòu)圖中,頂層模塊測(cè)試時(shí)不需要驅(qū)動(dòng)模塊,最底層的模塊測(cè)試時(shí)不需要樁模塊。
     2.集成測(cè)試(integration testing)
     集成測(cè)試也稱組裝測(cè)試,它是對(duì)由各模塊組裝而成的程序進(jìn)行測(cè)試,主要檢查模塊間的接口和通信。集成測(cè)試主要發(fā)現(xiàn)設(shè)計(jì)階段產(chǎn)生的錯(cuò)誤,通常采用黑盒測(cè)試。集成的方式可分成非漸增式集成和漸增式集成。非漸增式集成是先測(cè)試所有的模塊,然后把這些模塊集成在一起對(duì)整個(gè)程序進(jìn)行測(cè)試。漸增式集成是將單元測(cè)試和集成測(cè)試合并在一起,它根據(jù)模塊結(jié)構(gòu)圖,按某種次序選一個(gè)尚未測(cè)試的模塊,把它同已經(jīng)測(cè)試好的模塊組合在一起對(duì)整個(gè)程序進(jìn)行測(cè)試,每次增加一個(gè)模塊,直至所有模塊全部集成在程序中。漸增式集成又可分成自頂向下集成和自底向上集成。自頂向下集成先測(cè)試上層模塊,再測(cè)試下層模塊。由于測(cè)試下層模塊時(shí)它的上層模塊已測(cè)試過,所以可以用其上層模塊作為它的驅(qū)動(dòng)模塊,而不必另編驅(qū)動(dòng)模塊。自底向上集成先測(cè)試下層模塊,再測(cè)試上層模塊。同樣道理,在自底向上集成時(shí)可用下層模塊作為上層模塊的樁模塊,而不必另外編寫樁模塊。
     3.確認(rèn)測(cè)試(walidation testing)
     確認(rèn)測(cè)試的任務(wù)是檢查軟件的功能、性能及其他特征是否與用戶的需求一致,它是以需求規(guī)格說明書(即需求規(guī)約)作為依據(jù)的測(cè)試。確認(rèn)測(cè)試通常采用黑盒測(cè)試。確認(rèn)測(cè)試首先測(cè)試程序是否滿足需求規(guī)格說明書所列的各項(xiàng)要求,然后要進(jìn)行軟件配置復(fù)查,特別是文檔是否齊全,各方面的質(zhì)量是否符合要求等。如果一個(gè)軟件是為某個(gè)客戶定制的,那么最后由客戶來實(shí)施驗(yàn)收測(cè)試(acceptance testing),以便客戶確認(rèn)該軟件是否他所需要的。如果一個(gè)軟件是作為產(chǎn)品被許多客戶使用的話,那不可能為每個(gè)客戶進(jìn)行驗(yàn)收測(cè)試。大多數(shù)軟件生產(chǎn)者使用一種Alpha測(cè)試和Beta測(cè)試的過程,來揭露僅由最終用戶才能發(fā)現(xiàn)的錯(cuò)誤。Alpha測(cè)試是在開發(fā)者的現(xiàn)場(chǎng)由客戶來實(shí)施的,被測(cè)試的軟件是在開發(fā)者從用戶的角度進(jìn)行常規(guī)設(shè)置的環(huán)境下運(yùn)行的。Beat測(cè)試是在一個(gè)或多個(gè)客戶的現(xiàn)場(chǎng)由該軟件的最終用戶實(shí)施的。與Alpha測(cè)試不同的是,Beat測(cè)試時(shí)開發(fā)者通常是不在場(chǎng)的。Alpha測(cè)試和Beat測(cè)試除了進(jìn)一步發(fā)現(xiàn)程序中的錯(cuò)誤外,還能發(fā)現(xiàn)使用上的問題。經(jīng)過確認(rèn)測(cè)試后的軟件通常就可交付使用了。
     (三) 白盒測(cè)試的測(cè)試用例設(shè)計(jì)
     白盒測(cè)試是根據(jù)程序的內(nèi)部邏輯來設(shè)計(jì)測(cè)試用例,常用的技術(shù)是邏輯覆蓋,即考察用測(cè)試數(shù)據(jù)運(yùn)行被測(cè)程序時(shí)對(duì)程序邏輯的覆蓋程度。主要的覆蓋標(biāo)準(zhǔn)有6種:語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋、路徑覆蓋。為了提高測(cè)試的效率,應(yīng)選擇最少的測(cè)試用例來滿足指定的覆蓋標(biāo)準(zhǔn)。
     1.語句覆蓋
     語句覆蓋是指選擇足夠的測(cè)試用例,使得運(yùn)行這些測(cè)試用例時(shí),被測(cè)程序的每個(gè)語句至少執(zhí)行一次。
     2.判定覆蓋
     判定覆蓋又稱為分支覆蓋。它是指選擇足夠的測(cè)試用例,使得運(yùn)行這些測(cè)試用例時(shí),每個(gè)判定的所有可能結(jié)果至少出現(xiàn)一次(即判定的每個(gè)分支至少經(jīng)過一次)。
     3.條件覆蓋
     在軟件設(shè)計(jì)過程中,一個(gè)判定往往由多個(gè)條件組成,判定覆蓋僅考慮了判定的結(jié)果而沒有考慮每個(gè)條件的可能結(jié)果。條件覆蓋是指選擇足夠的測(cè)試用例,使得運(yùn)行這些測(cè)試用例時(shí),判定中的每個(gè)條件的所有可能結(jié)果至少出現(xiàn)一次。
     4.判定/條件覆蓋
     判定/條件覆蓋是指選擇足夠的測(cè)試用例。使得運(yùn)行這些測(cè)試用例時(shí),判定中每個(gè)條件的所有可能結(jié)果至少出現(xiàn)一次,并且每個(gè)判定本身的所有可能結(jié)果至少出現(xiàn)一次。顯然,滿足判定/條件覆蓋標(biāo)準(zhǔn)的測(cè)試用例一定也滿足判定覆蓋、條件覆蓋和語句覆蓋標(biāo)準(zhǔn)。在某些程序的測(cè)試中,如果選擇得好,判定覆蓋、條件覆蓋和判定/條件覆蓋可以使用相同的最少的測(cè)試用例。
     5.條件組合覆蓋
     在條件覆蓋中考慮了判定中每個(gè)條件的所有可能結(jié)果,但并未考慮條件的組合情況。條件組合覆蓋是指選擇足夠的測(cè)試用例,使得運(yùn)行這些測(cè)試用例時(shí),每個(gè)判定中條件結(jié)果的所有可能組合至少出現(xiàn)一次。由于條件組合覆蓋使每個(gè)判定中條件結(jié)果的所有可能組合都至少出現(xiàn)一次,因此判定本身的所有可能結(jié)果也一定至少出現(xiàn)一次,同時(shí)也使每個(gè)條件的所有可能結(jié)果至少出現(xiàn)一次。因此,條件組合覆蓋是上述5種覆蓋標(biāo)準(zhǔn)中的一種。然而,條件組合覆蓋還不能保證程序中所有可能的路徑都被覆蓋。
     6.路徑覆蓋
     路徑覆蓋是指選擇足夠的測(cè)試用例,使得運(yùn)行這些測(cè)試用例時(shí),程序的每條可能執(zhí)行到的路徑都至少經(jīng)過一次(如果程序中有環(huán)路,則要求每條環(huán)路至少經(jīng)過一次)。路徑覆蓋實(shí)際上是考慮了程序中各種判定結(jié)果的所有可能組合,但它并未考慮判定中的條件結(jié)果的組合,因此它是一種比較強(qiáng)的覆蓋標(biāo)準(zhǔn),但并不能代替條件覆蓋和條件組合覆蓋。