基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第1頁(yè)
基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第2頁(yè)
基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第3頁(yè)
基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第4頁(yè)
基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第5頁(yè)
已閱讀5頁(yè),還剩109頁(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)介

第4章

數(shù)據(jù)處理的軟件構(gòu)造第4章數(shù)據(jù)處理的軟件構(gòu)造本章討論案例中數(shù)據(jù)處理的問(wèn)題:按需選擇、使用數(shù)據(jù)及數(shù)據(jù)持久性。重點(diǎn)是如何把算式和習(xí)題從程序變量的值轉(zhuǎn)化為可共享的、持久性的文件數(shù)據(jù),學(xué)習(xí)文件的產(chǎn)生、存儲(chǔ)和讀取操作,學(xué)習(xí)一個(gè)特殊的文本文件格式CSV。編程方面,學(xué)習(xí)表驅(qū)動(dòng)編程模式和防御性編程。測(cè)試方面,學(xué)習(xí)白盒測(cè)試的基本技術(shù),繼續(xù)學(xué)習(xí)JUnit的其他測(cè)試方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院2第4章數(shù)據(jù)處理的軟件構(gòu)造故事5軟件是一個(gè)包含程序、數(shù)據(jù)和用戶的計(jì)算機(jī)系統(tǒng)。一個(gè)軟件可以提供若干功能或模塊,不同用戶可以使用其中的模塊——若干函數(shù)、類或方法。一個(gè)用戶可以利用其他用戶使用軟件產(chǎn)生的結(jié)果(如算式、習(xí)題),繼續(xù)使用軟件完成其他任務(wù)(如批改練習(xí))。不同用戶應(yīng)該可以在不同的時(shí)間產(chǎn)生和使用結(jié)果(數(shù)據(jù))。其中的一個(gè)條件是能夠持久地存儲(chǔ)結(jié)果,其生命期要超過(guò)程序運(yùn)行的時(shí)間,即存儲(chǔ)一次程序運(yùn)行的結(jié)果,在程序退出、再次啟動(dòng)后,程序的其他模塊能獲取并使用存儲(chǔ)的結(jié)果。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院3第4章數(shù)據(jù)處理的軟件構(gòu)造實(shí)現(xiàn)數(shù)據(jù)持久性最基本的途徑是文件和數(shù)據(jù)庫(kù)。本章討論使用文件實(shí)現(xiàn)圖4.1。首先,討論案例有哪些量大的數(shù)據(jù)需要存儲(chǔ)。其次,簡(jiǎn)單解釋文件及Java輸入/輸出流。接著,引入實(shí)現(xiàn)持久性的編程問(wèn)題及技術(shù)方法。最后,給出案例的分析與實(shí)現(xiàn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院4第4章數(shù)據(jù)處理的軟件構(gòu)造4.1數(shù)據(jù)及其持久性4.2文件與輸入/輸出流4.3編寫(xiě)健壯的程序4.4字符串處理與正則表達(dá)式4.5程序中數(shù)據(jù)集的使用4.6基于程序結(jié)構(gòu)的測(cè)試4.7運(yùn)用Junit4.8案例分析與實(shí)踐4.9討論與提高4.10思考與練習(xí)題2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院54.1數(shù)據(jù)及其持久性保存在程序之外(如文件、網(wǎng)絡(luò))的數(shù)據(jù)稱為持久數(shù)據(jù)。文件處理是編程語(yǔ)言支持應(yīng)用程序存儲(chǔ)和處理大量持久數(shù)據(jù)的一個(gè)最重要能力。Java等編程語(yǔ)言通常都提供了文件處理和輸入/輸出流的功能。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院64.1數(shù)據(jù)及其持久性字符由比特組成。一組字符或字節(jié)組成字段。一個(gè)字段是傳遞含義的一組字符或字節(jié)。若干字段構(gòu)成記錄。記錄是一組有關(guān)系的字段。一個(gè)文件可以是一組相關(guān)的記錄。組織文件中的記錄有多種不同的方式。最常見(jiàn)的方式是順序文件。一組相關(guān)的文件可以組成數(shù)據(jù)庫(kù)。專門(mén)用于創(chuàng)建、處理和管理數(shù)據(jù)庫(kù)的一組程序稱為數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院74.1數(shù)據(jù)及其持久性一個(gè)應(yīng)用程序如何選擇數(shù)據(jù)的存儲(chǔ)、管理和處理方式,要考慮下面的因素。數(shù)據(jù)的持久性和使用頻次生產(chǎn)和訪問(wèn)數(shù)據(jù)的難易程度共享與傳輸數(shù)據(jù)的量及管理數(shù)據(jù)的操作方式2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院84.2文件與輸入/輸出流4.2.1文件4.2.2輸入/輸出流4.2.3數(shù)據(jù)序列化4.2.4CSV格式的文本文件2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院94.2.1文件案例的持久性問(wèn)題,本質(zhì)上是程序之間的一種交互,即一個(gè)程序或模塊產(chǎn)生數(shù)據(jù),另一個(gè)程序或模塊讀取并使用這些數(shù)據(jù)。程序之間可以通過(guò)文件實(shí)現(xiàn)輸入/輸出。在操作系統(tǒng)中,文件是組織和管理數(shù)據(jù)的基本單位,也是對(duì)物理輸入/輸出設(shè)備的抽象,使用者不必關(guān)心文件及其內(nèi)容的存取方式、存儲(chǔ)位置、結(jié)束標(biāo)志等。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院104.2.1文件1.字符文件與字節(jié)文件在字符文件中,字節(jié)表示字符,使得人們可以查看、編輯文件。在字節(jié)文件中,字節(jié)不一定表示字符;字節(jié)組還可以表示其他類型的數(shù)據(jù),如整數(shù)、浮點(diǎn)數(shù)或漢字字符。文件都是以二進(jìn)制格式存儲(chǔ)的。字節(jié)文本的存儲(chǔ)無(wú)須任何編碼,而使用文本文件時(shí)要考慮字符編碼。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院114.2.1文件2.記錄文件和流式文件文件分為物理文件和邏輯文件。邏輯文件從結(jié)構(gòu)上分兩種:無(wú)結(jié)構(gòu)的流式文件,信息不劃分單位,由一串字符流構(gòu)成文件;有結(jié)構(gòu)的記錄文件,信息按邏輯上獨(dú)立的含義劃分信息單位,稱為一個(gè)邏輯記錄(簡(jiǎn)稱記錄)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院124.2.2輸入/輸出流程序借助一個(gè)連接內(nèi)存中的程序和外存設(shè)備的通道來(lái)操作存儲(chǔ)器中的數(shù)據(jù)。流表示任意輸入的源或輸出的目的地。流即傳輸數(shù)據(jù)的管道,讓外部輸入設(shè)備或存儲(chǔ)器上的數(shù)據(jù)流入內(nèi)存,讓程序中的數(shù)據(jù)流出。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院134.2.2輸入/輸出流在程序中,可以把文件理解成物理概念,流是邏輯概念。程序的輸入/輸出操作是針對(duì)抽象的流來(lái)定義的,前提是把該文件與一個(gè)(對(duì)象)流聯(lián)系起來(lái)。高級(jí)語(yǔ)言如C、C++、C#、Java等保留了操作系統(tǒng)中的文件,同時(shí)引入了流,執(zhí)行對(duì)文件的讀/寫(xiě)操作。Java等語(yǔ)言沒(méi)有定義文件結(jié)構(gòu),即記錄,所以,程序員必須設(shè)計(jì)文件結(jié)構(gòu)來(lái)滿足應(yīng)用的需求。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院144.2.3數(shù)據(jù)序列化1.編寫(xiě)數(shù)據(jù)序列化代碼“線性化”函數(shù)將結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為字符串類型的數(shù)據(jù)。當(dāng)程序需要結(jié)構(gòu)化數(shù)據(jù)時(shí),再通過(guò)“結(jié)構(gòu)化”函數(shù),把線性化的數(shù)據(jù)按照原先的數(shù)據(jù)結(jié)構(gòu)恢復(fù)成結(jié)構(gòu)化數(shù)據(jù)。如何讀/寫(xiě)對(duì)象:要把對(duì)象轉(zhuǎn)換成字符串,在Java中類似toString。首先要把具有結(jié)構(gòu)的數(shù)據(jù)元素分解,轉(zhuǎn)換成字符串,然后用特殊分隔符隔離。每個(gè)數(shù)據(jù)對(duì)象還要再以分隔符隔離。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院154.2.3數(shù)據(jù)序列化【例4.1】學(xué)生有姓名、性別、學(xué)號(hào)、身高、體重、生日、學(xué)院、手機(jī)等信息。首先,轉(zhuǎn)換成字符串。姓名可以拼音或中文(如果是外國(guó)人的姓名,姓氏和名字之間加一個(gè)空格作為分隔符),生日中的年月日作為一個(gè)數(shù)據(jù)元素,也可以分成三個(gè)數(shù)據(jù)元素年、月、日,中間也需隔離,比如用下畫(huà)線1995_02_25,或者斜線1995/02/25,其他的可以當(dāng)作一個(gè)整體,這8個(gè)數(shù)據(jù)元素之間用“?”分隔;每個(gè)學(xué)生數(shù)據(jù)占一行,或者用逗號(hào)、分號(hào)等不同于數(shù)據(jù)內(nèi)部的分隔符。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院164.2.3數(shù)據(jù)序列化從文件中讀入學(xué)生數(shù)據(jù)時(shí),根據(jù)換行符或其他分隔符讀入一個(gè)學(xué)生的數(shù)據(jù),然后再析取每個(gè)學(xué)生的數(shù)據(jù)元素,轉(zhuǎn)換成基本的數(shù)據(jù)類型。對(duì)于C語(yǔ)言,可能要轉(zhuǎn)換成結(jié)構(gòu)體struct。對(duì)于面向?qū)ο笳Z(yǔ)言,需要用這些數(shù)據(jù)構(gòu)造成一個(gè)對(duì)象,因而需要類提供所有成員變量的構(gòu)造方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院174.2.3數(shù)據(jù)序列化2.對(duì)象序列化Java、C#等面向?qū)ο笳Z(yǔ)言都有實(shí)現(xiàn)對(duì)象序列化的類或接口(類似Serializable),把對(duì)象數(shù)據(jù)轉(zhuǎn)換成(二進(jìn)制)字節(jié)序列的形式,與外部源共享或傳輸數(shù)據(jù)。程序員不必準(zhǔn)確知道系統(tǒng)是如何表示對(duì)象的字節(jié)序列的。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院184.2.3數(shù)據(jù)序列化序列化(Serialization)是將對(duì)象的狀態(tài)信息(成員變量)轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。它的逆過(guò)程則被稱為反序列化(Deserialization)。在序列化期間,對(duì)象將其當(dāng)前狀態(tài)寫(xiě)入到臨時(shí)或持久存儲(chǔ)區(qū)??梢酝ㄟ^(guò)從存儲(chǔ)區(qū)中讀取或反序列化對(duì)象的狀態(tài),重新創(chuàng)建該對(duì)象。序列化的對(duì)象是對(duì)象的字節(jié)序列,包含對(duì)象數(shù)據(jù)及其類型信息。這樣,信息可以用來(lái)再創(chuàng)建內(nèi)存中的對(duì)象。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院194.2.4CSV格式的文本文件逗號(hào)分隔值(Comma-SeparatedValues,CSV)以純文本形式存儲(chǔ)數(shù)字和文本數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄之間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見(jiàn)的是逗號(hào)或制表符。通常,所有記錄都有完全相同的字段序列。CSV是一種通用的、相對(duì)簡(jiǎn)單的文本文件格式,在電子表單和數(shù)據(jù)庫(kù)中有著廣泛的應(yīng)用。一些程序設(shè)計(jì)語(yǔ)言如R、Go和Python都內(nèi)置了讀/寫(xiě)CSV格式文件的函數(shù)或類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院204.2.4CSV格式的文本文件CSV沒(méi)有單一的、明確定義的格式。在實(shí)踐中,CSV泛指具有以下特征的任何文本文件:純文本,使用某個(gè)字符集,如ASCII、Unicode、EBCDIC或GB2312;由記錄組成(典型的是每行一條記錄);每條記錄被分隔符分隔為字段(典型分隔符有逗號(hào)、分號(hào)或制表符;有時(shí)分隔符可以包括可選的空格);每條記錄都有同樣的字段序列。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院214.3編寫(xiě)健壯的程序健壯性(robutness)是指程序?qū)τ谝笾獾妮斎脒M(jìn)行判斷并處理、使程序保持運(yùn)行狀態(tài),即使這有時(shí)可能導(dǎo)致不準(zhǔn)確的結(jié)果。程序的正確性指的是程序絕不產(chǎn)生不準(zhǔn)確的結(jié)果。有時(shí)更希望程序健壯,4.3.1防御性編程4.3.2使用斷言2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院224.3.1防御性編程防御編程的基本思想是:程序員要預(yù)計(jì)其他程序員的過(guò)錯(cuò)、無(wú)效的輸入、甚至有害的數(shù)據(jù)及使用者的過(guò)失,即使這種事情罕見(jiàn),也要采取適當(dāng)措施保護(hù)自己的程序。保護(hù)程序無(wú)效輸入破壞的基本原則:檢查每個(gè)輸入?yún)?shù)的數(shù)據(jù);特別要檢查從程序外部進(jìn)入程序的數(shù)據(jù)。一旦發(fā)現(xiàn)了無(wú)效數(shù)據(jù),就要決定處理的方式?;镜姆绞接刑幚礤e(cuò)誤和使用異常。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院234.3.1防御性編程1.處理錯(cuò)誤錯(cuò)誤處理的方式影響軟件滿足正確性、健壯性及其他非功能性需求的能力。數(shù)據(jù)錯(cuò)誤出現(xiàn)時(shí)的一些建議(1)繼續(xù)運(yùn)行程序、返回中性無(wú)害的數(shù)據(jù)。(2)用最接近的有效數(shù)據(jù)替換無(wú)效數(shù)據(jù)。(3)在日志中記錄警告信息并繼續(xù)運(yùn)行程序。(4)調(diào)用錯(cuò)誤處理程序或?qū)ο?。?)屏幕顯示錯(cuò)誤信息。(6)盡可能在局部處理錯(cuò)誤。(7)返回一個(gè)錯(cuò)誤編碼,讓特定程序處理這個(gè)錯(cuò)誤。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院244.3.1防御性編程2.使用異常異常是處理錯(cuò)誤的一種特殊方式,出現(xiàn)了錯(cuò)誤或異常行為的程序能把錯(cuò)誤傳遞給程序的調(diào)用者,讓它處理。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院254.3.1防御性編程異常處理一般有兩種模型:終止模式和恢復(fù)模式。終止模式假設(shè)錯(cuò)誤非常關(guān)鍵,導(dǎo)致程序無(wú)法返回到異常發(fā)生的地方繼續(xù)執(zhí)行。一旦拋出異常,就表明錯(cuò)誤已無(wú)法挽回,也不能回來(lái)繼續(xù)執(zhí)行?;謴?fù)模式認(rèn)為異常處理程序的工作是修正錯(cuò)誤,重新嘗試調(diào)用出問(wèn)題的方法,并認(rèn)為二次處理能成功。恢復(fù)模式希望處理異常后程序能繼續(xù)執(zhí)行。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院264.3.1防御性編程3.應(yīng)用舉例定義方法私有的,確保只有開(kāi)發(fā)者知道,僅僅在參數(shù)合法的情況下才使用該操作。使用語(yǔ)言系統(tǒng)提供的異常類和異常處理機(jī)制,檢查參數(shù)的合法性。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院274.3.2使用斷言斷言是讓程序在運(yùn)行過(guò)程中自我檢查的代碼。如果斷言為真,就意味著程序如期望的正常;否則,就表示在代碼中發(fā)現(xiàn)了意外。如,在100以內(nèi)的算式產(chǎn)生函數(shù)中可以插入一個(gè)斷言(以Python語(yǔ)言為例):2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院284.3.2使用斷言編寫(xiě)代碼時(shí),我們總是會(huì)做出一些假設(shè)。斷言用于在代碼中捕捉這些假設(shè),可以將斷言視為異常處理的一種高級(jí)形式??梢允褂脭嘌栽诖a中記錄一些假設(shè),例如:輸入?yún)?shù)的值在預(yù)期范圍內(nèi);程序運(yùn)行時(shí)文件流已打開(kāi)或者在開(kāi)始的地方;指針?lè)强?;輸入?yún)?shù)的數(shù)組、表或其他容器已經(jīng)包含了數(shù)據(jù);2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院294.3.2使用斷言斷言的現(xiàn)行形式是一些布爾表達(dá)式,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真。斷言分為如下三類。前置斷言:代碼執(zhí)行之前必須具備的特性。后置斷言:代碼執(zhí)行之后必須具備的特性。不變斷言:代碼執(zhí)行前后不能變化的特性。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院304.3.2使用斷言斷言的基本用途是調(diào)試和測(cè)試程序,編譯器啟動(dòng)斷言檢查后才能使用斷言。程序布署完之后就關(guān)閉斷言。下面是使用斷言的一些建議。對(duì)預(yù)計(jì)出現(xiàn)的條件使用錯(cuò)誤處理,對(duì)不應(yīng)當(dāng)出現(xiàn)的條件使用斷言。錯(cuò)誤處理用于檢查不合理的輸入數(shù)據(jù);斷言則用于檢查代碼中的錯(cuò)誤。避免在斷言中放置可執(zhí)行的代碼。因?yàn)殛P(guān)閉斷言后,編譯器可能會(huì)刪除這些代碼。用斷言來(lái)記錄和驗(yàn)證前置條件和后置條件。健壯性要求高的程序使用斷言和錯(cuò)誤處理。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院314.4字符串處理與正則表達(dá)式在操作文本文件時(shí),數(shù)據(jù)都是字符串?;绢愋停ㄈ?2.5)或結(jié)構(gòu)化的數(shù)據(jù)(如32+5),存儲(chǔ)在文本文件中都是字符串“32.5”和“32+5”。編程語(yǔ)言都有基本類型數(shù)據(jù)轉(zhuǎn)換為字符串的內(nèi)置機(jī)制。自定義的數(shù)據(jù)類型或?qū)ο?,則需要用戶自己編寫(xiě)轉(zhuǎn)換程序。如,C#、Java等需要為自定義的類編寫(xiě)對(duì)象的字符串顯示方法toString(),覆蓋從根類繼承的默認(rèn)顯示。字符串作為基本的內(nèi)置類型,編程語(yǔ)言也提供了大量的字符串操作,如查找一個(gè)字符、查找一個(gè)字串、置換一個(gè)字串、合并兩個(gè)字串、字符串復(fù)制等??梢允褂镁幊陶Z(yǔ)言提供的基本的字符串操作完成數(shù)據(jù)的構(gòu)造。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院324.4字符串處理與正則表達(dá)式以CSV格式的練習(xí)題文件為例。(1)先把一行字符串讀到數(shù)組,equationLine;(2)把equationLine中以逗號(hào)和換行分隔的算式符號(hào)串識(shí)別出來(lái),存入String[]stringEquations;(3)識(shí)別出“51+11”三個(gè)組成,把數(shù)字轉(zhuǎn)成整型,存入left和right,運(yùn)算符存入字符operator;(4)算式構(gòu)造函數(shù)EquationconstructEquation(intleft,intright,charoperator)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院334.4字符串處理與正則表達(dá)式程序?qū)λ闶降奈谋靖袷揭髧?yán)格:字符串不能含任何多余的字符,包括空格。如“51+11,□□19+45,92□+8,80+19,73+10□”有任何多余的空格□,程序?qū)⑦\(yùn)行錯(cuò)誤。否則,程序員要仔細(xì)編寫(xiě)煩瑣的程序,進(jìn)行預(yù)處理,使字符串滿足要求?,F(xiàn)代編程語(yǔ)言提供了更豐富的字符串處理庫(kù),其中重要而又易用的是正則表達(dá)式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院344.4字符串處理與正則表達(dá)式用正則表達(dá)式及String相關(guān)函數(shù),處理數(shù)據(jù)如“51+11,[19+□□A45,□92+8,?80+19,73+10;□”。符號(hào)串"[\\s\\D\\p{Punct}&&[^\\,+?]]+"就是正則表達(dá)式,把輸入字符串中除數(shù)字、‘+’、‘?’和‘,’之外的字符全部刪除。字符串函數(shù)split(),按正則表達(dá)式"\\,"的模式以逗號(hào)為分隔符,把輸入的符號(hào)串分成一組符號(hào)串。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院354.4字符串處理與正則表達(dá)式正則表達(dá)式正則表達(dá)式(RegularExpressions)是一串字符,它所定義的模式可用來(lái)查找、顯示或修改輸入序列中出現(xiàn)的某個(gè)模式的一部分或全部。Java在String類中提供了booleanmatches(Stringregxep)、voidreplaceAll(Stringregxep,Stringreplacement)和String[]split(Stringregxep)三種基本方法,它們的作用分別是匹配、替換全部匹配內(nèi)容、分割。參數(shù)都包含了正則表達(dá)式regxep。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院364.4字符串處理與正則表達(dá)式【例4.2】標(biāo)識(shí)符的正則表達(dá)式:[A-Za-z][A-Za-z0-9]*,方括號(hào)[]表示選取其中任何一個(gè)符號(hào),星號(hào)表示符號(hào)出現(xiàn)0次或多次。如果標(biāo)識(shí)符允許含下畫(huà)線,但不能以下畫(huà)線結(jié)束。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院374.4字符串處理與正則表達(dá)式【例4.3】打開(kāi)文本文件,統(tǒng)計(jì)包含了字符串str的單詞數(shù),不區(qū)分str的大小寫(xiě)。詞法分析器Scanner可用正則表達(dá)式分隔字符串,語(yǔ)句sc.useDelimiter("[^\\w]+")將可用于標(biāo)識(shí)符的字符串從輸入串中分離。然后,在語(yǔ)句if(reg.matches("\\w*[sS][tT][rR]\\w*"))中比較輸入串是否匹配正則表達(dá)式"\\w*[sS][tT][rR]\\w*"。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院384.5程序中數(shù)據(jù)集的使用4.5.1算式基4.5.2表驅(qū)動(dòng)編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院394.5.1算式基截至目前,案例的算式及習(xí)題都是在使用時(shí)由程序隨機(jī)產(chǎn)生,即數(shù)據(jù)是按需生成和使用的。而且,產(chǎn)生的算式、習(xí)題數(shù)據(jù)都以程序變量的值出現(xiàn)在計(jì)算機(jī)的內(nèi)存中,一旦程序結(jié)束,數(shù)據(jù)立即丟失。數(shù)據(jù)的這種處理方式有局限性。(1)效率。(2)復(fù)用。(3)共享。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院404.5.1算式基案例問(wèn)題中,隨機(jī)產(chǎn)生一個(gè)算式,兩個(gè)運(yùn)算數(shù)及其和或差的范圍是[0..100],算式個(gè)數(shù)有限,可以生成全部有效算式,存儲(chǔ)起來(lái),使用時(shí)隨機(jī)取出一定數(shù)量(如50)的算式組成一套習(xí)題。進(jìn)而還可以把多套習(xí)題持久地存儲(chǔ)起來(lái)供以后使用。那么,一共有多少個(gè)滿足條件的加減法算式??jī)蛇\(yùn)算數(shù)的取值范圍是[0..100],加減法的算式最多101×101=10201個(gè)??紤]和、差的約束,這兩個(gè)算式的總數(shù)更小。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院414.5.1算式基用行表示加數(shù),列表示被加數(shù),下面斜三角形即所有滿足條件、有效的加法算式:用二維數(shù)組AdditionBase[101,101]作為加法算式基,存放所有滿足約束條件的加法算式,函數(shù)generateAdditionBase()生產(chǎn)加法算式基。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院424.5.1算式基類似地,所有滿足條件的減法算式構(gòu)成如下的斜三角形:函數(shù)generateSubstractBase()產(chǎn)生一個(gè)二維數(shù)組SubstractBase[101,101]作為減法算式基,存放滿足所有約束條件的減法算式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院434.5.1算式基二維數(shù)組的算式基存放的是有效算式的運(yùn)算結(jié)果,對(duì)無(wú)效算式則為空或?1。算式基具有如下特性。(1)算式及其約束條件隱含在二維數(shù)組中:只要元素AdditionBase[i,j]或SubstractBase[i,j]不是空或?1,就表示i+j或i?j是有效算式,而且AdditionBase[i,j]存放的是算式i+j的計(jì)算結(jié)果,SubstractBase[i,j]是算式i?j的計(jì)算結(jié)果。(2)兩個(gè)算式不一樣,當(dāng)且僅當(dāng)算式基的兩個(gè)數(shù)組元素對(duì)應(yīng)的行或列的下標(biāo)不等。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院444.5.1算式基算式的產(chǎn)生簡(jiǎn)化成隨機(jī)地生成兩個(gè)整數(shù)i和j,0≤i,j≤100,然后從加法基或減法基選擇一個(gè)數(shù)組元素[i,j]構(gòu)成算式。習(xí)題的創(chuàng)建與算式基的創(chuàng)建稱為兩個(gè)獨(dú)立的活動(dòng)。算式基實(shí)現(xiàn)了按需選擇數(shù)據(jù)和數(shù)據(jù)重用,為數(shù)據(jù)共享提供了支持。如果能持久地、以通用的格式存儲(chǔ)算式基及產(chǎn)生的習(xí)題,就可以在不同程序、甚至不同語(yǔ)言的程序之間實(shí)現(xiàn)數(shù)據(jù)共享。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院454.5.2表驅(qū)動(dòng)編程算式基的設(shè)計(jì)把加法、減法算式的約束條件,以及算式產(chǎn)生的信息都放在了一張表中,使程序在表中通過(guò)選擇條件而不使用邏輯語(yǔ)句(if或case)得到算式及其運(yùn)算結(jié)果。如此編寫(xiě)程序的方式稱為表驅(qū)動(dòng)編程。理論上,任何使用邏輯語(yǔ)句的情況都可以用存儲(chǔ)了信息的讀取表的操作。如果條件簡(jiǎn)單,則邏輯語(yǔ)句直截了當(dāng)、易用。邏輯鏈越復(fù)雜,表驅(qū)動(dòng)編程就越有吸引力。使用得當(dāng),表驅(qū)動(dòng)編程把復(fù)雜的邏輯編織在表中,而不是編織在代碼中,使得程序結(jié)構(gòu)簡(jiǎn)潔、邏輯清晰、容易修改和擴(kuò)展。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院464.5.2表驅(qū)動(dòng)編程【例4.4】把輸入的一個(gè)符號(hào)分成字母、標(biāo)號(hào)或數(shù)字種類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院474.5.2表驅(qū)動(dòng)編程如果先把每個(gè)字符的種類存入以字符碼作為下標(biāo)的數(shù)組,則可以用下面簡(jiǎn)單的語(yǔ)句代替上面復(fù)雜的程序段:它把應(yīng)用知識(shí)放入了表而不是程序邏輯,即用表替換了if檢測(cè)。表驅(qū)動(dòng)編程是解決復(fù)雜的判斷邏輯、面向?qū)ο罄^承結(jié)構(gòu)的一種簡(jiǎn)單方式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院484.5.2表驅(qū)動(dòng)編程使用表驅(qū)動(dòng)編程方法需要考慮以下兩點(diǎn)。(1)表項(xiàng)的內(nèi)容。查詢表得到的可以是直接結(jié)果或者是動(dòng)作。在這種情況下,可以在表中存放描述動(dòng)作的代碼,或者對(duì)某些語(yǔ)言可以存放引用實(shí)現(xiàn)動(dòng)作的函數(shù)。在表中存放動(dòng)作使表的內(nèi)容及其處理變得復(fù)雜了。(2)表項(xiàng)的查詢。有三種基本的查詢方式:直接訪問(wèn)、階梯訪問(wèn)和索引訪問(wèn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院494.5.2表驅(qū)動(dòng)編程1.直接訪問(wèn)表中的項(xiàng)表示一個(gè)結(jié)果或動(dòng)作,通過(guò)數(shù)組下標(biāo)(一維表)或矩陣下標(biāo)(二維表)直接訪問(wèn)表。例如,計(jì)算某個(gè)月的天數(shù),可以用下標(biāo)是1~12的數(shù)組存放每個(gè)月份的天數(shù),用月份作為數(shù)據(jù)直接得到當(dāng)月的天數(shù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院504.5.2表驅(qū)動(dòng)編程2.階梯訪問(wèn)表中的項(xiàng)表示一個(gè)數(shù)據(jù)范圍而不是對(duì)應(yīng)不同的單個(gè)數(shù)據(jù),而且數(shù)據(jù)的排列按照一定的順序,這樣就避免了顯示比較,實(shí)際上是隱含了比較。【例4.5】考慮按照輸入的分?jǐn)?shù)輸出成績(jī)等級(jí)的程序。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院514.5.2表驅(qū)動(dòng)編程使用表驅(qū)動(dòng)編程,將成績(jī)等級(jí)按照上升方式存入數(shù)組String[]grades后,程序代碼如下:2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院524.5.2表驅(qū)動(dòng)編程表的設(shè)計(jì)影響程序的設(shè)計(jì)。下面代碼對(duì)應(yīng)的是本例另外設(shè)計(jì)的一種表。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院534.5.2表驅(qū)動(dòng)編程階梯訪問(wèn)方式的一個(gè)優(yōu)點(diǎn)是容易處理不規(guī)則的數(shù)據(jù)。在分?jǐn)?shù)等級(jí)的例子中,“不及格”對(duì)應(yīng)了59個(gè)數(shù),“優(yōu)秀”對(duì)應(yīng)11個(gè)數(shù),其他的對(duì)應(yīng)10個(gè)數(shù)。容易修改程序,使它能處理不含“中等”的分?jǐn)?shù)等級(jí),即60~79分都是“及格”。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院544.5.2表驅(qū)動(dòng)編程3.索引訪問(wèn)首先為查詢的數(shù)據(jù)建立一個(gè)檢索表,用索引數(shù)據(jù)在索引表中得到關(guān)鍵字。然后用該值在另一個(gè)表(主表)中檢索感興趣的主數(shù)據(jù)。散列表或哈希表(HashTable)是索引訪問(wèn)的一個(gè)例子。索引訪問(wèn)的優(yōu)勢(shì)如下。(1)節(jié)省空間。(2)操作檢索表項(xiàng)要比操作主表項(xiàng)簡(jiǎn)單。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院554.6基于程序結(jié)構(gòu)的測(cè)試程序結(jié)構(gòu)主要包括控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)。本節(jié)以產(chǎn)生0~100的算式為例說(shuō)明如何測(cè)試程序的控制結(jié)構(gòu)。4.6.1語(yǔ)句覆蓋測(cè)試4.6.2程序控制流圖4.6.3邏輯覆蓋測(cè)試4.6.4路徑覆蓋測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院564.6基于程序結(jié)構(gòu)的測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院574.6基于程序結(jié)構(gòu)的測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院584.6.1語(yǔ)句覆蓋測(cè)試根據(jù)良好編程的一個(gè)基本原則,程序中每個(gè)組成(語(yǔ)句和變量等)都要有用,即完成指定的功能,不多也不少。結(jié)構(gòu)性測(cè)試試圖證實(shí)這個(gè)原則得到落實(shí)或落實(shí)的程度。普通的編譯程序能檢查程序的語(yǔ)法錯(cuò)誤,有些編譯也能檢查程序的語(yǔ)義錯(cuò)誤,甚至邏輯上的缺陷。測(cè)試程序更關(guān)注語(yǔ)句、語(yǔ)句的組成及語(yǔ)句之間的關(guān)系。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院594.6.1語(yǔ)句覆蓋測(cè)試設(shè)計(jì)測(cè)試,檢測(cè)程序的每條語(yǔ)句是否都能執(zhí)行。如果一個(gè)測(cè)試用例沒(méi)有使所有的語(yǔ)句都得到執(zhí)行,就增加測(cè)試,試圖增加執(zhí)行的語(yǔ)句數(shù)量,直至所有語(yǔ)句都能執(zhí)行。否則,要么測(cè)試用例不夠,不能使所有語(yǔ)句都執(zhí)行;要么程序有缺陷,出現(xiàn)了不可能執(zhí)行的語(yǔ)句。把這種測(cè)試稱為語(yǔ)句覆蓋測(cè)試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院604.6.1語(yǔ)句覆蓋測(cè)試首先要明確語(yǔ)句的概念。計(jì)算機(jī)程序的語(yǔ)句一般分為簡(jiǎn)單語(yǔ)句和復(fù)合語(yǔ)句。語(yǔ)句覆蓋的基本準(zhǔn)則:設(shè)計(jì)測(cè)試用例,使得程序的每條基本語(yǔ)句都得到執(zhí)行。如,測(cè)試數(shù)據(jù)(57,35,'+'),在generateOperationTester()中使用后,運(yùn)行了下列語(yǔ)句:{1,2,3,4,5,6,7,24}。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院614.6.1語(yǔ)句覆蓋測(cè)試分析程序,要執(zhí)行語(yǔ)句8,輸入運(yùn)算數(shù)之和要大于100,故增加測(cè)試數(shù)據(jù)(57,55,'+'),覆蓋了下列語(yǔ)句:{1,2,3,4,5,6,8,9,10,24}。繼續(xù)增加測(cè)試數(shù)據(jù)(77,35,'?'),(17,35,'?'),(47,35,'#'),(?17,35,'+')。共6個(gè)測(cè)試數(shù)據(jù)就能使得函數(shù)generateOperation()的所有語(yǔ)句得以執(zhí)行,即這組測(cè)試數(shù)據(jù)100%地覆蓋了語(yǔ)句。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院624.6.1語(yǔ)句覆蓋測(cè)試可以設(shè)計(jì)其他測(cè)試數(shù)據(jù),實(shí)現(xiàn)100%覆蓋函數(shù)generateOperation()的語(yǔ)句,例如:(18,45,'+'),(77,45,'+'),(18,101,'+'),(18,92,'-'),(66,33,'-'),(17,33,'=')運(yùn)用語(yǔ)句覆蓋的測(cè)試目標(biāo)是,使用盡可能少的測(cè)試用例,實(shí)現(xiàn)最大的語(yǔ)句覆蓋,用語(yǔ)句覆蓋率來(lái)量化:語(yǔ)句覆蓋率=覆蓋的語(yǔ)句數(shù)/語(yǔ)句總數(shù)2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院634.6.1語(yǔ)句覆蓋測(cè)試即使是100%的語(yǔ)句覆蓋測(cè)試也不能保證程序正確無(wú)誤。語(yǔ)句覆蓋是最容易實(shí)現(xiàn)、也是最弱的覆蓋準(zhǔn)則。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院644.6.2程序控制流圖程序控制流圖(ControlFlowGraph,CFG)表示程序的控制流??刂屏髦傅氖强刂茝囊粭l指令到另一條指令的流動(dòng)??刂屏鲃?dòng)的方式多種多樣,如按照指令的先后順序、函數(shù)調(diào)用、消息傳遞或中斷。條件語(yǔ)句改變程序中的控制的正常的、順序的流動(dòng)。本節(jié)介紹的控制流圖主要用在一個(gè)函數(shù)或方法中。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院654.6.2程序控制流圖控制流圖的畫(huà)法如下。(1)節(jié)點(diǎn):圓圈表示一條可執(zhí)行的基本語(yǔ)句,可以增加標(biāo)記,如語(yǔ)句號(hào)或節(jié)點(diǎn)順序號(hào);(2)控制線或弧:用帶箭頭的有向線表示連結(jié)的兩個(gè)語(yǔ)句的執(zhí)行順序;(3)程序執(zhí)行(控制流)的分叉或交匯處,可以用節(jié)點(diǎn)表示;(4)每個(gè)函數(shù)或程序都有唯一的開(kāi)始和結(jié)束節(jié)點(diǎn);(5)不含執(zhí)行程序不可達(dá)到的語(yǔ)句或不能使程序停止的語(yǔ)句;(6)控制線必須連接兩個(gè)節(jié)點(diǎn),開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)除外。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院664.6.2程序控制流圖2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院674.6.3邏輯覆蓋測(cè)試1.判定覆蓋判定覆蓋準(zhǔn)則測(cè)試的含義是,設(shè)計(jì)測(cè)試用例,使得程序中的每個(gè)判斷分支都至少經(jīng)歷一次。由于一個(gè)判定往往代表著程序的一個(gè)分支,所以判定覆蓋也稱分支覆蓋。如,測(cè)試數(shù)據(jù)(12,48,'+'),(102,48,'+'),(88,45,'?'),(77,45,'?'),(38,81,'?'),(18,92,'+')2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院684.6.3邏輯覆蓋測(cè)試2.條件覆蓋布爾條件分簡(jiǎn)單條件和復(fù)合條件。簡(jiǎn)單條件指的是布爾變量或原子布爾表達(dá)式,即不含布爾運(yùn)算的布爾表達(dá)式。復(fù)合條件則是至少用一個(gè)布爾運(yùn)算連接的簡(jiǎn)單條件。條件覆蓋的準(zhǔn)則是:設(shè)計(jì)測(cè)試用例,使得程序中的每個(gè)簡(jiǎn)單布爾條件的所有可能的值都至少滿足一次。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院694.6.3邏輯覆蓋測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院704.6.4路徑覆蓋測(cè)試程序的執(zhí)行路徑可以抽象語(yǔ)句序列,即從進(jìn)入程序的第一條語(yǔ)句到程序停止、一次運(yùn)行的語(yǔ)句序列。對(duì)于函數(shù)而言,停止語(yǔ)句可以是自然的最后一條語(yǔ)句,也可以是一條return語(yǔ)句。例如,語(yǔ)句編號(hào)序列1-2-3-22-23-24和1-2-3-4-5-6-7-24都是函數(shù)的執(zhí)行路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院714.6.4路徑覆蓋測(cè)試用CFG再次簡(jiǎn)化和抽象程序的執(zhí)行路徑。用圖的路徑表示程序的執(zhí)行路徑:一條路徑是從CFG的開(kāi)始節(jié)點(diǎn)經(jīng)過(guò)連線到達(dá)結(jié)束節(jié)點(diǎn)的節(jié)點(diǎn)序列或控制線序列。(1)分解復(fù)合條件:把復(fù)合條件中每個(gè)簡(jiǎn)單條件用一個(gè)節(jié)點(diǎn)表示,并調(diào)整控制線。(2)合并簡(jiǎn)單的順序語(yǔ)句:賦值語(yǔ)句、打印語(yǔ)句等不含條件,如果是順序排列,它們的執(zhí)行不會(huì)改變程序的控制順序,即不會(huì)產(chǎn)生新的路徑,可以將它們合并在一起,用一個(gè)節(jié)點(diǎn)表示。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院724.6.4路徑覆蓋測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院734.6.4路徑覆蓋測(cè)試路徑有長(zhǎng)有短,如果有循環(huán)語(yǔ)句,一條路徑可能會(huì)出現(xiàn)在每一次的循環(huán)路徑中。按照等價(jià)類的思路,我們希望測(cè)試的每條路徑都有所不同,但又盡量包含可能多的路徑,通常采用基本路徑覆蓋法。簡(jiǎn)單地說(shuō),一條基本路徑是指,和其他基本路徑相比,至少引入一個(gè)節(jié)點(diǎn)或一個(gè)新的控制線的路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院744.6.4路徑覆蓋測(cè)試一個(gè)程序的基本路徑的數(shù)量是其CFG圖G的圈復(fù)雜數(shù),由V(G)=e?n+2給出,其中e是G中的邊數(shù),n是G中的節(jié)點(diǎn)數(shù)。本例的圈復(fù)雜數(shù)=23?16+2=9,也就是說(shuō)有9條基本路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院754.6.4路徑覆蓋測(cè)試運(yùn)用一個(gè)數(shù)據(jù)結(jié)構(gòu)棧找出基本路徑。(1)首先,CFG的開(kāi)始節(jié)點(diǎn)入棧;(2)從棧頂按照CFG連線,選擇下一個(gè)節(jié)點(diǎn):如果一個(gè)節(jié)點(diǎn)的出度outDegree大于0,選擇之前沒(méi)有選擇過(guò)的后繼節(jié)點(diǎn),outDegree?1;(3)重復(fù)(2)直至棧頂是CFG的結(jié)束節(jié)點(diǎn)。從棧內(nèi)輸出節(jié)點(diǎn),其逆序就是一條基本路徑;(4)尋找下一條基本路徑,從棧頂逐個(gè)退出節(jié)點(diǎn):如果遇到一個(gè)節(jié)點(diǎn)的出度大于1且當(dāng)前outDegree大于0,則重復(fù)步驟(2)~(4);如果退出開(kāi)始節(jié)點(diǎn),則查找結(jié)束。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院764.6.4路徑覆蓋測(cè)試基本路徑覆蓋測(cè)試的步驟如下:(1)繪制待測(cè)程序的CFG;(2)計(jì)算CFG的圈復(fù)雜數(shù);(3)找出圈復(fù)雜數(shù)的基本路徑作為一個(gè)測(cè)試基本集;(4)設(shè)計(jì)測(cè)試用例,使其覆蓋測(cè)試基本集中的每條基本路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院774.6.4路徑覆蓋測(cè)試最后,幾點(diǎn)說(shuō)明如下。(1)圈復(fù)雜數(shù)是代碼邏輯復(fù)雜度的度量。圈復(fù)雜數(shù)越大,程序復(fù)雜度越高,出錯(cuò)的概率越大。(2)每個(gè)程序的基本路徑的數(shù)量一樣,測(cè)試基本集不唯一。(3)基本路徑測(cè)試不是測(cè)試所有路徑的組合,它僅僅保證每條基本路徑被執(zhí)行一次。(4)面向?qū)ο蠹夹g(shù)倡導(dǎo)復(fù)用和單一職能,成員方法的圈復(fù)雜數(shù)通常都很小。(5)基本路徑測(cè)試主要用在單元測(cè)試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院784.7運(yùn)用JUnit4.7.1異常測(cè)試4.7.2參數(shù)化測(cè)試4.7.3測(cè)試套件4.7.4JUnit的斷言4.7.5JUnit使用指南2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院794.7.1異常測(cè)試異常處理是提高程序可靠性的一個(gè)重要機(jī)制,需要時(shí)應(yīng)該給程序編寫(xiě)異常拋出及其處理。異常測(cè)試的含義:如果一個(gè)程序應(yīng)該拋出異常,但是運(yùn)行時(shí)沒(méi)有拋出,這就是一個(gè)錯(cuò)誤。JUnit4通過(guò)@Test注解中的expected屬性來(lái)測(cè)試異常。expected屬性的值是一個(gè)異常類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院804.7.1異常測(cè)試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院814.7.1異常測(cè)試如果不想執(zhí)行toString()的測(cè)試方法,就在其前面使用注解@Ignore。測(cè)試運(yùn)行結(jié)果中的斜線表示不執(zhí)行的測(cè)試。代碼前要引入org.junit.Ignore注解包。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院824.7.2參數(shù)化測(cè)試為了簡(jiǎn)化測(cè)試編碼,JUnit4提供了參數(shù)化測(cè)試,即只寫(xiě)一個(gè)測(cè)試方法,把測(cè)試用例作為參數(shù)傳遞進(jìn)去,一次循環(huán)執(zhí)行,完成多個(gè)測(cè)試數(shù)據(jù)??梢园褏?shù)化測(cè)試?yán)斫獬蓽y(cè)試一個(gè)數(shù)據(jù)集合。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院834.7.2參數(shù)化測(cè)試編寫(xiě)參數(shù)化測(cè)試的代碼需要6個(gè)基本步驟。(1)要為參數(shù)化測(cè)試生成一個(gè)獨(dú)立的新的類,不能與其他測(cè)試公用同一個(gè)類。(2)為參數(shù)化測(cè)試類指定特殊的運(yùn)行器,語(yǔ)句@RunWith(Parameterized.class)為這個(gè)類指定org.JUnit.runners.Parameterized運(yùn)行器,注解必須放在測(cè)試類的前面。(3)為測(cè)試類聲明若干變量,分別用于存放期望值和測(cè)試數(shù)據(jù)。(4)為測(cè)試類聲明一個(gè)帶有參數(shù)的公共構(gòu)造函數(shù),為(3)中聲明的變量賦值。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院844.7.2參數(shù)化測(cè)試編寫(xiě)參數(shù)化測(cè)試的代碼需要6個(gè)基本步驟。(5)為測(cè)試類聲明一個(gè)使用注解@Parameters修飾的、返回值為java.util.Collection的公共靜態(tài)方法。方法中列出測(cè)試用例,即測(cè)試數(shù)據(jù)和期望值。該方法沒(méi)有參數(shù),名字沒(méi)有特殊要求。測(cè)試用例是一個(gè)二維數(shù)組,數(shù)組中數(shù)據(jù)的一部分是與測(cè)試類的變量相同的數(shù)據(jù),另一個(gè)部分是預(yù)期結(jié)果。測(cè)試數(shù)據(jù)及預(yù)期結(jié)果的個(gè)數(shù)和順序要與(4)的構(gòu)造函數(shù)中的參數(shù)完全一致。(6)編寫(xiě)測(cè)試方法,使用定義的測(cè)試用例作為參數(shù)進(jìn)行測(cè)試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院854.7.3測(cè)試套件JUnit提供了測(cè)試套件作為容器,將所有需要運(yùn)行的測(cè)試類集中起來(lái),一次性運(yùn)行,提高了測(cè)試效率。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院864.7.3測(cè)試套件測(cè)試套件使用一個(gè)特殊的Runner,要向注解@RunWith傳遞一個(gè)參數(shù)Suite.class,然后使用注解@Suite.SuiteClasses來(lái)表明一個(gè)獨(dú)立的測(cè)試類(容器類)是一個(gè)測(cè)試套件。在其中把需要一起測(cè)試的類作為參數(shù)傳遞給該注解——列舉每個(gè)測(cè)試類。容器類的名字無(wú)關(guān)緊要,甚至內(nèi)容也可以為空。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院874.7.4JUnit的斷言斷言是JUnit測(cè)試中最基本的組成部分。它們實(shí)際上是Assert類的一些靜態(tài)方法。前面的例子使用了斷言assertEquals。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院884.7.5JUnit使用指南2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院894.8案例分析與實(shí)踐1.分析與設(shè)計(jì)第一步,隨機(jī)生成多套習(xí)題,保存起來(lái),華經(jīng)理每天選擇并打印三套習(xí)題;第二步,程序讀入小明的練習(xí)結(jié)果,判題、打分并保存起來(lái)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院904.8案例分析與實(shí)踐一些問(wèn)題如下。1)這些功能或任務(wù)如何分配到現(xiàn)有類?如何盡可能減少對(duì)現(xiàn)有類的改動(dòng)?2)是否增加類?新增類與現(xiàn)有類間有何關(guān)聯(lián)?3)如何關(guān)聯(lián)習(xí)題與練習(xí)結(jié)果?即如何明確一個(gè)以文件存儲(chǔ)的練習(xí)結(jié)果所對(duì)應(yīng)的以文件存儲(chǔ)的習(xí)題?4)如何存儲(chǔ)各種文件?采用文本文件、字節(jié)文件?用流式文件或?qū)ο笪募?016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院914.8案例分析與實(shí)踐考慮的設(shè)計(jì)如下。1.隨機(jī)生成多套習(xí)題,保存起來(lái)。2.增加類,完成對(duì)練習(xí)的批改。3.字符文件還是字節(jié)文件?2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院924.8案例分析與實(shí)踐2.一般性建議本章擴(kuò)展了案例程序,特別是使用了文件存儲(chǔ)算式基和習(xí)題。建議學(xué)習(xí)運(yùn)用防御性編程的原則,對(duì)涉及文件的操作,使用異常等處理可能的錯(cuò)誤。如果使用的編程語(yǔ)言支持?jǐn)嘌?,建議在開(kāi)發(fā)期間開(kāi)啟編譯的斷言參數(shù),利用斷言幫助調(diào)試程序,并作為程序文檔。建議選擇性地運(yùn)用基于程序結(jié)構(gòu)的測(cè)試。如果一個(gè)函數(shù)或方法的圈復(fù)雜性大于9,說(shuō)明其內(nèi)聚性較弱,應(yīng)當(dāng)考慮將它細(xì)分。對(duì)圈復(fù)雜性大于5的模塊,建議采用基本路徑覆蓋測(cè)試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院934.8案例分析與實(shí)踐4.8.1批量生成100以內(nèi)的算式的習(xí)題4.8.2批改練習(xí)并存儲(chǔ)4.8.3算式基的構(gòu)造與應(yīng)用2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院944.8.1批量生成100以內(nèi)的算式的習(xí)題2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院954.8.2批改練習(xí)并存儲(chǔ)2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院964.8.3算式基的構(gòu)造與應(yīng)用2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院974.9討論與提高4.9.1應(yīng)用表驅(qū)動(dòng)編程4.9.2使用文件還是數(shù)據(jù)庫(kù)4.9.3契約式編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院984.9.1應(yīng)用表驅(qū)動(dòng)編程1.合并加法基與減法基4.5節(jié)中,加法基AdditionBase[101,101]和減法基SubstractBase[101,101]的二維數(shù)組實(shí)際只用了一半,形成了斜三角形。(1)加法基的對(duì)角線恒等于100。若令i、j分別表示行和列的值,加法基滿足條件:0≤i,j≤100and0≤i+j≤100。(2)減法基的對(duì)角線恒等于0。行、列的值滿足條件:0≤i,j≤100and0≤i?j≤100。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院994.9.1應(yīng)用表驅(qū)動(dòng)編程以第50列為軸,將減法矩陣反轉(zhuǎn),得到:2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1004.9.1應(yīng)用表驅(qū)動(dòng)編程除左下至右上的對(duì)角線,減法與加法基構(gòu)成一個(gè)完整矩陣OperatinBase[101,101]。仍用i和j分別表示行和列的值,減法算式變成:0≤i,j≤100and0≤i?(100?j)≤100,化簡(jiǎn)得:0≤i,j≤100and100≤i+j≤200。最終得到100以內(nèi)的所有加法算式和減法算式,算式基OperatinBase的左上半部三角形是加法算式,右下部三角形是減法算式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1014.9.1應(yīng)用表驅(qū)動(dòng)編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1024.9.1應(yīng)用表驅(qū)動(dòng)編程只要給出滿足0≤i,j≤100的行i和列j,就能從算式基矩陣OperatinBase得出加法或減法的算式:當(dāng)i+j≤100時(shí),在矩陣OperatinBase[i,j]中得到算式i+j;當(dāng)i+j≥100時(shí),在矩陣OperatinBase[i,j]中得到算式i?(100?j);特殊情況:左下至右上的對(duì)角線,加法的i+j恒等于100,減法i?j恒等于0。兩者只能取其一。可以存放加法算式i+j=100。減法是i=100?j,算式恒等于0。2016秋

溫馨提示

  • 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)論