云應(yīng)用系統(tǒng)開發(fā)技術(shù)PPT完整全套教學(xué)課件_第1頁
云應(yīng)用系統(tǒng)開發(fā)技術(shù)PPT完整全套教學(xué)課件_第2頁
云應(yīng)用系統(tǒng)開發(fā)技術(shù)PPT完整全套教學(xué)課件_第3頁
云應(yīng)用系統(tǒng)開發(fā)技術(shù)PPT完整全套教學(xué)課件_第4頁
云應(yīng)用系統(tǒng)開發(fā)技術(shù)PPT完整全套教學(xué)課件_第5頁
已閱讀5頁,還剩200頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

云應(yīng)用系統(tǒng)開發(fā)技術(shù)第1章概述Ch01_概述Ch02_VirtualBox虛擬機(jī)Ch03_云應(yīng)用示例Ch04_分布式版本控制系統(tǒng)GitCh05_自動化測試Ch06_容器(Docker)Ch07_持續(xù)集成、交付、部署Ch08_DevOpsCh09_云平臺內(nèi)容提要第1章概述1.1什么是云計算1.2云計算的優(yōu)點(diǎn)1.3云計算對傳統(tǒng)軟件工程的影響1.4云計算的歷史,現(xiàn)狀與趨勢1.5云計算的核心技術(shù)1.1什么是云計算云計算(CloudComputing)是一種基于虛擬化和互聯(lián)網(wǎng)的計算方式。這種模式提供按需使用,可配置的計算資源共享池——包括網(wǎng)絡(luò)、服務(wù)器、存儲、應(yīng)用軟件和服務(wù)等,只需投入很少的管理工作,就能夠?qū)⑦@些資源快速按需配置,為外界提供服務(wù)。我們所能夠使用的計算資源將不再局限于自己所擁有的物理設(shè)備,還可以通過租用云服務(wù)的方式來滿足我們的計算需求,而且在大多數(shù)情況下更具有成本優(yōu)勢。1.1什么是云計算云計算的服務(wù)模型可分為三種,分別是:IaaS、PaaS

和SaaS●IaaS(InfrastructureasaService,基礎(chǔ)設(shè)施即服務(wù))●PaaS(PlatformasaService,平臺即服務(wù))●SaaS(SoftwareasaService,軟件即服務(wù))自建機(jī)房與云服務(wù)平臺對比1.1什么是云計算云服務(wù)平臺的金字塔模型在云計算的服務(wù)模型中,●基礎(chǔ)設(shè)施即服務(wù)(Infrastructure-as-a-Service,IaaS)在最下端,●平臺即服務(wù)(Platform-as-a-Service,PaaS)在中間,●軟件即服務(wù)(Software-as-a-Service,SaaS)在頂端。它們的復(fù)雜程度和抽象程度,由下往上遞增。1.1什么是云計算-PizzaAsAService1.在家自己做披薩這顯然是自己需要動手最多的方式,而且需要準(zhǔn)備全部的原料和廚具。想要吃上披薩,需要經(jīng)歷發(fā)面、做面團(tuán)、切菜、調(diào)醬、撒料、進(jìn)烤箱、準(zhǔn)備蘇打水和餐桌等眾多步驟。1.1什么是云計算-PizzaAsAService2.買半成品披薩回家做你根本就不會做披薩,但又不想花精力去學(xué)習(xí)如何才能做出好吃的披薩。于是你去超市買一個半成品披薩,只需要放入烤箱,過一會兒便可以享受美味的披薩了。但是這次,你需要一個供應(yīng)商來為你提供這個披薩半成品。圖中的藍(lán)色部分代表需要自己完成的,綠色部分是披薩供應(yīng)商提供的。1.1什么是云計算-PizzaAsAService3.叫外賣你想到一年也許只吃一兩次披薩,而家里又恰巧沒有烤箱,怎么辦?訂外賣吧!這次供應(yīng)商為你省去了所有的制作環(huán)節(jié),還省去了購置烤箱的成本,但具體如何享用這份披薩,還是需要自己來決定。1.1什么是云計算-PizzaAsAService4.去披薩餐廳吃最簡便的方法,還是去披薩餐廳吃吧!你什么都不需要做,甚至用不著收拾桌子和洗盤子,餐廳會為你提供需要的一切。1.1什么是云計算-PizzaAsAService匯總對比如果我們把披薩替換成軟件,將“吃”替換成“使用”。那么我們就不難理解這三種模式所代表的含義了。云計算的存在能夠讓我們忽略很多底層的實現(xiàn)細(xì)節(jié),得到一個更加高效的使用環(huán)境。1.2云計算的優(yōu)點(diǎn)1.規(guī)模大云計算廠商為了能夠向外界提供云服務(wù),其自身必須擁有強(qiáng)大的計算資源。例如亞馬遜的AmazonWebServices(簡稱為AWS),微軟的MicrosoftAzure云服務(wù)背后都有著數(shù)十萬臺服務(wù)器的支持,谷歌(Google)的云計算更擁有多達(dá)百萬級服務(wù)器的計算能力。這種規(guī)模的計算能力是一般企業(yè)單獨(dú)依靠自身能力所不能想象的。2.虛擬化云計算的執(zhí)行過程在云端完成,并不需要確定在某個物理地點(diǎn),用戶可以在任意位置使用任一終端來獲取這一服務(wù),這就實現(xiàn)了我們計算資源的虛擬化。用戶無需了解應(yīng)用運(yùn)行的具體位置就可以通過網(wǎng)絡(luò)獲取強(qiáng)大的計算能力。虛擬化的另一個好處是我們可以基于現(xiàn)有的方案隨時更改遠(yuǎn)端的配置,有利于程序的快速部署。1.2云計算的優(yōu)點(diǎn)3.可靠性高云端的數(shù)據(jù)通常采取多副本容錯、計算節(jié)點(diǎn)同構(gòu)可互換等措施來保障服務(wù)的高可靠性,相對來說使用云計算比使用本地計算機(jī)更加可靠。例如我們本地采取的最常見的備份方式磁盤陣列(RAID),除去價格高昂的問題,如果兩個硬盤(存儲數(shù)據(jù)的和校驗的)同時損壞,數(shù)據(jù)依然會發(fā)生丟失。對比來看,云端的Hadoop集群一般都將同一份數(shù)據(jù)部署在三個不同的機(jī)器上,并周期性檢測機(jī)器的“心跳信號”,如果有機(jī)器出現(xiàn)問題則會自動增加一個備份,使得數(shù)據(jù)丟失的可能性更小。4.通用性強(qiáng)云計算并不針對特定的應(yīng)用,即用戶可以使用強(qiáng)大的計算能力構(gòu)建出千變?nèi)f化的應(yīng)用,并使用同一片云來支撐不用的應(yīng)用運(yùn)行。例如,PaaS只是提供給用戶一個平臺,而在這個平臺上如何進(jìn)行開發(fā),怎樣開發(fā)則完全取決于用戶自身。1.2云計算的優(yōu)點(diǎn)5.節(jié)約成本云計算的服務(wù)是具有彈性的,用戶可以按需動態(tài)調(diào)度虛擬的計算資源,隨用隨棄,不必為了短期的使用高峰去購買額外的服務(wù)器硬件。此外,日常硬件維護(hù)、容錯措施、電力成本等額外開銷,在云服務(wù)上也都不必考慮,在一定程度上能夠節(jié)約開支。1.3云計算對傳統(tǒng)軟件工程的影響1.軟件架構(gòu)的開放性由于云平臺軟件架構(gòu)的開放性,我們可以選擇現(xiàn)在已經(jīng)成熟的構(gòu)建模塊加以復(fù)用,這樣一來能夠縮短程序的開發(fā)時間,二來還能夠減少軟件開發(fā)中的不合理之處,提升軟件的可靠性。2.軟件對象的多樣性在PaaS的平臺中,開發(fā)者有可能寫很少的代碼甚至不需要代碼,而只需按照業(yè)務(wù)流程對平臺中提供的各類資源進(jìn)行組織和配置即可。3.軟件過程的動態(tài)性云計算的存在可以使我們隨時擴(kuò)大計算能力,滿足我們的計算需求。這種軟件過程的動態(tài)性更加方便了軟件開發(fā)。1.3云計算對傳統(tǒng)軟件工程的影響4.開發(fā)組織的社會化云計算依賴網(wǎng)絡(luò)來獲取強(qiáng)大的計算能力,在網(wǎng)絡(luò)環(huán)境下,軟件開發(fā)從封閉的計算機(jī)平臺逐漸走向互聯(lián)、互通、協(xié)作的網(wǎng)絡(luò)平臺環(huán)境。5.資源部署的虛擬化虛擬化有利于我們隨時進(jìn)行資源的擴(kuò)展,更有利于節(jié)省空間和相關(guān)的硬件維護(hù)費(fèi)用。云端的服務(wù)器集群還有利于數(shù)據(jù)的安全,更多的備份可以保障數(shù)據(jù)不容易丟失,這點(diǎn)是本地儲存很難避免的。1.3云計算對傳統(tǒng)軟件工程的影響6.云計算面臨的挑戰(zhàn)雖然云計算有著諸多的優(yōu)點(diǎn),但是它并不是萬能的。在某些場景下,傳統(tǒng)的軟件開發(fā)仍然有著不可替代的地位。●數(shù)據(jù)傳輸?shù)钠款i●數(shù)據(jù)的機(jī)密性●大型分布式系統(tǒng)的弊端1.4云計算歷史,現(xiàn)狀與趨勢前期積累階段:1983年,Sun公司提出“網(wǎng)絡(luò)即計算機(jī)”的概念。云服務(wù)初級階段:此階段以一批公司的成立為標(biāo)志,最著名的為1999年3月Salesforce成立,即SaaS;1999年9月LoudCloud成立,即IaaS。云服務(wù)形成階段:2006年,云概念由Google提出,Amazon推出了彈性計算云服務(wù);2007年8月,Salesforce成為最早的PaaS。云服務(wù)快速發(fā)展階段:云服務(wù)規(guī)模高速成長。云服務(wù)功能日趨完善、種類日趨多樣。云服務(wù)成熟階段:很多科技產(chǎn)品或熱點(diǎn),都在2016年始稱元年。1.4云計算歷史,現(xiàn)狀與趨勢全球公有云的全球市場需求增長趨勢1.4云計算歷史,現(xiàn)狀與趨勢國內(nèi)公有云的國內(nèi)市場需求增長預(yù)測

