基于案例的軟件構造教程(第2版) 課件 02模塊化軟件構造_第1頁
基于案例的軟件構造教程(第2版) 課件 02模塊化軟件構造_第2頁
基于案例的軟件構造教程(第2版) 課件 02模塊化軟件構造_第3頁
基于案例的軟件構造教程(第2版) 課件 02模塊化軟件構造_第4頁
基于案例的軟件構造教程(第2版) 課件 02模塊化軟件構造_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第2章

模塊化軟件構造第2章模塊化軟件構造討論函數級的軟件構造技術。學習如何運用模塊化技術進行分解和細化,設計由函數組成的、具有一定結構的程序來分離不同的專注點,管理和控制程序的復雜性,使其便于維護、更新和擴展。如何針對實際問題設計和選擇數據結構;初步學習如何編程實現軟件測試、如何調試程序;理解好程序不僅僅是正確的,還有易維護、健壯等其他性質,學習良好的編程風格。2016秋數據科學與軟件工程學院2第2章模塊化軟件構造故事一50道100以內的加減法口算習題。循環(huán)50次,每次產生一個運算題:隨機地產生兩個100以內的整數,隨機地從兩個運算符“加法”和“減法”中挑選一個,就可以生成一道口算題;然后打印輸出一套練習題。2016秋數據科學與軟件工程學院3第2章模塊化軟件構造2016秋數據科學與軟件工程學院4第2章模塊化軟件構造程序沒有明確清晰的“算式”、“習題”的含義,沒有使用相應的變量、數據結構等程序設計的方式表達。若干獨立的功能集中在一個函數中不利于發(fā)現和修改程序中的錯誤,也不便擴充程序的功能。程序修改后,每次都要重新設計一些檢驗的數據,運行程序、觀察結果,判斷修改過的程序是否正確。我們希望能保留下檢測數據、運行結果及其判斷,無須改變地反復使用。編程缺乏規(guī)范。2016秋數據科學與軟件工程學院5第2章模塊化軟件構造2.1分解與模塊化2.2數據結構與算法2.3模塊化設計理論初步2.4測試程序2.5調試程序2.6案例分析與實踐2.7討論與提高2.8思考與練習題2016秋數據科學與軟件工程學院62.1分解與模塊化2.1.1分解的含義2.1.2模塊化與結構化2016秋數據科學與軟件工程學院72.1.1分解的含義分而治之的策略:①把問題分成兩個或多個更小的問題;②分別解決每個小問題;③然后把各個小問題的解答聚合起來,即可得到原問題的解答。例如,軟件開發(fā)分解為若干方面,包括軟件過程、項目管理、軟件開發(fā)技術等。軟件開發(fā)活動細化為需求分析、系統(tǒng)設計、軟件構造、軟件交付等活動。又如,對于一個要編程解決的問題,可以把程序分解為若干函數或若干類。2016秋數據科學與軟件工程學院82.1.1分解的含義分解的核心是將多個問題、難點或關注點分離。關注點分離是對只與“特定概念、目標”(關注點)相關聯(lián)的軟件組成部分進行“標識、封裝和操縱”的能力,即標識、封裝和操縱關注點的能力,是處理復雜性的一個原則。關注點分離是面向方面的程序設計的核心概念。2016秋數據科學與軟件工程學院92.1.1分解的含義案例代碼2.1的程序可以分解4個部分。(1)增加一個程序頭打印函數voidprintHeader(),簡單說明本程序的作用和使用。(2)函數voidgenerateEquations(),產生加法或減法算式的符號串并存入一個數組。(3)輸出習題的函數voidprintExercise(),它接收generateEquations的輸出,按照要求打印輸出所有的算式。(4)輸出習題中每個算式的計算結果voidprintCalculations()。2016秋數據科學與軟件工程學院102.1.1分解的含義2016秋數據科學與軟件工程學院112.1.2模塊化與結構化模塊化是把問題分解成容易理解、便于控制、便于實現的子問題的一個重要手段,是實現控制復雜性的方式。模塊化通過把一個程序分解成簡單獨立、互相作用的模塊,對不同的模塊設定不同的功能,來實現大型、復雜的程序。模塊是可組合、可更換的程序單元。良好設計的模塊只完成一個特定的或一組相關的子功能。所有模塊按某種方法組裝起來,成為一個整體,完成整個系統(tǒng)所要求的功能。2016秋數據科學與軟件工程學院122.1.2模塊化與結構化軟件模塊是指具有相對獨立性的、由數據說明、執(zhí)行語句等程序對象構成的代碼集合。每個模塊都需要單獨命名,如:函數、子程序、過程、方法等。通過名字訪問指定模塊。一個模塊具有輸入/輸出(接口)、功能、內部數據和程序代碼4個組成部分。模塊具有三大特征:獨立性、互換性和通用性。2016秋數據科學與軟件工程學院132.1.2模塊化與結構化模塊化設計,簡單地說,就是將產品的某些要素組合在一起,構成一個具有特定功能的、相對獨立的子系統(tǒng),將這個子系統(tǒng)作為通用模塊與其他產品要素進行多種組合,產生多種不同功能或相同功能、不同性能的系列產品。函數(或方法、過程)是實現軟件模塊化的一個基本手段。2016秋數據科學與軟件工程學院142.1.2模塊化與結構化在模塊設計中,最基本的是算法和數據結構的設計。代碼2.1中只有一個數據結構——算式表示成基本類型符號串,代碼2.2增加了一個存儲算式的數組作為習題。2016秋數據科學與軟件工程學院152.1.2模塊化與結構化如何定義兩個算式相等?如果把算式表示成符號串,計算機語言判定符號串“□2+3=”、“2□+3=”、“2+□3=”和“2+3□=”(其中□表示一個空格)互不相等,“2+3”和“2+3=”不相等。但它們是相同的算式。預處理算式——消除算式符號串中的所有空格。但預處理會占用計算資源。2016秋數據科學與軟件工程學院162.1.2模塊化與結構化圖靈獎獲得者Wirth提出的“結構化程序設計”(StructuredProgramming)的方法,可以簡化為“算法+數據結構=程序”。這種結構化程序設計方法又稱為“自頂向下”或“逐步求精”法。增量迭代方法汲取了這些方法的精華,但有著不同的特點:“增量”是少量可執(zhí)行程序的功能及每次具體實現增量的過程,而不是從抽象到代碼,可視為“需求分析、概念設計、編碼實現”的微構造過程。2016秋數據科學與軟件工程學院172.2數據結構與算法2.2.1數據結構與算法的關系2.2.2選擇與設計數據結構2.2.3選擇與設計算法2016秋數據科學與軟件工程學院182.2.1數據結構與算法的關系數據結構是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關系的數據元素的集合。為數據集提供獨立于計算機內存的數據組織,并提供被視為一種抽象的工具來訪問。常見的數據結構,如數組、集合、棧、隊列、堆、樹、圖、散列表等。2016秋數據科學與軟件工程學院192.2.1數據結構與算法的關系算法以一步一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程。描述算法的方式可以采用自然語言、程序設計語言,也可以兩種語言混合使用。用計算機程序語言實現并在計算機上運行的算法就是程序,它是一個解決實際問題方法的程序語言的指令序列?;镜乃惴ǎ愋停┌ú檎摇⑴判颉⒍鏄涞谋闅v、圖的遍歷、最短路徑算法。2016秋數據科學與軟件工程學院202.2.1數據結構與算法的關系計算機算法與數據結構密切相關,算法依賴于具體的數據結構,數據結構直接關系到算法的選擇和效率。(1)一種數據結構、一種算法:通常是針對一種特殊的數據結構設計的特殊算法。如,計算樹的高度、樹節(jié)點的層級。(2)一種數據結構、多種算法:如,數組,支持的算法如排序、查找、圖類、矩陣類等等。(3)多種數據結構、一種算法:如,折半查找使用數組和二叉樹,也可以使用鏈表。(4)多種數據結構、多種算法:如,數組和二叉樹,基本的算法有遍歷類、查找類、求最大值等。2016秋數據科學與軟件工程學院212.2.1數據結構與算法的關系在程序設計和軟件開發(fā)的實踐和理論中,存在過以數據為中心和以操作為中心的開發(fā)方法。更多時候,軟件開發(fā)者在數據與算法之間尋找均衡的設計方法,同時兼顧數據結構與算法。面向對象的程序設計語言和面向對象開發(fā)方法就是綜合了數據與操作,將其封裝成一個軟件實體——對象,完成用戶需求分析、軟件建模與軟件構造。2016秋數據科學與軟件工程學院222.2.2選擇與設計數據結構算式與習題的基本數據結構設計1:把算式理解成具有一定組成元素的結構——兩個運算數、一個加或減法的運算符,以及結果。程序設計風格操作數的命名獨立變量和非獨立變量2016秋數據科學與軟件工程學院232.2.2選擇與設計數據結構一個結構類型是否包含非獨立變量,應該考慮下列因素。①獲取非獨立變量值的難易程度。②使用非獨立變量的頻繁程度。2016秋數據科學與軟件工程學院242.2.2選擇與設計數據結構對于包含算式的習題,自然地選擇數組。數組是有限個同類型元素的有序集合。絕大多數高級程序設計語言都有內置數組。習題Exercise可以定義成以結構體的算式為元素的數組:2016秋數據科學與軟件工程學院252.2.2選擇與設計數據結構設計2:使用一個包含三個成員的數組[operand,operand2,operator]表示算式Equation。語言要求數組成員屬于同一類型,故將算式中的運算符operator定義成整數類型??梢杂貌煌臄抵祵煌倪\算符,如0表示“加”,1表示“減”。習題Exercise仍然使用數組,可視為一個[50,3]的二維數組。2016秋數據科學與軟件工程學院262.2.2選擇與設計數據結構比較首先,數據結構的設計是否滿足實際問題的需要?是否直接反映了問題本身?第二,數據結構的設計是否容易編程實現?第三,對解決問題的操作是否給予支持?即是否方便算法的設計與實現。第四,設計的質量如何?包括可讀性、易修改性、可擴展性、易維護性等。2016秋數據科學與軟件工程學院272.2.2選擇與設計數據結構2016秋數據科學與軟件工程學院282.2.2選擇與設計數據結構符號串直接顯示了人易讀的形式;節(jié)省存儲空間。符號沒有語義(數據類型),需要解析;結構體表示出算式組成的數據類型;節(jié)省存儲空間。要用轉換函數才能顯示并輸出一個算式。數組任意表示復雜的算式;容易擴展到兩個、甚至數十個運算符;節(jié)省存儲空間。算式成分與數組的位置需要映射;要用轉換函數才能顯示并輸出一個算式。2016秋數據科學與軟件工程學院292.2.2選擇與設計數據結構小結:(1)算式的三種數據結構都能滿足需求。(2)如程序要求擴展或改善,則會要求代碼易讀、結構穩(wěn)定,才容易理解、修改和擴充。如,檢查算式是否重復,或在習題中查找算式,設計1和2比代碼2.1有明顯優(yōu)勢。再如,增加乘、除法運算,三種數據結構都不變,代碼2.1的算式輸出不變,但要增加解析操作,從符號串分解出乘和除;設計1和2需要增加乘、除法運算符的顯示方式,而設計2要增加兩個映射(比如3對應乘法)。結論:總體考慮,把算式成分明確表示出來的結構體是目前算式的最佳數據結構。2016秋數據科學與軟件工程學院302.2.2選擇與設計數據結構算法分析與其他數據結構案例隱含要求:不允許出現重復的算式。對于數組,要實現算式比較算法。產生50個算式的習題總共需要的比較次數是:0+1+2+…+49=(0+49)×50/2=1225。產生有正整數n個不同算式的習題,算法的復雜性是O(n2)?!凹稀?。語言實現了集合的基本操作,包括插入、判定一個元素是否在集合中。而且,集合中元素數量可以動態(tài)變化。如此構造一個習題的算法就是線性的。2016秋數據科學與軟件工程學院312.2.3選擇與設計算法1.習題與算式的分離算式與習題是兩個完全不同的數據。算式是具有滿足一定約束條件的組成元素和結構的數據,不是簡單的符號串。習題包含了數目確定的不同的算式,它像一個容器把算式存儲起來。它們的產生方式不同,操作和使用也不相同。2016秋數據科學與軟件工程學院322.2.3選擇與設計算法1.習題與算式的分離把習題和算式明確地從代碼中抽出,并分別用合適的數據結構表示,有助于各自的設計與實現,也能實現不同的算式和習題的任意組合。假設算式有三種數據結構:結構體、一維數組和字符串;習題有4種選擇:一維數組、集合、隊列及不需數據結構(如代碼2.1),則案例程序可以有12種數據結構的組合方式。2016秋數據科學與軟件工程學院332.2.3選擇與設計算法1.習題與算式的分離而且,不僅一個程序的數據結構具有不同的組合方式。如果把數據結構連同對它們的操作也都封裝到一個模塊——最簡單的就是函數,那么,包含了數據與操作的這些函數可以作為程序的模塊使用??梢蕴岣叱绦虻慕Y構性和可維護性,如可以替換相同功能、不同實現的模塊,而不影響程序的功能。2016秋數據科學與軟件工程學院342.2.3選擇與設計算法2.算式產生與其約束條件的分離考慮到程序的可擴展性、可修改性,例如,允許不止一個加法或減法運算,或者將算式數值范圍擴大到500、1000等。分別定義運算數生成函數與約束條件檢測函數,對滿足一定條件的運算數才生成算式?!皾M足100以內整數”的條件不僅適合兩個運算數,也適用于其結果。2016秋數據科學與軟件工程學院352.2.3選擇與設計算法3.加減法算式的分離為了能夠產生全加、全減和混合三種類型的習題,應當分別編寫加法算式和減法算式函數,然后隨機地選擇這兩種算式,就能生成混合運算的習題。2016秋數據科學與軟件工程學院362.2.3選擇與設計算法2016秋數據科學與軟件工程學院372.3模塊化設計理論初步2.3.1模塊化原則2.3.2模塊的內聚性2.3.3模塊間的耦合性2016秋數據科學與軟件工程學院382.3.1模塊化原則Meyer提出了5條標準來評價一種設計方法是否定義了有效的模塊系統(tǒng)的能力。(1)模塊可分解性。(2)模塊可組裝性。(3)模塊可理解性。(4)模塊連續(xù)性。(5)模塊保護性。2016秋數據科學與軟件工程學院392.3.1模塊化原則模塊的獨立程度可以由兩個定性標準來度量——內聚和耦合。內聚衡量一個模塊內部各個元素之間相互結合的緊密程度;耦合衡量不同模塊彼此間互相依賴(連接)的緊密程度。2016秋數據科學與軟件工程學院402.3.2模塊的內聚性內聚性是對一個模塊內部各個組成元素之間相互結合的緊密程度的度量指標。模塊中組成元素結合得越緊密,模塊的內聚性就越高,模塊的獨立性也就越高。理想的內聚性要求模塊的功能應明確、單一,即一個模塊只做一件事情。2016秋數據科學與軟件工程學院412.3.2模塊的內聚性內聚有如下7種,由弱到強排列如下。(1)偶然內聚(2)邏輯內聚(3)時間內聚(4)過程內聚(5)通信內聚(6)順序內聚(7)功能內聚2016秋數據科學與軟件工程學院422.3.3模塊間的耦合性耦合性是一個模塊與系統(tǒng)內其他模塊及與外部世界的關聯(lián)程度的度量。耦合的強弱取決于模塊間接口的復雜性、調用模塊的方式及通過界面?zhèn)魉蛿祿亩嗌?。在軟件開發(fā)中,應該追求盡可能松散耦合的系統(tǒng)。2016秋數據科學與軟件工程學院432.3.3模塊間的耦合性耦合度從低到高可分為7級。非直接耦合數據耦合標記耦合控制耦合外部耦合公共耦合內容耦合2016秋數據科學與軟件工程學院442.3.3模塊間的耦合性耦合是影響軟件復雜程度的一個重要因素。一般而言,應該采取下述設計原則:應盡量使用數據耦合,減少控制耦合,限制外部環(huán)境耦合和公共耦合,杜絕內容耦合,降低接口的復雜度。2016秋數據科學與軟件工程學院452.3.3模塊間的耦合性模塊的內聚性和耦合性是兩個相互對立且又密切相關的概念。軟件概要設計的目標是力求增加模塊的內聚,盡量減少模塊間的耦合。在程序結構中,各模塊的內聚程度越高,模塊間的耦合程度就越低。雖然這種關聯(lián)不是絕對的,但是,增加內聚比減少耦合更重要,軟件開發(fā)者應當把更多的注意力集中到提高模塊的內聚程度。2016秋數據科學與軟件工程學院462.4測試程序IEEE軟件工程標準術語:軟件測試使用人工或自動手段來運行或測定某個系統(tǒng)的過程,目的在于檢測它是否滿足規(guī)定的需求或者是否弄清預期結果與實際結果之間的差別。測試是對程序或系統(tǒng)能否完成特定任務建立信心的過程。軟件測試是說明程序是否正確的最基本的一種技術手段。2016秋數據科學與軟件工程學院472.4測試程序執(zhí)行程序測試時,要考慮下列因素。首先,如何判定程序的運行結果是否滿足了需求?上面列出的需求是否可以判定對錯?其次,如何執(zhí)行程序測試?是否需要記錄?如何記錄?軟件測試應該盡量詳細、完整地記錄下來。測試執(zhí)行與記錄可以手工完成,也可以借助軟件工具或框架完成,還可以通過編寫測試代碼完成。第三,需要運行程序多少次才能說明程序正確了?或者說,選擇什么樣的輸入數據、涵蓋了哪些程序范圍就可以說明了程序的正確性?2016秋數據科學與軟件工程學院482.4測試程序2.4.1測試需求2.4.2測試設計與測試用例2016秋數據科學與軟件工程學院492.4.1測試需求由于對用戶需求理解的偏差,要執(zhí)行軟件測試,實現測試目的,首要任務是要仔細地分析用戶需求和設計,梳理含糊不清、模棱兩可、相互矛盾的需求,明確、細化和羅列出需求,并且將每個需求表示成可以檢測的測試需求。例如,要求運算數的數值范圍是0~100。[0,100]、(0,100)、(0,100]、[0,100)。2016秋數據科學與軟件工程學院502.4.1測試需求有時用戶難以精確地表示需求,需要在使用之后“感覺”到沒有問題了。這就要求程序員具有一定的經驗,與用戶溝通交流、對問題深入理解、良好的軟件設計等能力及對編程語言的掌握程度等,才能開發(fā)出滿足用戶要求的軟件。針對軟件開發(fā)中用戶需求的不確定性、經常變化等問題,出現了用戶聯(lián)合開發(fā)方法(JointApplicationDevelopment,JAD)。特別地,敏捷開發(fā)方法要求客戶參與軟件開發(fā)。2016秋數據科學與軟件工程學院512.4.1測試需求其次,測試需求要求程序的預期結果和實際運行結果都要明確、合理、可觀察并可比較。案例要求50道算式的需求非常明確。2016秋數據科學與軟件工程學院522.4.1測試需求為了測試程序是否包含某個算式,一定要運行整個程序嗎?如同采用分解和模塊化技術,分而治之地解決一個較大問題的軟件開發(fā),分解也同樣適用于軟件測試。為了方便、快速地檢測一個用戶需求或者特定功能是否得到滿足,可以針對性地設計測試,或者測試程序的一部分。一種策略是分析用戶需求,把它細化成一個個具體的、獨立的、功能單一的測試需求。2016秋數據科學與軟件工程學院532.4.1測試需求將代碼2.1的測試需求分解如下:(1)程序是否能正確地產生滿足條件的加法算式?(確定的程序)(2)程序是否能正確地產生滿足條件的減法算式?(確定的程序)(3)程序是否能正確地產生滿足條件的加法或減法算式?(隨機性)(4)進一步,還可以繼續(xù)分解成如下的測試需求:程序是否產生了[0..100]范圍的值,或者[1,100]范圍的值,或者(0,100)范圍的值?2016秋數據科學與軟件工程學院542.4.2測試設計與測試用例測試設計不同于測試用例設計。測試設計的內容包含設計測試用例,此外還包括決定是否實施所有層次的測試、是否采用測試工具或自動化測試框架、哪些測試采用哪些工具、如何組織人員進行測試等。IEEE,測試用例是一組輸入、運行條件和通過/失敗準則。簡單地說,測試用例是一組測試數據和預期結果。2016秋數據科學與軟件工程學院552.4.2測試設計與測試用例程序的運行結果分為三類:產生的值。如局部觀察的輸出(數值、文字、圖片、聲音等)或者操作、存儲的輸出。狀態(tài)變化。如程序的狀態(tài)變化、數據庫的狀態(tài)變化。必須一起解釋為輸出才有效的一個序列或一組值。測試用例設計的核心就是設計測試輸入,即測試數據。2016秋數據科學與軟件工程學院562.4.2測試設計與測試用例【例2.1】一個生成整數減法的程序,輸入是兩個整數,要求輸出它們的差,結果不能為負數。2016秋數據科學與軟件工程學院572.4.2測試設計與測試用例對每個測試用例,將程序運行結果與預期結果比較。若相等,表示待測程序“通過”了測試數據;若不相等,表示待測程序未通過測試數據,即測試“失敗”??赡艹霈F其他情況,沒有執(zhí)行所有的測試用例,比如因某個測試數據導致待測程序沒能運行完而退出,或者程序異常退出,或者用戶中斷程序運行等。2016秋數據科學與軟件工程學院582.4.2測試設計與測試用例測試結果的判定可能會存在誤判和漏判。由于測試數據或預期結果的錯誤而導致顯示待測程序可能有誤,稱為測試誤判。如果待測程序有錯,而測試沒有發(fā)現錯誤,稱為測試漏判。如何減少漏判,即如何通過測試發(fā)現程序中存在錯誤,實際上就是如何設計測試和測試數據,使得待測程序不能通過一些測試用例。理論上,測試不能證明程序沒有錯誤,而是通過測試發(fā)現錯誤,提高程序正確性。2016秋數據科學與軟件工程學院592.4.2測試設計與測試用例待測程序使用測試用例的三種方式①每次從鍵盤輸入一個測試數據,觀察測試結果并和預期值比較,記錄測試通過與否;②通過編寫測試程序,先存儲測試用例,然后讓待測程序逐個讀取測試數據、運行、比較預期結果,同時記錄測試結果;③使用測試工具完成測試程序的操作及其他更多操作。2016秋數據科學與軟件工程學院602.5調試程序當程序不能編譯運行,或者測試發(fā)現了錯誤,程序員要理解程序的行為,發(fā)現可能的錯誤并去除它,這個過程稱為調試。調試是軟件開發(fā)的重要活動,是程序員必須熟練掌握的軟件開發(fā)技術。2.5.1缺陷的相關術語2.5.2調試基礎2016秋數據科學與軟件工程學院612.5.1缺陷的相關術語軟件Bug即缺陷(Defect),是軟件產品中所存在的問題,最終表現為用戶需求沒有完全實現。從產品內部看,軟件缺陷是軟件產品開發(fā)或維護過程中所存在的錯誤、毛病等各種問題。從外部看,軟件缺陷是系統(tǒng)所需要實現的某種功能的失效或違背。2016秋數據科學與軟件工程學院622.5.1缺陷的相關術語缺陷源自人的過失(Mistake)活動產生的不正確結果。過失活動包括誤解、遺漏用戶需求、設計不合理等。引起故障的原因是程序中不正確的步驟、過程或數據定義,是過失發(fā)展的結果,它們可能導致軟件失效(Failure)。2016秋數據科學與軟件工程學院632.5.1缺陷的相關術語所謂錯誤(Error)就是導致不正確結果的全部。它展示了某個故障的不正確的內部狀態(tài)??梢岳斫釨ug是程序中引起錯誤的具體位置,因此,debug就是找出并更改程序中的錯誤。2016秋數據科學與軟件工程學院642.5.2調試基礎1.科學的調試過程調試是根據程序的出錯情況,分析、猜測可能出現錯誤的程序區(qū)域,讓程序運行,觀察程序的變化來發(fā)現錯誤的根源。調試的基本活動包括隔離、定位和更正錯誤。2016秋數據科學與軟件工程學院652.5.2調試基礎2.定位程序缺陷最簡單的調試技術是在要觀察的語句前后添加各種類型的打印語句。如簡單打印“執(zhí)行到此”——調試時可以看到程序是否執(zhí)行了某條語句或執(zhí)行到某語句;或者打印一個或一組變量的值,觀察變量值的變化。2016秋數據科學與軟件工程學院662.5.2調試基礎3.更改缺陷調試中確定錯誤位置是最困難的任務,修改程序相對容易。然而,容易的事情有時也容易出錯。一項研究發(fā)現,第一次更正缺陷具有50%的可能性出錯。2016秋數據科學與軟件工程學院672.6案例分析與實踐2.6.1案例程序的初始構造2.6.2無相同算式的基礎構造2.6.3編程實現測試2016秋數據科學與軟件工程學院682.6.1案例程序的初始構造對故事1程序的構造程序1:生成50道100以內加法/減法算式的習題,并輸出。分析首先,如何產生100以內的隨機數?隨機數生成函數,隨機產生一定范圍的值。其次,如何表示一個算式?采用什么樣的數據結構?字符串、結構體、數組。2016秋數據科學與軟件工程學院692.6.1案例程序的初始構造構造模塊化技術設計程序,分別產生加法習題和減法習題。程序起名為口算練習產生器。減generateExerciseOfSubstactEquations2016秋數據科學與軟件工程學院702.6.1案例程序的初始構造2016秋數據科學與軟件工程學院712.6.1案例程序的初始構造故事2100以上的數和負數。(1)每個算式還需要答案;(新增)(2)加法算式的和不能超過100;(隱含)(3)減法算式的差不能小于0;(隱含)(4)每行整齊地多顯示幾個算式。(更改)2016秋數據科學與軟件工程學院722.6.1案例程序的初始構造分析首先,如何處理每個算式的答案?其次,除了每個運算數有100以內的約束條件外,還要約束它們的運算結果(n+m<100和n?m>0或n>m)。最后,由于是50個題目,每行顯示5個算式,正好10行顯示完。2016秋數據科學與軟件工程學院732.6.1案例程序的初始構造構造2016秋數據科學與軟件工程學院742.6.2無相同算式的基礎構造構造任務2:生成50道100以內加減法算式的混合習題,題中不能有相同的算式。故事3有些題的答案一樣、眼熟。加法和減法都有的題目。分析如何讓神器生成沒有重復算式的習題。練習中要有加法和減法的算式。2016秋數據科學與軟件工程學院752.6.2無相同算式的基礎構造構造函數表示分解出的、相對獨立的代碼,如增加了算式生產的模塊,循環(huán)調用來構造習題。采用了較好的編程風格,如使用名稱常量。程序結構詳見課本。2016秋數據科學與軟件工程學院762.6.3編程實現測試現代軟件開發(fā)的一個最佳實踐是,程序員自己編寫測試程序,記錄下測試數據、測試過程及結果分析。編寫測試程序具有以下顯著優(yōu)點。(1)測試有助于編寫正確的程序。(2)測試有助于提高程序質量。(3)測試是程序的重要文檔。(4)測試提高了復用。2016秋數據科學與軟件工程學院772.6.3編程實現測試如何編寫測試程序?它的基本結構如何?1.可選的編程測試任務簡單的不測,如算式的字符串顯示asString;用戶認可就行,很難說對錯,不測,如整齊的輸出格式;整個程序的核心函數,對程序能否使用起到關鍵作用,必須測試,例如,算式的產生、是否滿足條件、答案是否正確、能否查出重復的算式。2016秋數據科學與軟件工程學院782.6.3編程實現測試測試程序的基本組成如下。①建立測試環(huán)境,包括初始化測試用例、初始化統(tǒng)計變量;②執(zhí)行測試,即把每個測試數據作為參數傳入待測程序、運行,比較實際運行結果與預期結果,給出測試通過與否的判定,計算“通過”、“失敗”及“未運行”等其他的測試數;③處理測試結果:主要是統(tǒng)計、分析測試結果,并將其顯示、存儲。2016秋數據科學與軟件工程學院792.6.3編程實現測試2.測試代碼與待測代碼同源編寫測試代碼時也要遵循模塊化原則。首先將測試代碼與產品代碼分離,測試代碼調用產品代碼,但產品代碼獨立運行。其次,運用模塊化適當分解測試代碼,使每個模塊的功能單一、容易復用。如,可以將測試代碼劃分為:生成測試數據,讀取測試數據,執(zhí)行測試、判斷并記錄測試結果,統(tǒng)計和分析測試結果,存儲、顯示測試結果分析。2016秋數據科學與軟件工程學院802.6.3編程實現測試(1)選擇好的測試數據很重要。(2)一次測試,手工執(zhí)行測試較快,但容易忘記測試了什么、結果如何,也不能反復使用測試數據。(3)測試在程序大致可以運行后再進行。(4)程序的質量屬性——可測性;同時,一定要像編寫應用程序那樣編寫測試程序。(5)編寫測試代碼可能比要測試的代碼還要多!有工具輔助完成測試更好。2016秋數據科學與軟件工程學院812.7討論與提高編寫好程序的三個方面。①簡介質量的概念——什么是好程序;②測試基礎和設計——如何說明好程序;③編程風格——如何呈現好程序。2.7.1軟件質量2.7.2軟件測試的其他觀點2.7.3測試設計2.7.4編程風格2016秋數據科學與軟件工程學院822.7.1軟件質量為了編寫好程序,首先需要明確什么是好程序,即好程序的標準。不同的人對好程序有不同的認識。程序員習慣從程序本身判斷程序的好壞,認為好程序要容易看懂,容易修改,容易擴展。用戶認為好程序要正確,運行速度快,占用資源少,要有用,要容易使用。2016秋數據科學與軟件工程學院832.7.1軟件質量國際標準組織ISO,質量是反映產品或服務滿足明確和隱含的需求的能力特性總和。ISO為程序質量定義了6個質量特性。①功能性——程序是否滿足了用戶要求;②可靠性——程序保持規(guī)定的性能水平的能力;③可用性——程序有多容易使用;④效率——與程序運行時消耗的物理資源有關;⑤可維護性——是否容易修改程序;⑥可移植性——是否容易把程序移植到一個新的環(huán)境。2016秋數據科學與軟件工程學院842.7.1軟件質量ISO又對每個質量特性進一步細化為一組子質量特性。如,功能性包含:適合性:軟件產品為指定的任務和用戶目標提供一組合適功能的能力;準確性:軟件提供給用戶功能的精確度是否符合目標;互操作性:軟件與其他系統(tǒng)進行交互的能力;保密安全性:保護信息和數據的安全能力;功能性的依從性:遵循相關標準。2016秋數據科學與軟件工程學院852.7.1軟件質量有些子質量特性可能影響不止一個質量特性,比如,每個質量特性都含有依從性。如,可維護細化為5個子特性,它們是:易分析性:提供輔助手段幫助分析識別缺陷的原因,找出待修復部分的能力;易改變性:指定的修改容易實現的能力;穩(wěn)定性:避免由修改而造成意外結果的能力;易測試性:提供輔助性手段幫助測試人員實現其測試意圖,使已修改軟件能被確認的能力;維護性的依從性:遵循相關標準。2016秋數據科學與軟件工程學院862.7.1軟件質量軟件質量是明確聲明的功能和性能需求、明確文檔化過的開發(fā)標準,以及軟件所應具有的所有隱含特征都得到滿足。軟件需求是對軟件質量度量的基礎。與需求不符就是質量不高。指定的標準定義了一組指導軟件開發(fā)的準則。軟件通常有一組“隱含需求”是不被提及的(如對維護性的需求)。如果軟件符合了明確的需求卻沒有滿足隱含需求,軟件質量仍然值得懷疑。2016秋數據科學與軟件工程學院872.7.1軟件質量軟件質量是許多質量屬性的綜合體現,各種質量屬性反映了軟件質量的不同方面。從認識和評估的角度,軟件質量分為:外部質量屬性是用戶可見的,是在使用軟件產品過程中通過觀察該軟件產品的系統(tǒng)行為而得到的,主要包括正確性、健壯性、可靠性、性能、安全性、易用性、兼容性。內部質量屬性是在軟件設計和編碼過程中,通過對中間產品的分析得來的,包括易理解性、可測試性、可擴展性、可維護性、可移植性、可復用性等。2016秋數據科學與軟件工程學院882.7.1軟件質量內部質量屬性影響外部質量屬性;外部質量屬性依賴于內部質量屬性。軟件產品的最終目標是滿足用戶要求的、可見的外部質量。開發(fā)良好的軟件是確保軟件質量的唯一途徑,包括采用良好的軟件工程技術、過程和管理。2016秋數據科學與軟件工程學院892.7.2軟件測試的其他觀點針對軟件測試,存在截然不同的兩種典型觀點:軟件測試的正面觀與負面觀。正面觀,軟件測試是為了驗證程序能夠按預期運行。軟件測試是一系列活動,以評價一個程序或系統(tǒng)的特性或能力,并確定是否達到預期的結果。測試是為了驗證軟件是否符合用戶需求,即驗證軟件產品是否能正常工作。負面觀,測試是為了證明程序有錯。一個好的測試在于它能發(fā)現至今未發(fā)現的錯誤;一個成功的測試是發(fā)現了至今未發(fā)現的錯誤的測試。2016秋數據科學與軟件工程學院902.7.2軟件測試的其他觀點現代軟件開發(fā)理論與實踐認為軟件測試的目的和作用是多方面的:測試能驗證軟件產品是否正常;測試是發(fā)現軟件缺陷的手段;同時測試為軟件產品的質量測量和評價提供依據。2016秋數據科學與軟件工程學院912.7.2軟件測試的其他觀點對軟件測試的認識,還包括風險觀點和經濟觀點。從軟件風險的角度看,軟件測試被認為是對軟件系統(tǒng)中潛在的各種風險進行評估的活動?;陲L險的軟件測試可以被視為一個動態(tài)的監(jiān)控過程,對軟件開發(fā)全過程進行檢測,隨時發(fā)現問題、報告問題。從經濟觀點出發(fā),測試就是以最小的代價獲得最高的軟件產品質量。經濟觀點也要求軟件測試盡早開展工作,發(fā)現缺陷越早,返工的工作量就越小,所造成的損失就越小。2016秋數據科學與軟件工程學院922.7.3測試設計1.測試覆蓋測試是選擇性地運行程序,不可能通過徹底的測試說明程序正確。給定一個軟件或模塊,測試多少次或者測試到什么程度,能夠說明程序完全正確、滿足了需求?即使是一個簡單程序,要窮舉測試程序的所有可能性,也幾乎是不可能的事情。2016秋數據科學與軟件工程學院932.7.3測試設計【例2.2】一個整型加法函數。考慮到測試所耗費的時間、人員、環(huán)境和資金等因素,也不可能徹底地測試程序。遵循軟件測試的經濟性原則,即用盡量少的測試、最小的消耗能最大程度地保證程序的正確性,使程序滿足需求。2016秋數據科學與軟件工程學院942.7.3測試設計測試覆蓋指測試所包含的軟件的特征、元素、成分等方面的程度或范圍。由于軟件的多樣性,覆蓋域是多方面的,包括:用戶需求、函數、類、數據流、數據結構、程序結構、程序執(zhí)行路徑等。軟件測試包含下列覆蓋:功能覆蓋、輸入域覆蓋、輸出域覆蓋、函數交互覆蓋、代碼執(zhí)行覆蓋和代碼結構性覆蓋。滿足性條件可以測試覆蓋率量化。2016秋數據科學與軟件工程學院952.7.3測試設計有關測試覆蓋有如下使用原則。(1)多覆蓋域原則:滿足一個測試覆蓋不能為軟件的正確程度提供充足的保證。要采用不同的軟件測試技術和方法,以滿足多個覆蓋域條件。(2)測試覆蓋原則:度量測試覆蓋率并針對不斷增強的覆蓋率來改進測試數據,就能改進待測軟件。不同的測試數據具有不同的覆蓋能力。因此,設計和選擇測試數據成為實現測試目標的一個重要并且基本的技術。2016秋數據科學與軟件工程學院962.7.3測試設計2.基于等價類劃分的測試【例2.3】對例2.2增加約束,要求兩個輸入參數值的范圍0~100。2016秋數據科學與軟件工程學院972.7.3測試設計三個測試數據<3,16>,<5,13>,<2,11>,它們的加數都是10以內的數、被加數都是10~20的數,其結果不超過30。這樣的一組數據稱為等價類集合。另外一個等價類:加數和被加數都是10~20的數(<13,16>、<18,19>)。2016秋數據科學與軟件工程學院982.7.3測試設計基于等價類劃分測試的基本思想是:將程序可能的輸入數據依據某個準則分成若干等價子集,其和覆蓋了整個程序的輸入域,然后從每個子集中選取一個代表性的數據作為測試數據,這樣既可以大大降低測試數量,同時又能在一定程度上保證通過了測試的程序的正確性。2016秋數據科學與軟件工程學院992.7.3測試設計按照加數和被加數都從0到100,以10為間隔,運算數分為10個等價子集。2016秋數據科學與軟件工程學院1002.7.3測試設計對例2.3的程序,如果隱含要求了兩個數的和也在100以內,則凡是兩個數相加的和超過100,這樣的測試數據就是無效的。表2.3中序號6~10測試數據都是無效的。表2.4中序號3、5、8的測試數據也是無效的。2016秋數據科學與軟件工程學院1012.7.3測試設計等價類劃分有兩種情況:有效等價類和無效等價類。有效等價類指對于程序的要求來說是合理的、有意義的輸入數據構成的集合。有效等價類用于檢驗程序是否實現了所要求的功能和性能。不滿足有效等價的數據集合就是無效等價類。設計測試用例時,要同時考慮這兩種等價類。因為程序不僅要能接收合理的數據,也要具備處理非法、無效數據的能力,確保程序的穩(wěn)定性、可靠性和安全性。2016秋數據科學與軟件工程學院1022.7.3測試設計對于同一個程序,存在不同的等價類劃分方法。如果想增加測試數量、試圖發(fā)現更多的錯誤或者提高程序的可信度,可以細分等價類。對于例2.3,可以把間隔減小,改為5,增加測試數量。也可以把間隔改為20,減少測試數。2016秋數據科學與軟件工程學院1032.7.3測試設計根據輸出域劃分等價類。例2.3的輸出值的范圍是0~100,同樣以10為單位建立10個等價類,每個類選取一個數作為函數的輸出代表,為此選擇兩個有效數作為測試數。2016秋數據科學與軟件工程學院1042.7.3測試設計劃分等價類的基本原則如下。按區(qū)間劃分。按數值集合劃分。按限制條件劃分。按限制規(guī)則劃分

溫馨提示

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

評論

0/150

提交評論