軟件概念軟件(Software)是一系列按照特定順序組織的計算機數(shù)據(jù)和指令的集合。一般來講,軟件被劃分為系統(tǒng)軟件、應(yīng)用軟件和介于這兩者之間的中間件。在國標(biāo)中對軟件的定義是與計算機系統(tǒng)操作有關(guān)的計算機程序、規(guī)程、規(guī)則以及可能有的文件、文檔及數(shù)據(jù)等。軟件生命周期生命周期(Life Cycle)的概念應(yīng)用很廣泛,簡單說就是指一個對象的“生老病死”。對一個軟件產(chǎn)品或軟件系統(tǒng)而言也需要經(jīng)歷同樣階段,一般稱為軟件生命周期。軟件生命周期大致分為六個階段項目計劃階段此階段主要是確定軟件開發(fā)的總體目標(biāo),通過市場調(diào)研并給出功能、性能、接口等方面的設(shè)想以及項目的可行性分析,同時對項目開發(fā)使用的資源、成本、進(jìn)度做出評估,制定項目實施的計劃(項目一級計劃)。需求分析階段需求俗稱軟件的主體,所以需求分析階段作為一個非常重要的階段,它由需求分析人員和用戶共同對軟件需要實現(xiàn)的各個功能進(jìn)行詳細(xì)的分析并給予確切的描述,并編寫軟件需求說明書(Software Requirements Specification,簡稱SRS)。軟件設(shè)計階段該階段俗稱軟件的核心,主要是由系統(tǒng)分析組(架構(gòu)師和系統(tǒng)分析人員)根據(jù)需求分析的結(jié)果,對整個軟件進(jìn)行系統(tǒng)架構(gòu)的設(shè)計,編寫概要設(shè)計說明書(High Level Design,簡稱HLD)。接下來由數(shù)據(jù)庫設(shè)計員和開發(fā)人員根據(jù)需求說明書和概要設(shè)計說明書進(jìn)行系統(tǒng)數(shù)據(jù)庫設(shè)計以及編寫詳細(xì)設(shè)計說明書(Low LevelDesign,簡稱LLD)。程序編碼階段把軟件設(shè)計的結(jié)果轉(zhuǎn)換為計算機可運行的程序代碼,使用RDBMS工具建立數(shù)據(jù)庫。程序編碼必須符合標(biāo)準(zhǔn)和編碼規(guī)范,以保證程序的可讀性、易維護(hù)性,保證程序運行的效率。軟件測試階段此階段主要是測試人員來檢測軟件是否符合客戶的需求,是否達(dá)到質(zhì)量的要求。一般在軟件設(shè)計完成后,項目開發(fā)人員構(gòu)建測試版本,以便測試團(tuán)隊進(jìn)行測試,整個測試過程大致分為:單元測試、集成測試、系統(tǒng)測試、驗收測試。運行與維護(hù)階段此階段是軟件生命周期中最長的階段。在軟件開發(fā)完成并正式投入使用后,可能有很多原因需要對軟件進(jìn)行修改,如軟件錯誤、系統(tǒng)升級、增加功能、提高性能等。軟件體系結(jié)構(gòu)什么是C/S結(jié)構(gòu)C/S(Client/Server)結(jié)構(gòu)即客戶端/服務(wù)器結(jié)構(gòu)??蛻舳送ǔ?梢岳斫鉃榘惭b在PC、手機終端設(shè)備上的軟件,是軟件系統(tǒng)體系結(jié)構(gòu)的一種。比如:QQ軟件、手機APP等,C/S模式簡單地講就是基于企業(yè)內(nèi)部網(wǎng)絡(luò)的應(yīng)用系統(tǒng)。與B/S(Browser/Server,瀏覽器/服務(wù)器)模式相比,C/S模式的應(yīng)用系統(tǒng)最大的好處是不依賴企業(yè)外網(wǎng)環(huán)境,即無論企業(yè)是否能夠上網(wǎng),都不影響應(yīng)用。還有一類通信的軟件,比如:百度云盤、迅雷下載等,也屬于C/S結(jié)構(gòu)。但是它們之間的數(shù)據(jù)傳輸不需要經(jīng)過服務(wù)器處理業(yè)務(wù),可以直接通過客戶端進(jìn)行傳輸,這種結(jié)構(gòu)通常稱為P2P(Peer to Peer)點對點結(jié)構(gòu)。P2P是可以簡單的定義成通過直接交換來共享計算機資源和服務(wù),而對等計算模型應(yīng)用層形成的網(wǎng)絡(luò)通常稱為對等網(wǎng)絡(luò)。對等網(wǎng)絡(luò),即對等計算機網(wǎng)絡(luò),是一種在對等者(Peer)之間分配任務(wù)和工作負(fù)載的分布式應(yīng)用架構(gòu),是對等計算模型在應(yīng)用層形成的一種組網(wǎng)或網(wǎng)絡(luò)形式。什么是B/S結(jié)構(gòu)B/S(Brower/Server)結(jié)構(gòu)即瀏覽器/服務(wù)器結(jié)構(gòu)。隨著Internet技術(shù)的興起,對C/S結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。在這種結(jié)構(gòu)下,用戶工作界面是通過瀏覽器來實現(xiàn),極少部分事務(wù)通過邏輯在前端(Browser)實現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端(Server)實現(xiàn),形成所謂三層3-tier結(jié)構(gòu)。B/S是目前互聯(lián)網(wǎng)中應(yīng)用最為廣泛的系統(tǒng)結(jié)構(gòu)。B/S結(jié)構(gòu)比起C/S結(jié)構(gòu)有著很大的優(yōu)越性,傳統(tǒng)的MIS系統(tǒng)依賴于專門的操作環(huán)境,這意味著操作者的活動空間受到極大限制;而B/S結(jié)構(gòu)則不需要專門的操作環(huán)境,在任何地方,只要能上網(wǎng),就能夠操作MIS系統(tǒng),這其中的優(yōu)劣差別是不言而喻的。軟件測試基本概念測試(Test)就是為檢測特定的目標(biāo)是否符合標(biāo)準(zhǔn)而采用專用的工具或者方法進(jìn)行驗證,并最終得出特定的結(jié)果。軟件測試(Software Testing)伴隨著軟件的誕生而產(chǎn)生。對軟件而言,軟件測試就是在有限的時間內(nèi)提高軟件質(zhì)量的保證,是軟件開發(fā)過程中非常重要的一部分。軟件測試發(fā)展迄今為止,軟件測試的發(fā)展一共經(jīng)歷了五個重要時期:以調(diào)試為主早在20世紀(jì)50年代,計算機剛誕生不久,只有科學(xué)家級別的人才會去編程,需求和程序本身也遠(yuǎn)遠(yuǎn)沒有現(xiàn)在這么復(fù)雜多變,相當(dāng)于編程人員承擔(dān)需求分析、設(shè)計、開發(fā)、測試等所有工作,當(dāng)然也不會有人去區(qū)分調(diào)試和測試。然而有些比較嚴(yán)謹(jǐn)?shù)目茖W(xué)家們已經(jīng)在開始思考“怎么知道程序滿足了需求?”這類問題了。以證明為主在1957年,在《軟件測試發(fā)展》(作者Charles Baker)一書中強調(diào)了調(diào)試和測試區(qū)分:1)調(diào)試(Debug),確保程序做了程序員想讓它做的事情。2)測試(Testing),確保程序解決了它該解決的問題。這也是軟件測試史上一個重要的里程碑,它標(biāo)志軟件測試終于自立門戶了。隨著計算機應(yīng)用的數(shù)量,成本和復(fù)雜性都大幅度提升,其經(jīng)濟(jì)風(fēng)險也大大增加,測試就顯得很有必要了,這個時期測試的主要目就是確認(rèn)軟件是滿足需求的,也就是我們常說的“做了該做的事情”。以破壞為主在1979年,測試界的經(jīng)典之作《軟件測試之藝術(shù)》(作者C.J.Myers)一書中給出了軟件測試的經(jīng)典定義:測試是為發(fā)現(xiàn)錯誤而執(zhí)行程序的過程。這個觀點較之前證明為主的思路,是一個很大的進(jìn)步。我們不僅要證明軟件做了該做的事情,也要保證它沒做不該做的事情,這會使測試更加全面,更容易發(fā)現(xiàn)問題。在書中,Myers還指出兩點:好的測試用例是發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯誤的測試用例;成功的測試執(zhí)行是發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯誤的測試執(zhí)行。相對于“程序測試就是證明程序中不存在錯誤的過程”而言,Myers的定義是對的,但定義的測試范圍過窄。以評估為主在1983年,美國國家標(biāo)準(zhǔn)局提出了測試界很有名的兩個名詞:驗證(Verification)和確認(rèn)(Validation),也就是我們常說的V&V理論。人們提出了在軟件生命周期中使用分析、評審、測試來評估產(chǎn)品的理論。軟件測試工程在這個時期得到了快速的發(fā)展:相繼出現(xiàn)了測試經(jīng)理、測試分析師等職稱以及發(fā)表大量測試刊物,發(fā)布相關(guān)國際標(biāo)準(zhǔn)。同時IEEE提出的軟件工程標(biāo)準(zhǔn)術(shù)語中給軟件測試定義是:“使用人工或自動手段來運行或測定某個軟件系統(tǒng)的過程,其目的在于檢驗它是否滿足規(guī)定的需求或弄清預(yù)期結(jié)果與實際結(jié)果之間的差別”。也就是這個時期人們開始關(guān)注工具對測試的影響。以預(yù)防為主預(yù)防為主是當(dāng)下軟件測試的主流思想之一。STEP(產(chǎn)品模型數(shù)據(jù)交互規(guī)范,Systematic Test and Evaluation Process,簡稱STEP)是最早的一個以預(yù)防為主的生命周期模型,STEP認(rèn)為測試與開發(fā)是并行的,整個測試的生命周期也是由計劃、分析、設(shè)計、開發(fā)、執(zhí)行和維護(hù)組成,也就是說,測試不是在編碼完成后才開始介入,而是貫穿于整個軟件生命周期。軟件測試目的從上述測試的發(fā)展來看,軟件測試的目的也有一個階段性的變化,我們通過下圖來分析一下軟件測試目的的演進(jìn)。如圖1-7所示。預(yù)防檢測證明表明軟件能發(fā)現(xiàn)錯誤管理質(zhì)量夠工作20世紀(jì)90年代20世紀(jì)60年代20世紀(jì)70年代中期證明保證軟件產(chǎn)品是完整的并且可用或可被集成,同時需要嘗試在非正常情況下的功能和特性是否可用,評估系統(tǒng)的風(fēng)險承受能力。檢測發(fā)現(xiàn)缺陷、錯誤和系統(tǒng)不足的地方,定義系統(tǒng)的能力和局限性,并提供相關(guān)的組件、工作產(chǎn)品和系統(tǒng)質(zhì)量信息。預(yù)防提供預(yù)防和減少可能導(dǎo)致錯誤的信息,在過程中盡早地檢測錯誤,確認(rèn)問題和風(fēng)險,并且提前確認(rèn)解決這些問題和風(fēng)險的途徑。軟件測試目的往往包含如下內(nèi)容:1)測試并不僅是為了找出錯誤,而且要通過分析錯誤產(chǎn)生的原因和錯誤的發(fā)生趨勢,幫助項目管理者發(fā)現(xiàn)當(dāng)前軟件開發(fā)過程中的缺陷,以便及時改進(jìn)。2)需要測試工程師設(shè)計出具有針對性的測試方法,以改善測試的有效性。3)沒有發(fā)現(xiàn)錯誤的測試也是有價值的,完整的測試是評估軟件質(zhì)量的一種方法。綜上來看軟件測試目的是指盡可能早的發(fā)現(xiàn)軟件中存在的缺陷并提高軟件質(zhì)量。軟件測試原則軟件測試?yán)碚摻?jīng)過幾十年的發(fā)展,在測試界提出了很多測試的基本原則,概括出以下8條軟件測試基本原則。1.所有的測試要追溯到用戶的需求在所有測試活動的過程中,測試人員都應(yīng)該從客戶的需求出發(fā),想用戶所想。正如我們所知,軟件測試的目標(biāo)就是驗證產(chǎn)品開發(fā)的一致性和確認(rèn)產(chǎn)品是否滿足客戶的需求,與之對應(yīng)的任何產(chǎn)品質(zhì)量特性都應(yīng)追溯到用戶需求。簡單說就是一切從用戶角度出發(fā)。2.測試應(yīng)盡早地介入根據(jù)統(tǒng)計表明,在軟件開發(fā)生命周期早期引入的錯誤占軟件過程中出現(xiàn)所有錯誤(包括最終的缺陷)數(shù)量的50%~60%。此外,IBM的一份研究結(jié)果表明,缺陷存在放大的趨勢。所以越是測試后期,為修復(fù)缺陷所付出的代價就會越大。因此,軟件測試人員要盡早地且不斷地進(jìn)行軟件測試,以提高軟件質(zhì)量,降低軟件開發(fā)成本。3.測試無法窮舉在整個測試過程中,測試人員無法考慮到所有可能輸入值和它們的組合以及結(jié)合所有不同的測試前置條件;所以窮舉測試是不可能的,當(dāng)測試滿足一定的出口準(zhǔn)則時,測試就應(yīng)當(dāng)終止。因此,想要控制測試工作量,在測試成本、收益和風(fēng)險之間求得平衡;需要通過風(fēng)險分析、優(yōu)先級分析以及軟件質(zhì)量模型和不同測試的方法來確定測試關(guān)注點,從而代替窮舉測試,提高測試覆蓋率。4.避免開發(fā)者自測測試工作需要嚴(yán)謹(jǐn)?shù)淖黠L(fēng)、冷靜的分析。心理學(xué)告訴我們,每個人都具有一種不愿否定自己工作的心理,這種狀態(tài)導(dǎo)致測試自己程序的障礙。同時,程序員對需求規(guī)格說明的錯誤理解而引入的錯誤是很難被發(fā)現(xiàn)。因此,程序員應(yīng)避免測試自己的程序,為達(dá)到最佳的效果,應(yīng)由獨立的測試小組、第三方來完成測試。5.群集現(xiàn)象Pareto Principle帕累托法則(二八定律)表明:80%的錯誤集中在20%的程序模塊中。也就是說,測試所發(fā)現(xiàn)的大部分缺陷和軟件運行失效是由少數(shù)程序模塊引起的。因此,測試過程中要充分注意群集現(xiàn)象,對發(fā)現(xiàn)錯誤較多的程序段或者軟件模塊,應(yīng)進(jìn)行反復(fù)的深入的測試。6.殺蟲劑悖論殺蟲劑用得多了,害蟲就有免疫力,殺蟲劑就發(fā)揮不了效力。同樣在測試中,如果測試用例被反復(fù)使用時,發(fā)現(xiàn)缺陷的能力就會越來越差。為了避免克服這種現(xiàn)象出現(xiàn),測試用例需要進(jìn)行定期評審和修改,不斷增加新的不同的測試用例來測試軟件或系統(tǒng)的不同部分,從而發(fā)現(xiàn)更多潛在的缺陷。作為專業(yè)的測試人員來說,要具有探索性思維和逆向思維。同理,測試方法也需要不斷地變化。7.不存在缺陷的謬論通過測試可以減少軟件中存在未被發(fā)現(xiàn)缺陷的可能性,但即使測試沒有發(fā)現(xiàn)任何缺陷,也不能證明軟件或系統(tǒng)是完全正確的。也就是說,測試只能證明軟件存在缺陷,不能證明軟件不存在缺陷。比如,不能滿足用戶期望的或用戶不滿意,也是一種缺陷。8.測試活動依賴于測試背景針對不同的測試背景,進(jìn)行的測試活動也不同,測試策略和測試方法在選取上也有所不同。比如,銀行產(chǎn)品和電商平臺。在銀行產(chǎn)品中要將安全放到首位;在電商平臺中要把兼容性、性能放到首位。在實際測試過程中,測試人員應(yīng)該在測試原則指導(dǎo)下進(jìn)行測試活動。軟件測試原則有助于測試人員進(jìn)行高質(zhì)量的測試,盡早盡可能多的發(fā)現(xiàn)缺陷,并負(fù)責(zé)跟蹤和分析軟件中的問題,對存在的問題和不足提出質(zhì)疑和改進(jìn),從而持續(xù)改進(jìn)測試過程。