1.5云計算核心技術(shù)1.虛擬化技術(shù)虛擬化是云計算最重要的核心技術(shù)之一,它為云計算服務(wù)提供基礎(chǔ)架構(gòu)層面的支撐。從技術(shù)上講,虛擬化是一種在軟件中仿真計算機(jī)硬件,以虛擬資源為用戶提供服務(wù)的計算形式。從表現(xiàn)形式上看,虛擬化又分兩種應(yīng)用模式。一是將一臺性能強(qiáng)大的服務(wù)器虛擬成多個獨(dú)立的小服務(wù)器,服務(wù)不同的用戶。二是將多個服務(wù)器虛擬成一個強(qiáng)大的服務(wù)器,完成特定的功能。這兩種模式的核心都是統(tǒng)一管理,動態(tài)分配資源,提高資源利用率。

1.5云計算核心技術(shù)2.分布式數(shù)據(jù)存儲技術(shù)、資源管理分布式存儲與傳統(tǒng)的網(wǎng)絡(luò)存儲并不完全一樣,傳統(tǒng)的網(wǎng)絡(luò)存儲系統(tǒng)采用集中的存儲服務(wù)器存放所有數(shù)據(jù),存儲服務(wù)器成為系統(tǒng)性能的瓶頸,不能滿足大規(guī)模存儲應(yīng)用的需要。分布式網(wǎng)絡(luò)存儲系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺存儲服務(wù)器分擔(dān)存儲負(fù)荷,利用位置服務(wù)器定位存儲信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。在多節(jié)點(diǎn)的并發(fā)執(zhí)行環(huán)境中,各個節(jié)點(diǎn)的狀態(tài)需要同步,并且在單個節(jié)點(diǎn)出現(xiàn)故障時,系統(tǒng)需要有效的機(jī)制保證其它節(jié)點(diǎn)不受影響。分布式資源管理系統(tǒng)是保證系統(tǒng)狀態(tài)穩(wěn)定的關(guān)鍵。

1.5云計算核心技術(shù)3.編程模式分布式并行編程模式創(chuàng)立的初衷是更高效地利用軟、硬件資源,讓用戶更快速、更簡單地使用應(yīng)用或服務(wù)。在分布式并行編程模式中,后臺復(fù)雜的任務(wù)處理和資源調(diào)度對于用戶來說是透明的,這樣用戶體驗?zāi)軌虼蟠筇嵘?。MapReduce是當(dāng)前云計算主流并行編程模式之一。MapReduce模式將任務(wù)自動分成多個子任務(wù),通過Map和Reduce兩步實現(xiàn)任務(wù)在大規(guī)模計算節(jié)點(diǎn)中的分配和匯總。

1.5云計算核心技術(shù)4.大規(guī)模數(shù)據(jù)管理處理海量數(shù)據(jù)是云計算的一大優(yōu)勢。云計算不僅要保證數(shù)據(jù)的存儲和訪問,還要能夠?qū)A繑?shù)據(jù)進(jìn)行特定的檢索和分析。由于云計算需要對海量的分布式數(shù)據(jù)進(jìn)行處理、分析,因此,數(shù)據(jù)管理技術(shù)必需能夠高效的管理大量的數(shù)據(jù)。Google的BT(BigTable)數(shù)據(jù)管理技術(shù)和Hadoop團(tuán)隊開發(fā)的開源數(shù)據(jù)管理模塊HBase是業(yè)界比較典型的大規(guī)模數(shù)據(jù)管理技術(shù)。

1.5云計算核心技術(shù)5.信息安全調(diào)查數(shù)據(jù)表明,安全已經(jīng)成為阻礙云計算發(fā)展的最主要原因之一。要想保證云計算能夠長期穩(wěn)定、快速發(fā)展,安全是首先需要解決的問題?,F(xiàn)在,不管是軟件安全廠商還是硬件安全廠商都在積極研發(fā)云計算安全產(chǎn)品和方案。包括傳統(tǒng)殺毒軟件廠商、軟硬防火墻廠商、IDS/IPS(入侵檢測系統(tǒng)IntrusionDetectionSystems,入侵防御系統(tǒng)IntrusionPreventionSystem)廠商在內(nèi)的各個層面的安全供應(yīng)商都已加入到云安全領(lǐng)域。

1.5云計算核心技術(shù)6.云計算平臺管理云計算系統(tǒng)的平臺管理技術(shù),需要具有高效調(diào)配大量服務(wù)器資源,使其更好協(xié)同工作的能力。其中,方便地部署和開通新業(yè)務(wù)、快速發(fā)現(xiàn)并且恢復(fù)系統(tǒng)故障、通過自動化、智能化手段實現(xiàn)大規(guī)模系統(tǒng)可靠的運(yùn)營是云計算平臺管理技術(shù)的關(guān)鍵。包括Google、IBM、Microsoft、Oracle等在內(nèi)的許多廠商都有云計算平臺管理方案推出。這些方案能夠幫助企業(yè)實現(xiàn)基礎(chǔ)架構(gòu)整合、實現(xiàn)企業(yè)硬件資源和軟件資源的統(tǒng)一管理、統(tǒng)一分配、統(tǒng)一部署、統(tǒng)一監(jiān)控和統(tǒng)一備份,打破應(yīng)用對資源的獨(dú)占,讓企業(yè)云計算平臺價值得以充分發(fā)揮。

1.5云計算核心技術(shù)7.綠色節(jié)能技術(shù)節(jié)能環(huán)保是全球整個時代的大主題。云計算也以低成本、高效率著稱。云計算具有巨大的規(guī)模經(jīng)濟(jì)效益,在提高資源利用效率的同時,節(jié)省了大量能源。綠色節(jié)能技術(shù)已經(jīng)成為云計算必不可少的技術(shù),未來越來越多的節(jié)能技術(shù)還會被引入到云計算中來。報告指出,遷移至云端的美國公司每年可以減少碳排放8570萬噸,這相當(dāng)于2億桶石油所排放出的碳總量。習(xí)題簡述什么是云計算。簡述云計算的服務(wù)模型分類:IaaS、PaaS和SaaS,它們所代表的英文全稱和中文解釋,并舉例現(xiàn)實生活中的一個服務(wù)或應(yīng)用。微軟的Office365、網(wǎng)易云音樂、QQ郵箱、百度網(wǎng)盤、阿里云虛擬主機(jī)、GoogleAppEngine、S這些常見的服務(wù),應(yīng)該歸屬于哪一類(指IaaS、PaaS和SaaS)?云應(yīng)用系統(tǒng)開發(fā)技術(shù)第2章VirtualBox虛擬機(jī)內(nèi)容提要第2章VirtualBox虛擬機(jī)2.1安裝OracleVirtualBox2.2安裝UbuntuServer虛擬機(jī)2.3安裝OpenJDK2.4安裝ApacheMaven2.5安裝Jenkins2.6安裝ApacheTomcat2.1安裝OracleVirtualBox推薦Windows宿主機(jī)器是64位操作系統(tǒng),且內(nèi)存至少8GB以上。1.下載“Windowshosts”和“ExtensionPack”。2.安裝VirtualBox必須有管理員權(quán)限。以默認(rèn)的設(shè)置和安裝路徑,先安裝`VirtualBox-xxx-Win.exe`。安裝過程中會導(dǎo)致暫時的網(wǎng)絡(luò)中斷,且需要重啟Windows宿主機(jī)。3.安裝完成并重新啟動宿主Windows計算機(jī)后,可以看到`Oracle_VM_VirtualBox_Extension_Pack-xxx.vbox-extpack`的圖標(biāo)正常顯示為綠色小盒子,雙擊即可安裝此擴(kuò)展包。注:ExtensionPack必須和VirtualBox安裝相同版本,它包含了很多有用的功能增強(qiáng),是必須安裝的。2.2安裝UbuntuServer虛擬機(jī)1.下載UbuntuServer安裝光盤鏡像文件。請選擇下載標(biāo)記為LTS的版本,它是長期支持(Long-TermSupport)的版本。2.在VirtualBox里創(chuàng)建一個64位Linux類型的虛擬機(jī),取名為“ubuntuvm1”,分配2GB內(nèi)存和80GB硬盤存儲空間。將下載的發(fā)行版ISO文件裝載到光盤驅(qū)動器里。3.網(wǎng)絡(luò)設(shè)置可以選擇“BridgedAdapter”,即虛擬機(jī)的網(wǎng)卡橋接直連網(wǎng)絡(luò),這是最簡單的方式。4.啟動虛擬機(jī),即可開始UbuntuServer的安裝。大多以默認(rèn)的選項安裝,即以默認(rèn)的美國英語安裝,記得勾選“OpenSSHServer”(默認(rèn)是不安裝)。5.將系統(tǒng)更新到最新。6.安裝“VirtualBoxGuestAdditionsCD”。2.3安裝OpenJDK1.Ubuntu18.04服務(wù)器操作系統(tǒng)已經(jīng)自帶了OpenJDK11的JRE。為了保證Ubuntu操作系統(tǒng)的穩(wěn)定性,我們不卸載默認(rèn)安裝的OpenJDK11JRE,只是并行安裝額外的OpenJDK8,修改符號鏈接和環(huán)境變量指向我們想要使用的那個OpenJDK8即可。2.出于商業(yè)使用免費(fèi)的考慮,推薦安裝使用OpenJDK而非OracleJDK。3.安裝完OpenJDK后,將2個環(huán)境變量(`JAVA_HOME`和`JRE_HOME`)設(shè)置成為虛擬機(jī)ubuntuvm1的全局環(huán)境變量。4.安裝完成后,分別用當(dāng)前用戶和root用戶檢查一下。2.4安裝ApacheMaven1.用apt命令從Ubuntu發(fā)行版的軟件倉庫里安裝,推薦用這種方式安裝,最為簡單。2.我們有可能會碰到這樣一種情況,Maven的最新版已經(jīng)發(fā)布了一段時間,但還未加入到Ubuntu發(fā)行版的軟件倉庫里,導(dǎo)致用上面的方式安裝的是舊版。在這種情況下,若希望安裝Maven的最新版本,可以選擇手動安裝。2.5安裝Jenkins1.用apt-get命令從Ubuntu發(fā)行版的軟件倉庫里安裝。安裝完成后,它會自動啟動Jenkins服務(wù)。2.Jenkins默認(rèn)的偵聽端口是8080,通過瀏覽器輸入ubuntuvm1虛擬服務(wù)器地址和8080端口即可訪問。首次訪問需要解鎖,請按屏幕提示操作。3.選擇讓Jenkins加載常用的插件。插件加載完成后,設(shè)置管理員賬號。4.為了避免端口占用沖突,我們將Jenkins的偵聽端口從默認(rèn)的8080改為9090。2.5安裝ApacheTomcat本機(jī)安裝的Tomcat實例主要用于部署Web應(yīng)用程序,作為測試環(huán)境。用當(dāng)前用戶“bobyuan”來安裝和啟動Tomcat,它的安裝路徑選擇在`/usr/local`。1.把安裝包下載,解壓縮到安裝路徑/usr/local/即可,創(chuàng)建符號鏈接/usr/local/apache-tomcat指向真實的安裝路徑,例如這里是/usr/local/apache-tomcat-9.0.21。2.修改當(dāng)前用戶的`~/.profile`,在最后添加“CATALINA_HOME”環(huán)境變量。習(xí)題1/2OracleVirtualBox安裝文件,需要下載和安裝的是哪兩個?UbuntuServer虛擬機(jī)中,怎樣放入光盤鏡像?怎樣彈出光盤?UbuntuServer虛擬機(jī)中,怎樣放入“GuestAdditionsCD”鏡像?怎樣查看已經(jīng)安裝的“GuestAdditions”版本?UbuntuServer虛擬機(jī)中,當(dāng)修改網(wǎng)絡(luò)配置后(例如更改了橋接網(wǎng)絡(luò)),該運(yùn)行什么命令讓網(wǎng)絡(luò)重啟生效?UbuntuServer虛擬機(jī)中,怎樣查看IP地址?重啟、關(guān)機(jī)的命令是什么?在2019年1月之后,為了免費(fèi)在商業(yè)用途中使用JDK,應(yīng)該安裝OpenJDK還是OracleJDK?習(xí)題2/2非長期支持版本的JDK的技術(shù)支持時間一般是多久?ApacheMaven把當(dāng)前用戶的配置文件和jar包保存在哪個文件夾里?Jenkins的默認(rèn)偵聽端口是什么?怎樣修改默認(rèn)的偵聽端口?ApacheTomcat的默認(rèn)偵聽端口是什么?Tomcat自帶的“manager”和“host-manager”兩個Web應(yīng)用程序是用來做什么的?ApacheTomcat的安裝,為什么要設(shè)置CATALINA_HOME而不TOMCAT_HOME?云應(yīng)用系統(tǒng)開發(fā)技術(shù)第3章云應(yīng)用示例內(nèi)容提要第3章云應(yīng)用示例3.1簡單的Web應(yīng)用程序3.2運(yùn)行Web應(yīng)用程序3.1簡單的Web應(yīng)用程序在企業(yè)里,通常業(yè)務(wù)需求是先導(dǎo),綜合考慮技術(shù)、人員等其它因素來確定系統(tǒng)架構(gòu)。例如選擇Java這種業(yè)界主流的Web應(yīng)用程序開發(fā)技術(shù)的好處是:1.技術(shù)成熟。有眾多大企業(yè)商務(wù)關(guān)鍵性應(yīng)用案例,安全穩(wěn)定性有口碑,碰到技術(shù)上無法實現(xiàn)的可能性極小。2.生態(tài)鏈成熟。有眾多的第三方包和開發(fā)調(diào)試工具可以使用;有大量的文檔和書籍可供學(xué)習(xí)參考;碰到了技術(shù)問題很容易通過網(wǎng)絡(luò)搜索到公開的解決方案,或是可以相對容易在社區(qū)和論壇上獲得幫助。3.生命力長。因為有大量商業(yè)應(yīng)用采用此項技術(shù),使得這項技術(shù)在未來很長一段時間不會被淘汰,技術(shù)上能夠持續(xù)積累競爭優(yōu)勢,在此技術(shù)上的投資將獲得相對久遠(yuǎn)的回報。4.人才市場上更容易找到開發(fā)人員,選擇面寬,開發(fā)和維護(hù)的成本較低。3.1簡單的Web應(yīng)用程序沒有“最好”的應(yīng)用程序開發(fā)語言或框架,只有適合應(yīng)用場景的才是最好的。在比較復(fù)雜的企業(yè)級商業(yè)應(yīng)用場景下,還會綜合使用多種程序開發(fā)語言,綜合多個工具和技術(shù)的優(yōu)勢特性來構(gòu)建整個應(yīng)用服務(wù)。技術(shù)選型通常是由項目經(jīng)理和經(jīng)驗豐富的高級技術(shù)人員(如架構(gòu)師)來確定,通常會采用快速原型法,制作一個或多個僅具備基本功能的原型(Prototype),證明技術(shù)可行性,比選后再最終確定技術(shù)路線。3.1簡單的Web應(yīng)用程序本文假定技術(shù)路線已經(jīng)確定,將采用Java

作為這個示例Web應(yīng)用程序的開發(fā)語言,采用SpringMVC作為Web應(yīng)用程序的框架。示例Web應(yīng)用程序CounterWebApp是一個非常簡單的Browser/Server架構(gòu)應(yīng)用程序,它是一個網(wǎng)頁版的計數(shù)器,沒有復(fù)雜的業(yè)務(wù)邏輯。應(yīng)用程序的代碼已經(jīng)托管在GitLab上:/bobyuan/20190224_cloudappdev_code

3.1簡單的Web應(yīng)用程序首先用Maven創(chuàng)建Web應(yīng)用程序的文件結(jié)構(gòu)。添加“.gitignore”文本文件,它的作用是讓Git忽略掉不需要加入版本控制的文件和文件夾。修改“pom.xml”文件,將其內(nèi)容替換。增加/修改Java,XML,JSP等源程序。在Eclipse集成開發(fā)環(huán)境,點(diǎn)選菜單“File|Import...”導(dǎo)入這個項目。按“AddLibrary...”按鈕,添加Web應(yīng)用程序服務(wù)器的API。3.2運(yùn)行Web應(yīng)用程序在EclipseIDE里,我們可以讓這個Web應(yīng)用程序在本地Tomcat應(yīng)用服務(wù)器上運(yùn)行,主要目的是用于代碼開發(fā)過程中的調(diào)試。

如果選擇菜單“Run|DebugAs|DebugonServer”,則可以在調(diào)試模式下將此CounterWebApp發(fā)布到TomcatServer中運(yùn)行。適用于開發(fā)過程中的代碼調(diào)試。直接用Maven來運(yùn)行這個Web應(yīng)用程序,用于測試CounterWebApp是否可以正常工作。習(xí)題簡單列舉選擇主流的開發(fā)技術(shù)的好處?!皃om.xml”文件的用途是什么?該怎樣使用它?“.gitignore”文本文件的用途是什么?它應(yīng)該放在哪兒?Windows中怎樣關(guān)閉資源瀏覽器的“隱藏已知文件類型的擴(kuò)展名”選項?Windows中怎樣創(chuàng)建或保存這種沒有文件名只有擴(kuò)展名的文件(例如“.gitignore”)?“web.xml”文件的用途是什么?它應(yīng)該放在哪兒?云應(yīng)用系統(tǒng)開發(fā)技術(shù)第4章分布式版本控制系統(tǒng)Git內(nèi)容提要第4章分布式版本控制系統(tǒng)Git4.1Git快速入門4.2安裝Git客戶端4.3Git分支模型4.1Git快速入門-安裝以下將以WindowsPro64-bit為平臺,講述Git的安裝,以及常見的基本命令行操作。Windows上安裝Git1.下載并安裝GitForWindows:/downloads

2.安裝TortoiseGit:

/

3.設(shè)置全局配置信息(自己的名字和郵箱)●在命令行方式下設(shè)置●在TortoiseGit對話框中設(shè)置4.1Git快速入門-本地版本庫在本地創(chuàng)建一個文件夾learngit,通過gitinit命令把這個目錄初始化成Git可以管理的版本庫(repository)。為了避免出現(xiàn)一些不必要的麻煩,請注意文件夾路徑不要包含中文,空格等字符?!袼鼘?chuàng)建一個隱藏文件夾“.git”,里面有多個文件,是Git在本地的版本庫?!馟it的版本庫里存了很多東西,其中最重要的就是稱為Stage(或者叫Index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針HEAD?!裉峤坏桨姹編煨枰?步走:先是將文件添加(add)到暫存區(qū),再一并提交(commit)到版本庫里的master分支上。4.1Git快速入門-添加并提交常用命令:●添加文件到暫存區(qū):gitadd<file>●提交到本地版本庫:gitcommit-m"ashortdescription"●查看提交記錄:gitlog●查看當(dāng)前狀態(tài):gitstatus4.1Git快速入門–暫存區(qū)常用命令:●將已經(jīng)添加到暫存區(qū)的文件撤銷。gitresetHEAD<file>●若要將本地文件的修改丟棄,回退到最近一次提交到本地版本庫的樣子。

gitcheckout--<file_name>4.1Git快速入門–刪除與改名常用命令:●將某個文件刪除:gitrm<file>●將某個文件或文件夾移動或改名:gitmv<source><destination>●顯示某個文件的多項信息:gitshow<file>4.1Git快速入門–分支常用命令:●查看分支:gitbranch●創(chuàng)建分支:gitbranch<branch_name>●切換分支:gitcheckout<branch_name>●創(chuàng)建+切換分支:gitcheckout-b<branch_name>●合并某分支到當(dāng)前分支:gitmerge<branch_name>●刪除分支:gitbranch-d<branch_name>4.1Git快速入門–解決沖突常用命令:●合并另一分支到當(dāng)前分支:gitmerge<another_branch_name>●沖突解決后,再次提交:gitcommit-m"ashortdescription"●合并完成后,刪除另一分支:gitbranch-d<another_branch_name>●圖形化顯示提交記錄:gitlog--graph--pretty=oneline--abbrev-commit4.1Git快速入門–遠(yuǎn)程版本庫常用命令:●將遠(yuǎn)程版本庫克隆到本地庫:gitclone<remote_repo_url>●將本地庫的修改推送到遠(yuǎn)程版本庫:gitpush...●將遠(yuǎn)程版本庫同步到本地庫:gitpull4.1Git快速入門–“.gitignore”文件常用命令:●在工作區(qū)內(nèi)添加一個文本文件“.gitignore”,可用來定義不需要版本管理的文件過濾規(guī)則。此“.gitignore”文件本身可被添加到版本庫中?!駨?qiáng)制添加某文件到暫存區(qū),增加一個“-f”選項:gitadd-f<file>●對發(fā)生過濾的文件,檢查生效的過濾規(guī)則:gitcheck-ignore-v<file>“.gitignore”的模板大集合:/github/gitignore

4.2安裝Git客戶端Windows操作系統(tǒng)上安裝TortoiseGit作為客戶端,配合使用GitLab代碼托管服務(wù)。在GitLab上注冊賬號。安裝GitforWindows(網(wǎng)址是https://git-for-windows.github.io/)。已經(jīng)安裝了的可以跳過。安裝TortoiseGit圖形界面,選擇默認(rèn)安裝選項即可。安裝完后,需設(shè)置用戶名和電子郵件。如果沒有密鑰對,可以用Puttygen.exe生成,配置到GitLab上您的賬號里。在GitLab上創(chuàng)建一個測試項目,以驗證一切正常。4.3Git分支模型Git的使用并不難,難點(diǎn)是實際開發(fā)過程中采用的分支模型和發(fā)布管理流程?!兑粋€成功的Git分支開發(fā)模型》是發(fā)表于2010年關(guān)于此內(nèi)容的一篇有影響力的博文,原文請參考AsuccessfulGitbranchingmodel(網(wǎng)址是/posts/a-successful-git-branching-model/),以下將對這篇文章主要內(nèi)容做一詮釋。4.3Git分支模型中心版本庫,它被稱為原始庫(origin)●所有的開發(fā)者都從origin拉取(pull)代碼或者上傳(push)代碼。但是除了向中央倉庫進(jìn)行的push和pull操作外,每個開發(fā)者都有可能從其他同事那里拉取代碼變更,形成子團(tuán)隊。4.3Git分支模型主要分支●中心倉庫有兩個主要分支:master分支和develop分支(也有人將它命名為dev分支),它們貫穿于整個開發(fā)過程的始終?!裎覀儼裲rigin/master作為主要分支,在這個分支上,源代碼的HEAD指針總是指向一個穩(wěn)定的可發(fā)布的版本。也有人稱這個為“集成分支”,它是每晚自動構(gòu)建的代碼來源地?!癞?dāng)develop分支達(dá)了一個穩(wěn)定待發(fā)布狀態(tài)時,所有的代碼變更將合并到master分支,并且打上發(fā)布版本號的標(biāo)簽(Tag)。4.3Git分支模型輔助分支●在master分支和develop分支的基礎(chǔ)上,我們添加了一系列輔助分支來實現(xiàn)平行開發(fā)、新功能特性的開發(fā)、新發(fā)行版本的準(zhǔn)備、以及緊急Bug的快速修復(fù)等實際問題。和主要分支不同的是,這些輔助分支都是臨時的,因為它們在使用完畢后最終都要被刪除?!褫o助分支有三個:feature分支、release分支,和hotfix分支?!衩恳粋€輔助分支都有其特定的目的和用途,再者,對于這些分支是從哪些分支產(chǎn)生且最終合并到哪些分支都有嚴(yán)格的規(guī)定。從技術(shù)角度來說,這些分支都是簡單的Git分支,我們只是通過對它的用途來進(jìn)行分類而已。4.3Git分支模型輔助分支-feature分支可能從哪里分叉:develop最終必須合并到:develop分支命名規(guī)范:除了master、develop、release-*或hotfix-*之外的任何名字●feature分支,有時候被稱為話題分支(topicbranch),是用來為開發(fā)新功能特性所準(zhǔn)備的,可以是近期(即將發(fā)布)或者是遠(yuǎn)期(較為遙遠(yuǎn)的將來發(fā)布)。當(dāng)我們剛開始開發(fā)一個新功能特性時,可能并不知道這個功能特性將要放到哪一個目標(biāo)發(fā)行版本里。只要這個功能特性還在開發(fā),這個feature分支就會一直存在下去,直到最終開發(fā)完成被合并到develop分支上(它將保證這個新功能特性會被加入到下一個發(fā)行版里),或者最終被放棄(這個新功能特性只是一次令人失望的嘗試罷了)?!窳碚堊⒁?,feature分支只存在于開發(fā)者的倉庫里,而不會是在origin里。也就是說,開發(fā)者只在本地創(chuàng)建feature分支,開發(fā)完成之后要么合并到develop分支,要么被丟棄。4.3Git分支模型輔助分支-release分支可能從哪里分叉:develop最終必須合并到:develop和master分支命名規(guī)范:release-*●release分支是用來為一個新發(fā)行版做準(zhǔn)備用的。在這個分支上做最后的細(xì)節(jié)修飾工作,同時也為小Bug的修復(fù),準(zhǔn)備版本號和構(gòu)建日期等留有余地。在release分支上完成這些工作,develop分支可以保持清爽干凈,以便為下一個大版本開發(fā)做好準(zhǔn)備?!駨膁evelop分支分叉出一個新的release分支的恰當(dāng)時機(jī)是當(dāng)develop分支呈現(xiàn)出,或者近乎呈現(xiàn)出一個新發(fā)行版本的理想狀態(tài)時。此時新發(fā)行版本所必須具備的全部功能特性都已經(jīng)被合并到develop分支上了,而為未來發(fā)行版本準(zhǔn)備的功能特性可能不會被合并,它們必須要等到該版本對應(yīng)的release分支被分叉出來時再合并?!裾絼?chuàng)建release分支的時候,將為這個發(fā)行版分配一個版本號。到那個時刻,develop分支將繼續(xù)為下一個發(fā)行版工作,只是并不清楚這“下一個發(fā)行版”最終會是0.3版本還是1.0版本,直到創(chuàng)建那個新的release分支時才能確定??傊?,發(fā)行版本號是在創(chuàng)建release分支時開始確定,并且會隨著版本的更新貫穿項目的始終。4.3Git分支模型輔助分支-hotfix分支可能從哪里分叉:develop最終必須合并到:develop或master分支命名規(guī)范:hotfix-*●在為新發(fā)行版做準(zhǔn)備的角度上,hotfix分支和release分支非常相似,只不過hotfix分支的出現(xiàn)是非計劃的,臨時出現(xiàn)的。當(dāng)生產(chǎn)環(huán)境上的發(fā)行版不理想,或者一個重要的Bug需要緊急修復(fù)時,我們可以從打上了對應(yīng)標(biāo)簽的master分支上分叉出來一個hotfix分支。這個行為的本質(zhì)在于當(dāng)一些成員在進(jìn)行Bug修復(fù)的時候,團(tuán)隊的其他成員基于develop分支的工作還可以繼續(xù),不受打擾。●hotfix分支可以從master分支上創(chuàng)建。比如說,“1.2”版本是目前正在生產(chǎn)環(huán)境中的發(fā)行版,由于一個嚴(yán)重的Bug需要立刻修復(fù)。但是在develop分支上的變化還不是很穩(wěn)定,于是我們將從master分支上分叉出hotfix分支來修復(fù)。當(dāng)我們完成Bug修復(fù)后,這些修改需要被合并到master分支,同時也需要被合并到develop分支,因為我們需要讓接下來的發(fā)行版本也包含這個Bug修復(fù)。這個過程和release分支是非常相似的。4.3Git分支模型完整的分支模型與發(fā)布流程匯總通常情況下:●master和develop兩個分支同時存在?!駇aster分支上始終是最穩(wěn)定的代碼(隨時可以發(fā)布到生產(chǎn)環(huán)境),develop分支是正在開發(fā)的代碼?!駀eature則是某個開發(fā)者為了自己開發(fā)的功能在本地創(chuàng)建的臨時分支。特殊情況下:●develop分支正在開發(fā),如果有突發(fā)情況需要緊急修復(fù)Bug,可以從master上開一個hotfix分支,或者release分支也行,改好之后再分別合并到其他分支。習(xí)題1/2集中式版本控制系統(tǒng)的代表產(chǎn)品有哪些,舉1個例子?分布式式版本控制系統(tǒng)的代表產(chǎn)品有哪些,試舉除Git外的1個例子?分布式版本控制系統(tǒng)和集中式版本控制系統(tǒng)相比,最突出的優(yōu)點(diǎn)有哪些?Git版本倉庫文件夾中有一個隱藏文件夾,它的名字是什么?它存放了什么信息,它的用途是什么?它時什么時候(通過什么命令)創(chuàng)建的?Git全局的配置文件叫什么名字,它保存在哪里?對于單個具體的Git項目,它自有的配置文件(非全局的)叫什么名字,它保存在哪里?習(xí)題2/2對于微軟的Word文檔(*.doc,*.docx)的修改,Git能否自動合并?為什么?對于空文件夾,Git能否記錄入進(jìn)版本倉庫?對于空文件(文件大小為0)呢?采用Git分支模型的意義是什么?在3~5人的小團(tuán)隊中,可以不采用分支模型來開發(fā)嗎?個人開發(fā)呢?Git分支模型中創(chuàng)建的一個持久的分支名稱是?它的用途是什么?Git分支模型中,為什么不建議直接在master分支上開發(fā)?Git分支模型中,當(dāng)生產(chǎn)環(huán)境上的舊版本V1.0發(fā)現(xiàn)一個高優(yōu)先級的Bug,并且需要發(fā)行一個補(bǔ)?。╤otfix)立即修復(fù),該怎樣處理?Git分支模型中,為準(zhǔn)備下一個重大版本V2.0的發(fā)布,該怎樣處理?云應(yīng)用系統(tǒng)開發(fā)技術(shù)第5章自動化測試內(nèi)容提要第5章自動化測試5.1單元測試5.2集成測試5.3測試驅(qū)動開發(fā)5自動化測試軟件測試是發(fā)現(xiàn)軟件錯誤的主要手段,通過測試,發(fā)現(xiàn)軟件缺陷,為軟件產(chǎn)品的質(zhì)量測量和評價提供依據(jù)。最原始的測試是人工測試,將被測試對象視為黑箱(即內(nèi)部的處理過程不可見),給定多組不同邊界條件下的輸入?yún)?shù)和預(yù)期的輸出結(jié)果,與被測試對象的實際輸出結(jié)果相比較,如果一致則測試通過,反之則測試不通過,從而及早發(fā)現(xiàn)軟件缺陷并修復(fù)。根據(jù)國家標(biāo)準(zhǔn)GB/T15532-2008,軟件測試可分為單元測試、集成測試、確認(rèn)測試、系統(tǒng)測試、配置項測試和回歸測試等類別。5自動化測試。W模型5自動化測試●實際工作中,軟件開發(fā)公司的開發(fā)人員將會負(fù)責(zé)做單元測試(UnitTest);●集成測試(IntegrationTest)可能由開發(fā)人員或?qū)iT的測試團(tuán)隊來做(這要看公司在這塊的具體安排,可能不盡相同);●測試團(tuán)隊將會負(fù)責(zé)系統(tǒng)測試(SystemTest);●而接收測試(AcceptanceTest)通常將由甲方或甲方聘用的第三方測試機(jī)構(gòu)來執(zhí)行。5自動化測試實際軟件開發(fā)過程中,常見的測試主要有:單元測試、集成測試、系統(tǒng)測試、接收測試?!裨谲浖l(fā)布之前,需要反復(fù)不斷地做一系列的測試。自動化測試就是把人工測試行為轉(zhuǎn)化為機(jī)器自動執(zhí)行的一個過程。●自動化測試與軟件開發(fā)過程從本質(zhì)上來講是一樣的,無非是利用自動化測試工具(對應(yīng)于軟件開發(fā)工具),經(jīng)過對測試需求的分析(對應(yīng)于軟件過程中的需求分析),設(shè)計出自動化測試用例(對應(yīng)于軟件過程中的需求規(guī)格),從而搭建自動化測試的框架(對應(yīng)于軟件過程中的概要設(shè)計),設(shè)計與編寫自動化腳本(對應(yīng)于詳細(xì)設(shè)計與編碼),測試腳本的正確性,從而完成該套測試腳本(即主要功能為測試的應(yīng)用軟件)。5自動化測試是否適合使用自動化測試?需求變動不頻繁。項目周期足夠長。自動化測試腳本可重復(fù)使用。手工測試無法完成。5自動化測試自動化測試金字塔●單元測試、集成測試主要是以驗證功能為目的,最適合自動化。●而系統(tǒng)測試和接收測試處于模糊區(qū)間,可視情況而定。例如系統(tǒng)測試中的性能測試,如果頻繁執(zhí)行,也可以將它自動化,反之,如果只有大版本發(fā)布時執(zhí)行一次(次數(shù)間隔可能按年計算),則完全可以手動執(zhí)行。5自動化測試來自實際工作中總結(jié)的一些建議●開發(fā)人員負(fù)責(zé)功能模塊的實現(xiàn)代碼與對應(yīng)的單元測試代碼,它們必須同時提交才能算完成此項開發(fā)任務(wù)。與此同時,編碼風(fēng)格和注釋等都應(yīng)當(dāng)達(dá)到質(zhì)量標(biāo)準(zhǔn),要求嚴(yán)格的還將經(jīng)過人工的同行評審(Peerreview)?!駟卧獪y試的代碼量和被測模塊的代碼量大體相當(dāng),有時還會更多。單元測試要完備需要考慮多種情況,例如正常情況下的上邊界、中值、下邊界,以及非正常(即發(fā)生異常,各種可能發(fā)生的錯誤)情況?!駵y試案例要考慮完備各種情況,除了預(yù)期內(nèi)的典型正常值輸入外,還應(yīng)當(dāng)包括邊界值、特殊值、空(Null)、非法值、預(yù)期發(fā)生異常的值等。除了考慮正常情況下運(yùn)行,還應(yīng)當(dāng)根據(jù)設(shè)計需求,考慮數(shù)據(jù)庫連接中斷、網(wǎng)絡(luò)中斷、甚至斷電等意外情況?!駵y試覆蓋率不必追求100%,對于重點(diǎn)部分可以要求高些,可視實際情況而定。測試的投入如同開發(fā)一樣都是研發(fā)成本,它隨著測試覆蓋率的升高,也會收益遞減。●每次修復(fù)一個Bug,應(yīng)該在測試案例中增加對應(yīng)的測試,在回歸測試中執(zhí)行這些測試案例,以便保證此修復(fù)在后續(xù)的版本中都能夠正常工作。5.1單元測試代碼實現(xiàn)

單元測試案例

單元測試的一個例子:5.1單元測試單元測試的覆蓋

率5.1單元測試在本書配套的單元測試示例代碼“UnitTestExample1”中,“IntOperations.java”的第一版實現(xiàn)。其中靜態(tài)方法是getName(),類成員方法有add()、subtract()和average()。代碼實現(xiàn)有一個問題,在哪?packagecom.example.math;publicclassIntOperations{ publicstaticfinalStringgetName(){ return"IntOperations"; }

publicintadd(inta,intb){ returna+b; } publicintsubtract(inta,intb){ returna-b; }

publicdoubleaverage(inta,intb){ return(a+b)/2.0; }}5.1單元測試它們的測試代碼節(jié)選如下,請留意其中測試average()方法為了測試邊界值時對Integer.MIN_VALUE和Integer.MAX_VALUE的使用。publicclassIntOperationsTestextendsTestCase{ publicvoidtest_average(){ IntOperationsio=newIntOperations(); Assert.assertEquals(0.0,io.average(0,0)); Assert.assertEquals(2.0,io.average(1,3)); Assert.assertEquals(2.5,io.average(2,3));

Assert.assertEquals(Integer.MIN_VALUE/2.0,io.average(Integer.MIN_VALUE,0)); Assert.assertEquals(Integer.MIN_VALUE/2.0,io.average(0,Integer.MIN_VALUE)); Assert.assertEquals(Integer.MAX_VALUE/2.0,io.average(Integer.MAX_VALUE,0)); Assert.assertEquals(Integer.MAX_VALUE/2.0,io.average(0,Integer.MAX_VALUE));

Assert.assertEquals(Integer.MIN_VALUE+0.0,io.average(Integer.MIN_VALUE,Integer.MIN_VALUE)); Assert.assertEquals(Integer.MAX_VALUE+0.0,io.average(Integer.MAX_VALUE,Integer.MAX_VALUE)); }}5.1單元測試運(yùn)行上述單元測試,不通過!經(jīng)調(diào)查發(fā)現(xiàn),原因在于add()方法的第一版實現(xiàn)中,先將a和b求和,而輸入?yún)?shù)a和b又同時可能是整型變量(int)最大或者最小值(代碼中有對最大和最小值具體數(shù)值的注釋),導(dǎo)致溢出。于是我們修改了實現(xiàn)為:publicclassIntOperations{ publicdoubleaverage(inta,intb){

//return(a+b)/2.0;//maycauseoverflow! return(a/2.0)+(b/2.0); }}新版的實現(xiàn)代碼先將兩個輸入?yún)?shù)分別除以2.0后再相加,這樣避免了先相加導(dǎo)致溢出情況的發(fā)生,測試終于通過了。5.1單元測試以上案例說明,在實際開發(fā)過程中,理論上任何編寫的代碼都不要想當(dāng)然地認(rèn)為它能正常工作,一定要經(jīng)過測試才能確保其正常運(yùn)行。不要過分依賴于人的感覺,人總是會犯錯誤的,只有通過測試,我們才能對代碼的功能更有信心。5.1單元測試單元測試中常用的技術(shù)還有Mock測試,適用于被測試代碼有依賴的情況下,這在面向?qū)ο蟮某绦蛟O(shè)計中很常見。比如,我們的支付業(yè)務(wù)調(diào)用了第三方的支付平臺,為了測試支付業(yè)務(wù)的功能正確性,我們必須對它進(jìn)行測試,但同時我們又不想測試的時候去真正調(diào)用第三方的支付平臺產(chǎn)生實際的支付。在這樣的情況下,Mock技術(shù)顯得非常有用。在本書配套的單元測試示例代碼“UnitTestExample2”中,有一個用Junit4編寫的相對完整的測試樣例,它使用功能強(qiáng)大的第三方包JMockit)。用Mock技術(shù)的第三方包有許多,關(guān)于選擇誰也有很多不同的見解,它們是技術(shù)實現(xiàn)不同而背后的理念都是一樣的。本書的例子“UnitTestExample2”中選用的是JMockit。5.1單元測試DBHelper類是一個訪問數(shù)據(jù)庫的API集合,其中有一個函數(shù)getUserNameById(),它根據(jù)輸入的user_id到數(shù)據(jù)庫里把對應(yīng)的用戶名字拿出來。publicclassDBHelper{ publicStringgetUserNameById(Stringuser_id){ StringsUserName=""; //ConnecttoDBandlookup//theusernamebygivenID. returnsUserName; }}5.1單元測試以下這個Greeting類,它依賴于DBHelper,在greetById()方法中,它使用了DBHelper中的getUserNameById()方法,在返回的用戶名前面加上問候語“Goodday!”,返回一個字符串。publicclassGreeting{ privateDBHelperdbh=null;

publicGreeting(DBHelperdbh){ this.dbh=dbh; }

publicStringgreetById(Stringuser_id){ StringsUserName=dbh.getUserNameById(user_id); return"Goodday!"+sUserName+"."; }}5.1單元測試用JMockit寫的測試代碼如下,請注意“dbh”這個是用JMock模擬的“假”對象。在測試案例test_greetById()中,這個被Mock的DBHelper對象dbh先被設(shè)置了3個模擬的輸入?yún)?shù)與返回值,即讓它在這幾種輸入?yún)?shù)的情況下,返回指定的返回值。然后用這個dbh來創(chuàng)建我們的被測對象Greeting類。publicclassGreetingTest{ @Mocked DBHelperdbh;//mocktoDBHelper,noneedtoinitialize. @Test publicvoidtest_greetById(){

//preparethemockedobject. newExpectations(){{ dbh.getUserNameById("001");result="Tom"; dbh.getUserNameById("002");result="Mike"; dbh.getUserNameById("003");result="John"; }};

//usethemockedobjecttocreatethetestingclass. Greetinggt=newGreeting(dbh);

//下面還有代碼。。。 }}

//performthetests... Assert.assertEquals("Goodday!Tom.",gt.greetById("001")); Assert.assertEquals("Goodday!Mike.",gt.greetById("002")); Assert.assertEquals("Goodday!John.",gt.greetById("003")); Assert.assertEquals("Goodday!Mike.",gt.greetById("002"));

//verifythemockedinstancebeencalled. newVerifications(){{ gt.greetById("001");times=1; gt.greetById("002");times=2; gt.greetById("003");times=1; }};5.1單元測試測試將只能以上述設(shè)定的幾個指定輸入?yún)?shù)進(jìn)行,測試完成后,還可以驗證一下這個dbh被調(diào)用的次數(shù)。5.1單元測試使用JMockit需要在“VMarguments”里新增加的一行參數(shù)。5.1單元測試運(yùn)行后,單元測試覆蓋率顯示如圖。在并未調(diào)用真實的DBHelper對象的情況下(測試覆蓋率為0.0%),我們已經(jīng)測試了Greeting類(測試覆蓋率為100.0%)。5.1單元測試●單元測試是開發(fā)人員的基本功,和編寫業(yè)務(wù)代碼一樣重要?!翊a量越大,復(fù)雜度越高,越能體現(xiàn)出單元測試的重要性。●單元測試保證了基本功能模塊的正確性,為構(gòu)建穩(wěn)定可靠的商業(yè)應(yīng)用打下了堅實的基礎(chǔ),它是不可或缺的,怎么強(qiáng)調(diào)其重要性都不過分。5.2集成測試更復(fù)雜的自動化測試,用于集成測試方面,包括:●與上下游集成的測試案例。●兼容性測試案例。●網(wǎng)頁相關(guān)的測試案例。由于集成測試的復(fù)雜度高,在大企業(yè)里,集成測試以及更深入的系統(tǒng)測試(如性能測試)一般由專門的測試團(tuán)隊完成。5.3測試驅(qū)動開發(fā)測試驅(qū)動開發(fā),英文全稱Test-DrivenDevelopment,簡稱TDD。傳統(tǒng)軟件開發(fā)流程是先開發(fā)再測試,而測試驅(qū)動開發(fā)則要求在編寫實現(xiàn)某個功能之前先編寫測試案例的代碼,然后只編寫使測試通過的功能代碼(即最小化實現(xiàn)),通過測試來推動整個開發(fā)的進(jìn)行。這有助于編寫簡潔可用和高質(zhì)量的代碼,并加速開發(fā)過程。5.3測試驅(qū)動開發(fā)基本過程如下:●新增一個單元測試案例,從需求角度清晰定義待實現(xiàn)功能的輸入?yún)?shù)和預(yù)期輸出結(jié)果?!襁\(yùn)行所有的單元測試(有時候只需要運(yùn)行一個或一部分),發(fā)現(xiàn)新增的單元測試不能通過(甚至不能編譯)。通常在集成開發(fā)環(huán)境上測試執(zhí)行后顯示紅色,表示不通過?!窨焖倬帉憣崿F(xiàn)代碼,盡快地讓單元測試可運(yùn)行通過,為此可以在程序中使用一些不合情理的“快捷”實現(xiàn)方法。通常在集成開發(fā)環(huán)境上測試執(zhí)行后顯示綠色,表示通過?!翊a重構(gòu)(Refactoring)。在所有單元測試全部通過的前提下,優(yōu)化代碼的設(shè)計實現(xiàn)。5.3測試驅(qū)動開發(fā)簡單來說,測試驅(qū)動開發(fā)就是測試不通過,再測試通過,再重構(gòu)的開發(fā)過程?!駵y試驅(qū)動開發(fā)的特征是,測試驅(qū)動開發(fā)中需求分析和詳細(xì)設(shè)計的范疇,都體現(xiàn)在測試案例中,并且這些測試案例已成為單元測試的一個部分。●只要測試案例通過,我們就可以放心大膽地修改代碼實現(xiàn),而不會影響調(diào)用方的功能?!駵y試案例還兼具文檔的作用,在原開發(fā)人員離職的情形下,越發(fā)能凸顯其重要性。習(xí)題1/2單元測試的意義是什么?為什么要強(qiáng)調(diào)它的重要性?單元測試為什么讓開發(fā)人員來做,而不建議讓其他的測試人員來做?單元測試是否必須要求100%的覆蓋率?是否覆蓋率越高越好?對于涉及圖形界面的業(yè)務(wù)邏輯,因不便于自動化測試,我們該怎樣充分進(jìn)行單元測試呢?單元測試主要是用來進(jìn)行功能正確性與否的測試,但它能否用來測試模塊的性能?穩(wěn)定性?開發(fā)人員在代碼實現(xiàn)過程中,如何讓實現(xiàn)代碼有足夠好的可測性?對于私有的方法(private),是否需要單元測試?若需要,怎么進(jìn)行單元測試?習(xí)題2/2對于3~5人的小團(tuán)隊,集成測試可以讓開發(fā)人員來做嗎?系統(tǒng)測試呢?接收測試呢?在項目交付的前期,項目團(tuán)隊欲進(jìn)行整體的性能和穩(wěn)定性測試,這項工作應(yīng)該由什么角色來進(jìn)行,且它被稱為什么測試呢?回歸測試是什么意思?它要解決的是什么問題?怎樣保證本次修復(fù)的Bug在今后的版本中都能正常工作?測試驅(qū)動開發(fā)為什么要先寫測試案例?它的好處是什么?測試驅(qū)動開發(fā)是否也有缺點(diǎn)?試根據(jù)你的理解舉例說明。云應(yīng)用系統(tǒng)開發(fā)技術(shù)第6章容器(Docker)內(nèi)容提要第6章容器(Docker)6.1Docker原理6.2安裝Docker6.3使用Docker6.4運(yùn)行Docker6.5生成Docker鏡像6容器(Docker)Docker(網(wǎng)址是/)是一個開源項目,誕生于2013年3月份,最初是dotCloud公司內(nèi)部的一個業(yè)余項目。它基于Google公司推出的Go語言實現(xiàn)。項目后來加入Linux基金會,遵從Apache2.0協(xié)議。Linux容器不是模擬一個完整的操作系統(tǒng),而是對進(jìn)程進(jìn)行隔離。換句話說,是在正常進(jìn)程的外面套了一個保護(hù)層。對于容器里面的進(jìn)程來說,它接觸到的各種資源都是虛擬的,從而實現(xiàn)與底層操作系統(tǒng)的隔離。6容器(Docker)6容器(Docker)6容器(Docker)Docker達(dá)到了類似虛擬機(jī)的效果,但是又沒有虛擬機(jī)的開銷。Docker僅僅虛擬應(yīng)用的運(yùn)行環(huán)境。Docker是一款針對程序開發(fā)人員和系統(tǒng)管理員來開發(fā)、部署、運(yùn)行應(yīng)用的一款虛擬化平臺。Docker通過對應(yīng)用程序的封裝、分發(fā)、部署、運(yùn)行等生命周期的管理,達(dá)到應(yīng)用程序使用級別的“一次封裝,到處運(yùn)行”(buildonce,configureonceandrunanywhere)。Docker可以讓我們像使用標(biāo)準(zhǔn)集裝箱一樣,盡可能的屏蔽內(nèi)部實現(xiàn)細(xì)節(jié),從而快速地部署和集成應(yīng)用,縮短軟件產(chǎn)品從測試到正式上線的時間。6.1Docker原理●Docker容器的實質(zhì)就是一個虛擬環(huán)境,容器內(nèi)包含單一應(yīng)用程序和它所需的全部依賴環(huán)境,相當(dāng)于最小化的虛擬機(jī)。只有容器預(yù)先設(shè)置好的端口和存儲卷才能與外界環(huán)境通信,除此之外,對外界而言容器就是一個黑箱?!馜ocker的部署較簡單,容器從鏡像創(chuàng)建,而鏡像內(nèi)包含所需的全部依賴環(huán)境,做到了一個鏡像直接部署,不再需要修改服務(wù)器的系統(tǒng)配置?!馜ocker鏡像(Image)是無狀態(tài)的,而容器(Container)是有狀態(tài)的,容器在運(yùn)行時生成的數(shù)據(jù)是被保存在容器內(nèi)的,當(dāng)整個容器被刪除時也會跟著被刪除。如果生成的文件包含重要資料,則需要把對應(yīng)生成的目錄指向宿主機(jī)目錄或者數(shù)據(jù)卷容器?!馜ocker的每個容器只運(yùn)行單一應(yīng)用,完成最基本的服務(wù)。要實現(xiàn)一個產(chǎn)品功能,往往需要多個基本服務(wù)共同協(xié)作完成。6.1Docker原理Docker的運(yùn)行涉及到3個基本組件:●一個運(yùn)行docker命令的客戶端(DockerClient)●一個以容器(DockerContainer)形式運(yùn)行鏡像(DockerImage)的主機(jī)(DockerHost)●一個鏡像(DockerImage)的倉庫(Registry)6.1Docker原理Docker使用以下操作系統(tǒng)的功能來提高容器技術(shù)效率:●Namespaces充當(dāng)隔離的第一級。確保一個容器中運(yùn)行一個進(jìn)程而且不能看到或影響容器外的其它進(jìn)程?!馛ontrolGroups是LXC的重要組成部分,具有資源核算與限制的關(guān)鍵功能。●UnionFS文件系統(tǒng)作為容器的構(gòu)建塊。為了支持Docker的輕量級以及速度快的特性,它創(chuàng)建了用戶層。利用Docker來運(yùn)行任何應(yīng)用程序,需要兩個步驟:●構(gòu)建一個鏡像;●運(yùn)行容器。6.1Docker原理第1步:構(gòu)建鏡像鏡像是一個構(gòu)建容器的只讀模板,它包含了容器啟動所需的所有信息,包括運(yùn)行程序和配置數(shù)據(jù)。每個鏡像都源自于一個基本鏡像(BaseImage),然后根據(jù)Dockerfile中的指令創(chuàng)建,對于每個指令,在鏡像上創(chuàng)建一個新的層面。6.1Docker原理第2步:運(yùn)行容器我們把在第一步中創(chuàng)建的鏡像在容器(DockerContainer)上運(yùn)行。當(dāng)容器被啟動后,一個讀寫層會被添加到鏡像的頂層。當(dāng)被分配到合適的網(wǎng)絡(luò)和IP地址后,應(yīng)用程序就可以在容器中正常運(yùn)行了?!馜ocker希望我們將每個應(yīng)用獨(dú)立打包成一個容器,每個容器都是一個黑盒,它們之間通過內(nèi)部網(wǎng)絡(luò)互相訪問和集成?!窆芾沓汕先f的復(fù)雜容器集群時要使用到DockerSwarm或者Kubernetes?!馜ocker的整個架構(gòu)設(shè)計是建立在運(yùn)行單個程序的容器上的。Docker不推薦將多個應(yīng)用打包到一個容器里面。6.2安裝DockerDocker是一個開源的商業(yè)產(chǎn)品,有兩個版本:社區(qū)版(CommunityEdition,縮寫為CE)和企業(yè)版(EnterpriseEdition,縮寫為EE)。社區(qū)版是免費(fèi)的,企業(yè)版包含了一些收費(fèi)服務(wù),個人開發(fā)者一般用不到。下面的介紹僅針對社區(qū)版。在UbuntuServer虛擬機(jī)“ubuntuvm1”上安裝和運(yùn)行Docker。具體安裝步驟此處從略。6.3

使用Docker一些Docker常見的基礎(chǔ)命令。●打印幫助●打印“run”命令的幫助●顯示Docker版本號●顯示Docker系統(tǒng)信息●列出運(yùn)行中的容器●列出全部容器,包括已經(jīng)停止的#printhelpinformation.dockerhelp#printhelpinformationfor"run"command.dockerrun--help#showtheDockerversioninformation.dockerversion#displaysystem-wideinformation.dockerinfo#listrunningcontainers.dockerps#listallcontainers,includingstoppedones.dockerps--all6.3

使用Docker簡單的例子運(yùn)行BusyBox鏡像。BusyBox是一個最小的Linux系統(tǒng)鏡像,它提供了該系統(tǒng)的主要功能,不包含一些與GNU相關(guān)的功能和選項?!裎覀兿韧ㄟ^pull命令將這個鏡像下載到本地●在BusyBox里調(diào)用/bin/echo命令輸出“HelloDocker”字符串bobyuan@ubuntuvm1:~$dockerpullbusyboxUsingdefaulttag:latestlatest:Pullingfromlibrary/busybox75a0e65efd51:PullcompleteDigest:sha256:d21b79794850b4b15d8d332b451d95351d14c951542942a816eea69c9e04b240Status:Downloadednewerimageforbusybox:latestbobyuan@ubuntuvm1:~$dockerrunbusybox/bin/echoHelloDockerHelloDocker6.3

使用DockerDocker使用鏡像文件生成容器實例,容器實例本身也是一個文件,稱為容器文件。也就是說,一旦容器生成,就會同時存在兩個文件:鏡像文件和容器文件。關(guān)閉容器并不會刪除容器文件,只是容器停止運(yùn)行而已?!駷榱肆谐鲆呀?jīng)停止的容器,我們必須用dockerps--all命令●終止運(yùn)行的容器文件,依然會占據(jù)硬盤空間。為了清理干凈,我們可以刪除這個容器#findthecontainer,itshouldbestopped.bobyuan@ubuntuvm1:~$dockerps--allCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESefde27b6c4d5busybox"/bin/echoHelloDoc…"6secondsagoExited(0)5secondsagohappy_bassi#removethealreadystoppedcontainerbyitsID.bobyuan@ubuntuvm1:~$dockerrmefde27b6c4d5efde27b6c4d56.3

使用Docker常用Docker命令-1/31.如果要運(yùn)行一個已經(jīng)停止的容器。2.如果要進(jìn)入一個正在運(yùn)行的容器。3.如果要查看運(yùn)行的容器里面的進(jìn)程信息。4.如果要?dú)⑺喇?dāng)前正在運(yùn)行的容器。對于那些不會自動終止的容器,可以使用kill命令手動終止。#1.startthealreadystoppedcontainer,attachandinteractive.dockerstart-ai<container>#2.launchtheBashshellintothecontainer.dockerexec-it<container>/bin/bash#3.displaytherunningprocessesofacontainerdockertop<container>#4.killspecifiedcontainer.dockerkill<container>#killallrunningcontainers.dockerkill$(dockerps-q)6.3

使用Docker常用Docker命令-2/35.如果要刪除容器。注意必須先停止后再刪除。6.如果要刪除本地鏡像。#5.removespecifiedcontainer.dockerrm<container>#removeallrunningcontainers(killbeforeremove).dockerrm$(dockerps-a-q)#6.removespecifiedimage.dockerrmi<image>#removeal

溫馨提示

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

評論

0/150

提交評論