軟件測試
第五章第五章 軟件測試軟件測試n n測試的目的和原則測試的目的和原則n n測試方法與測試用例設計測試方法與測試用例設計n n軟件測試的策略軟件測試的策略n n軟件測試的種類軟件測試的種類n n程序的靜態(tài)測試程序的靜態(tài)測試n n程序調(diào)試程序調(diào)試1軟件測試的目的和原則軟件測試的目的和原則軟件測試的目的軟件測試的目的軟件測試的原則軟件測試的原則軟件測試的對象軟件測試的對象測試信息流測試信息流測試與軟件開發(fā)各階段的關系測試與軟件開發(fā)各階段的關系測試的充分性測試的充分性2軟件測試的目的軟件測試的目的基于不同的立場,存在著兩種完全不同基于不同的立場,存在著兩種完全不同的測試目的。的測試目的。從從用戶的角度用戶的角度出發(fā),普遍希望通過軟件出發(fā),普遍希望通過軟件測試測試暴露軟件中隱藏的錯誤和缺陷暴露軟件中隱藏的錯誤和缺陷,以,以考慮是否可接受該產(chǎn)品。考慮是否可接受該產(chǎn)品。從從軟件開發(fā)者的角度軟件開發(fā)者的角度出發(fā),則希望測試出發(fā),則希望測試成為成為表明軟件產(chǎn)品中不存在錯誤表明軟件產(chǎn)品中不存在錯誤的過程,的過程,驗證該軟件已正確地實現(xiàn)了用戶的要求,驗證該軟件已正確地實現(xiàn)了用戶的要求,確立人們對軟件質(zhì)量的信心。確立人們對軟件質(zhì)量的信心。3Myers軟件測試目的軟件測試目的(1)測試是測試是程序的執(zhí)行過程程序的執(zhí)行過程,目的在于,目的在于發(fā)現(xiàn)錯誤發(fā)現(xiàn)錯誤;(2)一個好的測試用例在于一個好的測試用例在于能發(fā)現(xiàn)至今能發(fā)現(xiàn)至今未發(fā)現(xiàn)的錯誤未發(fā)現(xiàn)的錯誤;(3)一個成功的測試是一個成功的測試是發(fā)現(xiàn)了至今未發(fā)發(fā)現(xiàn)了至今未發(fā)現(xiàn)的錯誤的測試現(xiàn)的錯誤的測試。4換言之,測試的目的是換言之,測試的目的是uu 想以最少的時間和人力,想以最少的時間和人力,系統(tǒng)地找系統(tǒng)地找出軟件中潛在的各種錯誤和缺陷出軟件中潛在的各種錯誤和缺陷。如。如果我們成功地實施了測試,我們就能果我們成功地實施了測試,我們就能夠發(fā)現(xiàn)軟件中的錯誤。夠發(fā)現(xiàn)軟件中的錯誤。uu 測試的附帶收獲是,它測試的附帶收獲是,它能夠證明軟能夠證明軟件的功能和性能與需求說明相符合件的功能和性能與需求說明相符合。uu 實施測試收集到的測試結(jié)果數(shù)據(jù)為實施測試收集到的測試結(jié)果數(shù)據(jù)為可靠性分析提供了依據(jù)。可靠性分析提供了依據(jù)。uu 測試不能表明軟件中不存在錯誤,測試不能表明軟件中不存在錯誤,它只能說明軟件中存在錯誤。它只能說明軟件中存在錯誤。5軟件測試的原則軟件測試的原則1.應當把應當把“盡早地和不斷地進行軟件測試盡早地和不斷地進行軟件測試”作為軟件開發(fā)者的座右銘。作為軟件開發(fā)者的座右銘。2.測試用例應由測試用例應由測試輸入數(shù)據(jù)測試輸入數(shù)據(jù)和對應的和對應的預預期輸出結(jié)果期輸出結(jié)果這兩部分組成。這兩部分組成。3.程序員應避免檢查自己的程序。程序員應避免檢查自己的程序。4.在設計測試用例時,應包括在設計測試用例時,應包括合理的輸入合理的輸入條件條件和和不合理的輸入條件不合理的輸入條件。65.充分注意測試中的群集現(xiàn)象。經(jīng)驗表明,充分注意測試中的群集現(xiàn)象。經(jīng)驗表明,測試后測試后程序中殘存的錯誤數(shù)目與該程序程序中殘存的錯誤數(shù)目與該程序中已發(fā)現(xiàn)的錯誤數(shù)目成正比中已發(fā)現(xiàn)的錯誤數(shù)目成正比。6.嚴格執(zhí)行測試計劃,嚴格執(zhí)行測試計劃,排除測試的隨意性排除測試的隨意性。7.應當對每一個測試結(jié)果做全面檢查。應當對每一個測試結(jié)果做全面檢查。8.妥善保存測試計劃,測試用例,出錯統(tǒng)妥善保存測試計劃,測試用例,出錯統(tǒng)計和最終分析報告,為維護提供方便。計和最終分析報告,為維護提供方便。7軟件測試的對象軟件測試的對象軟件測試并不等于程序測試。軟件測試并不等于程序測試。軟件測試軟件測試應貫穿于軟件定義與開發(fā)的整個期間應貫穿于軟件定義與開發(fā)的整個期間。需求分析需求分析、概要設計概要設計、詳細設計以及程詳細設計以及程序編碼序編碼等各階段所得到的等各階段所得到的文檔文檔,包括需,包括需求規(guī)格說明、概要設計規(guī)格說明、詳細求規(guī)格說明、概要設計規(guī)格說明、詳細設計規(guī)格說明以及源程序,設計規(guī)格說明以及源程序,都應成為軟都應成為軟件測試的對象件測試的對象。8為把握軟件開發(fā)各個環(huán)節(jié)的正確性,需為把握軟件開發(fā)各個環(huán)節(jié)的正確性,需要進行各種要進行各種確認確認和和驗證驗證工作。工作。確認確認(Validation),是一系列的活動和是一系列的活動和過程,目的是想證實在一個給定的外部過程,目的是想證實在一個給定的外部環(huán)境中軟件的邏輯正確性。環(huán)境中軟件的邏輯正確性。uu 需求規(guī)格說明確認需求規(guī)格說明確認uu 程序確認程序確認(靜態(tài)確認、動態(tài)確認靜態(tài)確認、動態(tài)確認)驗證驗證(Verification),試圖證明在軟件試圖證明在軟件生存期各個階段,以及階段間的邏輯協(xié)生存期各個階段,以及階段間的邏輯協(xié)調(diào)性、完備性和正確性。調(diào)性、完備性和正確性。910測試信息流測試信息流可靠性可靠性分析分析測試測試軟件軟件配置配置測試測試配置配置測試測試工具工具結(jié)果結(jié)果分析分析測試結(jié)果測試結(jié)果預預期期結(jié)結(jié)果果出出錯錯率率數(shù)數(shù)據(jù)據(jù)預測的可靠性預測的可靠性錯誤錯誤調(diào)試調(diào)試修改后的軟件修改后的軟件11測試信息流測試信息流軟件配置軟件配置:軟件需求規(guī)格說明、軟件設:軟件需求規(guī)格說明、軟件設計規(guī)格說明、源代碼等;計規(guī)格說明、源代碼等;測試配置測試配置:測試計劃、測試用例、測試:測試計劃、測試用例、測試程序等;程序等;測試工具測試工具:測試數(shù)據(jù)自動生成程序、靜:測試數(shù)據(jù)自動生成程序、靜態(tài)分析程序、動態(tài)分析程序、測試結(jié)果態(tài)分析程序、動態(tài)分析程序、測試結(jié)果分析程序、以及驅(qū)動測試的測試數(shù)據(jù)庫分析程序、以及驅(qū)動測試的測試數(shù)據(jù)庫等等。等等。12測試結(jié)果分析測試結(jié)果分析:比較實測結(jié)果與預期結(jié):比較實測結(jié)果與預期結(jié)果,評價錯誤是否發(fā)生。果,評價錯誤是否發(fā)生。排錯排錯(調(diào)試調(diào)試):對已經(jīng)發(fā)現(xiàn)的錯誤進行錯:對已經(jīng)發(fā)現(xiàn)的錯誤進行錯誤定位和確定出錯性質(zhì),并改正這些錯誤定位和確定出錯性質(zhì),并改正這些錯誤,同時修改相關的文檔。誤,同時修改相關的文檔。修正后的文檔再測試修正后的文檔再測試:直到通過測試為:直到通過測試為止。止。13通過收集和分析測試結(jié)果數(shù)據(jù),對軟件通過收集和分析測試結(jié)果數(shù)據(jù),對軟件建立可靠性模型建立可靠性模型利用可靠性分析,評價軟件質(zhì)量:利用可靠性分析,評價軟件質(zhì)量:軟件的質(zhì)量和可靠性達到可以接受的軟件的質(zhì)量和可靠性達到可以接受的程度;程度;所做的測試不足以發(fā)現(xiàn)嚴重的錯誤;所做的測試不足以發(fā)現(xiàn)嚴重的錯誤;如果測試發(fā)現(xiàn)不了錯誤,可以肯定,測如果測試發(fā)現(xiàn)不了錯誤,可以肯定,測試配置考慮得不夠細致充分,錯誤仍然試配置考慮得不夠細致充分,錯誤仍然潛伏在軟件中。潛伏在軟件中。14測試與軟件開發(fā)各階段的關系測試與軟件開發(fā)各階段的關系軟件開發(fā)過程是一個自頂向下,逐步細軟件開發(fā)過程是一個自頂向下,逐步細化的過程化的過程軟件計劃階段定義軟件范圍(作用域)軟件計劃階段定義軟件范圍(作用域)軟件需求分析階段建立軟件信息域、功軟件需求分析階段建立軟件信息域、功能和性能需求、約束等能和性能需求、約束等軟件設計階段建立軟件體系結(jié)構(gòu)、用戶軟件設計階段建立軟件體系結(jié)構(gòu)、用戶接口、數(shù)據(jù)結(jié)構(gòu)和細部設計接口、數(shù)據(jù)結(jié)構(gòu)和細部設計程序編碼階段把設計用某種程序設計語程序編碼階段把設計用某種程序設計語言轉(zhuǎn)換成程序代碼言轉(zhuǎn)換成程序代碼15測試過程是依相反順序安排的自底向上,測試過程是依相反順序安排的自底向上,逐步集成的過程。逐步集成的過程。需求分析需求分析設計設計程序編碼程序編碼單元測試單元測試集成測試集成測試確認測試確認測試詳細設計規(guī)格說明詳細設計規(guī)格說明概要設計規(guī)格說明概要設計規(guī)格說明需求規(guī)格說明需求規(guī)格說明16測試的充分性測試的充分性測試的充分性是測試的充分性是1975年由年由Goodenough和和Gerhart提出來的。提出來的。他們提出了一些軟件測試充分性準則,他們提出了一些軟件測試充分性準則,用以表明測試數(shù)據(jù)必須具備什么性質(zhì)才用以表明測試數(shù)據(jù)必須具備什么性質(zhì)才能算作是一個徹底的測試。能算作是一個徹底的測試。軟件測試的充分性從軟件在有限多個輸軟件測試的充分性從軟件在有限多個輸入數(shù)據(jù)的行為,判斷軟件在所有輸入數(shù)入數(shù)據(jù)的行為,判斷軟件在所有輸入數(shù)據(jù)上的行為。據(jù)上的行為。17Weyuker測試充分性準則測試充分性準則1.空測試對任何軟件都是不充分的??湛諟y試對任何軟件都是不充分的??諟y試用例集合意味著軟件沒有測試。測試用例集合意味著軟件沒有測試。2.有限性有限性 對任何軟件都存在有限的充對任何軟件都存在有限的充分測試集合。因為軟件測試必須的有分測試集合。因為軟件測試必須的有限時間內(nèi)完成。限時間內(nèi)完成。3.單調(diào)性單調(diào)性 如果一個軟件系統(tǒng)在一個測如果一個軟件系統(tǒng)在一個測試用例集合上是的測試是充分的,那試用例集合上是的測試是充分的,那么,再多測試一些用例也應是充分的。么,再多測試一些用例也應是充分的。184.非非復合性復合性 即使對軟件所有成分都作即使對軟件所有成分都作了充分的測試,也不表明整個軟件的了充分的測試,也不表明整個軟件的測試已經(jīng)充分了。測試已經(jīng)充分了。5.非分解性非分解性 即使對軟件整體做了充分即使對軟件整體做了充分的測試,也不表明軟件系統(tǒng)中各個成的測試,也不表明軟件系統(tǒng)中各個成分都已得到充分的測試。分都已得到充分的測試。6.復雜性復雜性 軟件越復雜,需要的測試用軟件越復雜,需要的測試用例就越多。例就越多。7.回報遞減率回報遞減率 測試得越多,進一步測測試得越多,進一步測試所能得到的充分性增長就越少。試所能得到的充分性增長就越少。198.軟件測試的充分性與軟件需求和軟件軟件測試的充分性與軟件需求和軟件實現(xiàn)有關。例如,實現(xiàn)有關。例如,對于兩個結(jié)構(gòu)相同的程序,會有一對于兩個結(jié)構(gòu)相同的程序,會有一個測試用例集合,它對一個程序是個測試用例集合,它對一個程序是充分的,而對另一個程序系統(tǒng)則是充分的,而對另一個程序系統(tǒng)則是不充分的;不充分的;類似地,存在兩個程序,它們的語類似地,存在兩個程序,它們的語義是相同的,但存在一個測試用例義是相同的,但存在一個測試用例集合,它對于一個程序是充分的,集合,它對于一個程序是充分的,而對于另一個程序則是不充分的。而對于另一個程序則是不充分的。20測試方法與測試用例設計測試方法與測試用例設計黑盒測試黑盒測試uu等價類劃分等價類劃分uu邊界值分析邊界值分析uu錯誤推測法錯誤推測法uu因果圖因果圖白盒測試白盒測試uu邏輯覆蓋邏輯覆蓋uu判定結(jié)構(gòu)分析判定結(jié)構(gòu)分析uu循環(huán)結(jié)構(gòu)分析循環(huán)結(jié)構(gòu)分析u基本路徑覆蓋基本路徑覆蓋21黑盒測試黑盒測試這種方法是把這種方法是把測試對象測試對象看做看做一個黑盒一個黑盒,測試人員完全不考慮程序內(nèi)部的邏輯結(jié)測試人員完全不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和內(nèi)部特性,只依據(jù)程序的需求和功構(gòu)和內(nèi)部特性,只依據(jù)程序的需求和功能規(guī)格說明,檢查程序的功能是否符合能規(guī)格說明,檢查程序的功能是否符合它的功能說明。它的功能說明。黑盒測試叫做黑盒測試叫做功能測試功能測試或或數(shù)據(jù)驅(qū)動測試數(shù)據(jù)驅(qū)動測試。一種特殊的黑盒測試叫做一種特殊的黑盒測試叫做接口測試接口測試,它,它不管程序的需求和實現(xiàn)細節(jié),僅依據(jù)程不管程序的需求和實現(xiàn)細節(jié),僅依據(jù)程序與其外部環(huán)境的接口來選擇測試數(shù)據(jù)。序與其外部環(huán)境的接口來選擇測試數(shù)據(jù)。22黑盒測試方法是在程序接口上進行測試,黑盒測試方法是在程序接口上進行測試,主要是為了發(fā)現(xiàn)以下錯誤主要是為了發(fā)現(xiàn)以下錯誤:uu 是否有不正確或遺漏了的功能是否有不正確或遺漏了的功能?uu 在接口上,在接口上,輸入能否正確地接受輸入能否正確地接受?能否輸出正確的結(jié)果能否輸出正確的結(jié)果?uu 是否有數(shù)據(jù)結(jié)構(gòu)錯誤或外部信息是否有數(shù)據(jù)結(jié)構(gòu)錯誤或外部信息(例如數(shù)據(jù)文件例如數(shù)據(jù)文件)訪問錯誤訪問錯誤?uu 性能上是否能夠滿足要求性能上是否能夠滿足要求?uu 是否有初始化或終止性錯誤是否有初始化或終止性錯誤?23用黑盒測試發(fā)現(xiàn)程序錯誤,必須在用黑盒測試發(fā)現(xiàn)程序錯誤,必須在所有所有可能的輸入條件和輸出條件可能的輸入條件和輸出條件中確定測試中確定測試數(shù)據(jù),檢查程序能否產(chǎn)生正確的輸出。數(shù)據(jù),檢查程序能否產(chǎn)生正確的輸出。但這是但這是不可能不可能的。例如,設一個的。例如,設一個程序程序P有有輸入量輸入量X和和Y及及輸出量輸出量Z。在字長為在字長為32位的計算機上運行。若位的計算機上運行。若X、Y取整數(shù),取整數(shù),按黑盒方法進行窮舉測試:可能采用的按黑盒方法進行窮舉測試:可能采用的測試數(shù)據(jù)組個數(shù)測試數(shù)據(jù)組個數(shù):232232264 如果測試一組數(shù)據(jù)需要如果測試一組數(shù)據(jù)需要1毫秒毫秒,一年工作一年工作36524小時,完成所有測試需小時,完成所有測試需5億年億年。24白盒測試白盒測試此方法此方法把測試對象看做一個透明的盒子把測試對象看做一個透明的盒子,它允許測試人員利用程序內(nèi)部的邏輯結(jié)它允許測試人員利用程序內(nèi)部的邏輯結(jié)構(gòu)及有關信息,設計或選擇測試用例,構(gòu)及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。對程序所有邏輯路徑進行測試。通過通過在不同點檢查程序的狀態(tài)在不同點檢查程序的狀態(tài),確定實,確定實際的狀態(tài)是否與預期的狀態(tài)一致。因此際的狀態(tài)是否與預期的狀態(tài)一致。因此白盒測試又稱為結(jié)構(gòu)測試或邏輯驅(qū)動測白盒測試又稱為結(jié)構(gòu)測試或邏輯驅(qū)動測試。試。25軟件人員使用白盒測試方法,主要想對軟件人員使用白盒測試方法,主要想對程序模塊進行如下的檢查:程序模塊進行如下的檢查:uu 對程序模塊的對程序模塊的所有獨立的執(zhí)行路徑所有獨立的執(zhí)行路徑至少測試一次至少測試一次 路徑覆蓋測試路徑覆蓋測試;uu 對對所有的邏輯判定所有的邏輯判定,取取“真真”與取與取“假假”的兩種情況都至少測試一次的兩種情況都至少測試一次 邏輯覆蓋測試邏輯覆蓋測試;uu 在循環(huán)的邊界和運行界限內(nèi)執(zhí)行循在循環(huán)的邊界和運行界限內(nèi)執(zhí)行循環(huán)體環(huán)體 控制流測試控制流測試;uu 測試測試內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性內(nèi)部數(shù)據(jù)結(jié)構(gòu)的有效性 數(shù)數(shù)據(jù)流測試、領域測試據(jù)流測試、領域測試等。等。26對一個具有對一個具有多重選擇和循環(huán)嵌套多重選擇和循環(huán)嵌套的程序,的程序,不同的路徑數(shù)目可能是天文數(shù)字不同的路徑數(shù)目可能是天文數(shù)字。給出。給出一個小程序的流程圖,它包括了一個執(zhí)一個小程序的流程圖,它包括了一個執(zhí)行行20次的循環(huán)。次的循環(huán)。包含的不同執(zhí)行路徑數(shù)達包含的不同執(zhí)行路徑數(shù)達 520 條,對每條,對每一條路徑進行測試需要一條路徑進行測試需要1毫秒,假定一毫秒,假定一年工作年工作36524小時,要想把所有路徑測小時,要想把所有路徑測試完,需試完,需3170年。年。2728邏輯覆蓋邏輯覆蓋 語句覆蓋語句覆蓋 判定覆蓋判定覆蓋 條件覆蓋條件覆蓋 判定條件覆蓋判定條件覆蓋 條件組合覆蓋條件組合覆蓋 路徑覆蓋路徑覆蓋邏輯覆蓋是以邏輯覆蓋是以程序內(nèi)部的邏輯結(jié)構(gòu)為基礎程序內(nèi)部的邏輯結(jié)構(gòu)為基礎的設計測試用例的技術。它屬白盒測試。的設計測試用例的技術。它屬白盒測試。29(A1)and(B=0)(A=2)or(X1)X=X/AX=X+1T TT TF FF Fabdce30L1(a c e)=(A 1)and(B=0)and (A=2)or(X/A 1)=(A 1)and(B=0)and(A=2)or (A 1)and(B=0)and(X/A 1)=(A=2)and(B=0)or (A 1)and(B=0)and(X/A 1)31L2(a b d)=not(A 1)and(B=0)and not(A=2)or(X 1)=not(A 1)or not(B=0)and not(A=2)and not(X1)=not(A 1)and not(A=2)and not(X 1)or not(B=0)and not(A=2)and not(X 1)32L3(a b e)=not(A 1)and(B=0)and (A=2)or(X 1)=not(A 1)or not(B=0)and (A=2)or(X 1)=not(A 1)and(A=2)or not(A 1)and(X 1)or not(B=0)and(A=2)or not(B=0)and(X 1)33L4(a c d)=(A 1)and(B=0)and not(A=2)or(X/A 1)=(A 1)and(B=0)and not(A=2)and not(X/A 1)34語句覆蓋語句覆蓋語句覆蓋就是設計若干個測試用例,運語句覆蓋就是設計若干個測試用例,運行被測程序,使得行被測程序,使得每一可執(zhí)行語句至少每一可執(zhí)行語句至少執(zhí)行一次執(zhí)行一次。在圖例中,正好所有的可執(zhí)行語句都在在圖例中,正好所有的可執(zhí)行語句都在路徑路徑L1上,所以選擇上,所以選擇路徑路徑 L1設計測試用設計測試用例,就可以覆蓋所有的可執(zhí)行語句。例,就可以覆蓋所有的可執(zhí)行語句。35測試用例的設計格式如下測試用例的設計格式如下【輸入的【輸入的(A,B,X),輸出的輸出的(A,B,X)】為圖例設計滿足為圖例設計滿足語句覆蓋語句覆蓋的測試用例是的測試用例是:【(2,0,4),(2,0,3)】覆蓋覆蓋 ace【L1】(A=2)and(B=0)or (A1)and(B=0)and(X/A1)36 判定覆蓋判定覆蓋判定覆蓋就是設計若干個測試用例,運判定覆蓋就是設計若干個測試用例,運行被測程序,使得行被測程序,使得程序中每個判斷的取程序中每個判斷的取真分支和取假分支至少經(jīng)歷一次真分支和取假分支至少經(jīng)歷一次。判定覆蓋又稱為判定覆蓋又稱為分支覆蓋分支覆蓋。對于圖例,如果選擇對于圖例,如果選擇路徑路徑L1和和L2,就可就可得滿足要求的測試用例得滿足要求的測試用例:37【(2,0,4),(2,0,3)】覆蓋】覆蓋 ace【L1】【(1,1,1),(1,1,1)】覆蓋覆蓋 abd【L2】(A=2)and(B=0)or (A 1)and(B=0)and(X/A 1)not(A 1)and not(A=2)and not(X 1)or not(B=0)and not(A=2)and not(X 1)38如果選擇路徑如果選擇路徑L3和和L4,還可得另一組可還可得另一組可用的測試用例用的測試用例:【(2,1,1),(2,1,2)】覆蓋】覆蓋 abe【L3】【(3,0,3),(3,0,1)】覆蓋覆蓋 acd【L4】not(A 1)and(X 1)or not(B=0)and (A=2)or not(B=0)and(X 1)(A 1)and(B=0)and not(A=2)and not(X/A 1)39條件覆蓋條件覆蓋條件覆蓋就是設計若干個測試用例,運行條件覆蓋就是設計若干個測試用例,運行被測程序,使得程序中被測程序,使得程序中每個判斷的每個條每個判斷的每個條件的可能取值至少執(zhí)行一次件的可能取值至少執(zhí)行一次。在圖例中,我們事先可對所有條件的取值在圖例中,我們事先可對所有條件的取值加以標記。例如,加以標記。例如,對于第一個判斷:對于第一個判斷:uu 條件條件 A1 取真為取真為 ,取假為,取假為 條件條件 B0 取真為取真為 ,取假為,取假為40對于第二個判斷:對于第二個判斷:uu 條件條件A2 取真為取真為 ,取假為,取假為 條件條件X1 取真為取真為 ,取假為,取假為 測試用例測試用例 覆蓋分支覆蓋分支 條件取條件取值值【(2,0,4),(2,0,3)】L1(c,e)【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)或或41 測測 試試 用用 例例覆蓋分支覆蓋分支 條件取值條件取值【(1,0,3),(1,0,4)】L3(b,e)【(2,1,1),(2,1,2)】L3(b,e)判定條件覆蓋就是設計足夠的測試用判定條件覆蓋就是設計足夠的測試用例,使得例,使得判斷中每個條件的所有可能取判斷中每個條件的所有可能取值至少執(zhí)行一次值至少執(zhí)行一次,每個判斷中的每個分每個判斷中的每個分支至少執(zhí)行一次支至少執(zhí)行一次。判定條件覆蓋判定條件覆蓋42 測測 試試 用用 例例覆蓋分支覆蓋分支 條件取值條件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)(A=2)and(B=0)or (A 1)and(B=0)and(X/A 1)not(A 1)and not(A=2)and not(X 1)or not(B=0)and not(A=2)and not(X 1)43 andorA1T TB=0T TX=X/AT TF FF FA=2T TF FX1F FX=X+144條件組合覆蓋條件組合覆蓋條件組合覆蓋就是設計足夠的測試用例,條件組合覆蓋就是設計足夠的測試用例,運行被測程序,使得運行被測程序,使得每個判斷的所有可每個判斷的所有可能的條件取值組合至少執(zhí)行一次能的條件取值組合至少執(zhí)行一次。記記 A1,B0 作作 A1,B0 作作 A 1,B0 作作 A 1,B0 作作45 A2,X1 作作 A2,X 1 作作 A2,X1 作作 A2,X 1 作作 測測 試試 用用 例例 覆蓋條件覆蓋條件 覆蓋組合覆蓋組合【(2,0,4),(2,0,3)】(L1),【(2,1,1),(2,1,2)】(L3),【(1,0,3),(1,0,4)】(L3),【(1,1,1),(1,1,1)】(L2),46路徑測試路徑測試路徑測試就是設計足夠的測試用例,路徑測試就是設計足夠的測試用例,覆覆蓋程序中所有可能的路徑蓋程序中所有可能的路徑。測測 試試 用用 例例 通過路徑通過路徑 覆蓋條件覆蓋條件【(2,0,4),(2,0,3)】ace(L1)【(1,1,1),(1,1,1)】abd(L2)【(1,1,2),(1,1,3)】abe(L3)【(3,0,3),(3,0,1)】acd(L4)47判定結(jié)構(gòu)分析判定結(jié)構(gòu)分析當程序中判定多于一個時,形成的分支當程序中判定多于一個時,形成的分支結(jié)構(gòu)可以分為兩類:結(jié)構(gòu)可以分為兩類:嵌套型分支結(jié)構(gòu)嵌套型分支結(jié)構(gòu)和和連鎖型分支結(jié)構(gòu)連鎖型分支結(jié)構(gòu)。對于嵌套型分支結(jié)構(gòu),若有對于嵌套型分支結(jié)構(gòu),若有n個判定語句,個判定語句,需要需要n+1個測試用例;個測試用例;對于連鎖型分支結(jié)構(gòu),對于連鎖型分支結(jié)構(gòu),若有若有n個判定語句,個判定語句,需要有需要有2n個測試用例,覆蓋它的個測試用例,覆蓋它的2n條路徑。條路徑。48嵌套型分支結(jié)構(gòu)嵌套型分支結(jié)構(gòu)連鎖型分支結(jié)構(gòu)連鎖型分支結(jié)構(gòu)s1s2s3s4p1p2p3s1s2s3s4s5s6p1p2p349對于連鎖型分支結(jié)構(gòu),當對于連鎖型分支結(jié)構(gòu),當 n 較大時將無較大時將無法測試。法測試。為減少測試用例的數(shù)目,可采用為減少測試用例的數(shù)目,可采用試驗設試驗設計法計法,抽取部分路徑進行測試抽取部分路徑進行測試。由于抽樣服從均勻分布,因此,在假定由于抽樣服從均勻分布,因此,在假定各條路徑的重要性相同,或暫不明確各各條路徑的重要性相同,或暫不明確各條路徑的重要性的情況下可以做到均勻條路徑的重要性的情況下可以做到均勻抽樣。如果明確了各條路徑的重要性,抽樣。如果明確了各條路徑的重要性,還可以采取加權(quán)的辦法,篩選掉部分路還可以采取加權(quán)的辦法,篩選掉部分路徑,再用如下的措施進行抽樣。徑,再用如下的措施進行抽樣。50設設連鎖型分支結(jié)構(gòu)中有連鎖型分支結(jié)構(gòu)中有 n 個判定,計算個判定,計算滿足關系式滿足關系式 n+12m 的最小自然數(shù)的最小自然數(shù)m;設設t=2m,取正交表取正交表Lt,并利用它設計測并利用它設計測試數(shù)據(jù)。試數(shù)據(jù)。例如,一個連鎖型分支結(jié)構(gòu)中有三個判例如,一個連鎖型分支結(jié)構(gòu)中有三個判定語句定語句p1,p2,p3。全部路徑是全部路徑是238 條。條。先計算先計算3+12m=t 的的 t,得得 t=4。取正交取正交表表L4,把每一列當做一個判定,每一行把每一列當做一個判定,每一行當做可取的測試用例,可得當做可取的測試用例,可得4個測試用例。個測試用例。51用各個判定的用各個判定的取假分支取假分支取代正交表取代正交表L4中中的的“0”,用,用取真分支取真分支取代正交表中的取代正交表中的“1”,就建立起一個測試路徑矩陣。這,就建立起一個測試路徑矩陣。這樣,測試路徑數(shù)目從樣,測試路徑數(shù)目從238條減少到條減少到314條。條。L40 0 01 0 10 1 11 1 01 2 31234用例用例s1 s3 s5s2 s3 s6s1 s4 s6s2 s4 s5p1 p2 p31234s1 s3 s5s2 s3 s6s1 s4 s6s2 s4 s5路路路路 徑徑徑徑52s1s3s5p1p2p3s2s3s6p1p2p3s1s4s6p1p2p3s2s4s5p1p2p353L201112L40 0 01 0 10 1 11 1 01 2 31234L80 0 0 0 0 0 01 0 1 0 1 0 10 1 1 0 0 1 111 0 0 1 1 00 0 0 1 1 1 110 1 1 0 1 00 1 1 1 1 0 01 1 0 1 0 0 11 2 3 4 5 6 712345678L2L454循環(huán)結(jié)構(gòu)分析循環(huán)結(jié)構(gòu)分析循環(huán)分為循環(huán)分為4種不同類型:種不同類型:簡單循環(huán)簡單循環(huán)、連鎖連鎖循環(huán)循環(huán)、嵌套循環(huán)嵌套循環(huán)和和非結(jié)構(gòu)循環(huán)非結(jié)構(gòu)循環(huán)。(1)簡單循環(huán)簡單循環(huán) 零次循環(huán)零次循環(huán):從循環(huán)入口到出口:從循環(huán)入口到出口 一次循環(huán)一次循環(huán):檢查循環(huán)初始值:檢查循環(huán)初始值 二次循環(huán)二次循環(huán):檢查多次循環(huán):檢查多次循環(huán) m次循環(huán):次循環(huán):檢查在多次循環(huán)檢查在多次循環(huán) 最大次數(shù)循環(huán)、比最大次數(shù)多一次、最大次數(shù)循環(huán)、比最大次數(shù)多一次、少一次的循環(huán)。少一次的循環(huán)。5556簡單循環(huán)設計測試用例的例子:簡單循環(huán)設計測試用例的例子:求最小值求最小值k=i;for(j=i+1;j=n;j+)if(Aj Ak)k=j;57k=i;j=i+1;j=n?AjAk?k=jj+fdcabe58測試用例選擇測試用例選擇59 對對最內(nèi)層循環(huán)做簡單循環(huán)的全部測最內(nèi)層循環(huán)做簡單循環(huán)的全部測試試。所有其他層的循環(huán)變量置為最小值;。所有其他層的循環(huán)變量置為最小值;逐步外推,對其逐步外推,對其外面一層循環(huán)進行外面一層循環(huán)進行測試測試。測試時保持所有外層循環(huán)的循環(huán)變。測試時保持所有外層循環(huán)的循環(huán)變量取最小值,所有其他嵌套內(nèi)層循環(huán)的循量取最小值,所有其他嵌套內(nèi)層循環(huán)的循環(huán)變量取環(huán)變量取“典型典型”值。值。反復進行,直到所有各層循環(huán)測試反復進行,直到所有各層循環(huán)測試完畢。完畢。(2)嵌套循環(huán)嵌套循環(huán)60 對全部各層循環(huán)同時取最小循環(huán)次數(shù),對全部各層循環(huán)同時取最小循環(huán)次數(shù),或者同時取最大循環(huán)次數(shù)或者同時取最大循環(huán)次數(shù)(3)連鎖循環(huán)連鎖循環(huán)如果各個循環(huán)如果各個循環(huán)互相獨立互相獨立,則可以用與簡,則可以用與簡單循環(huán)相同的方法進行測試。但如果幾單循環(huán)相同的方法進行測試。但如果幾個循環(huán)不個循環(huán)不是互相獨立是互相獨立的,則需要使用測的,則需要使用測試嵌套循環(huán)的辦法來處理。試嵌套循環(huán)的辦法來處理。(4)非結(jié)構(gòu)循環(huán)非結(jié)構(gòu)循環(huán)這一類循環(huán)應該使用結(jié)構(gòu)化程序設計方這一類循環(huán)應該使用結(jié)構(gòu)化程序設計方法重新設計測試用例。法重新設計測試用例。61基本路徑測試基本路徑測試基本路徑測試方法把覆蓋的路徑數(shù)壓縮基本路徑測試方法把覆蓋的路徑數(shù)壓縮到一定限度內(nèi),到一定限度內(nèi),程序中的循環(huán)體最多只程序中的循環(huán)體最多只執(zhí)行一次執(zhí)行一次。它是在程序控制流圖的基礎上,它是在程序控制流圖的基礎上,分析控分析控制構(gòu)造的環(huán)路復雜性制構(gòu)造的環(huán)路復雜性,導出基本可執(zhí)行導出基本可執(zhí)行路徑集合路徑集合,設計測試用例的設計測試用例的方法。設計方法。設計出的測試用例要保證在測試中,程序的出的測試用例要保證在測試中,程序的每一個可執(zhí)行語句至少要執(zhí)行一次。每一個可執(zhí)行語句至少要執(zhí)行一次。621.程序的控制流圖程序的控制流圖符號符號為控制流圖的一個結(jié)點,表示一為控制流圖的一個結(jié)點,表示一個或多個無分支的個或多個無分支的PDL語句或源程序語語句或源程序語句。箭頭為邊,表示控制流的方向。句。箭頭為邊,表示控制流的方向。63在選擇或多分支結(jié)構(gòu)中,分支的匯聚處在選擇或多分支結(jié)構(gòu)中,分支的匯聚處應有一個匯聚結(jié)點。應有一個匯聚結(jié)點。邊和結(jié)點圈定的區(qū)域叫做區(qū)域邊和結(jié)點圈定的區(qū)域叫做區(qū)域,當對區(qū),當對區(qū)域計數(shù)時,圖形外的區(qū)域也應記為一個域計數(shù)時,圖形外的區(qū)域也應記為一個區(qū)域。區(qū)域。如果判斷中的條件表達式是由一個或多如果判斷中的條件表達式是由一個或多個邏輯運算符個邏輯運算符(OR,AND,.)連接的復連接的復合條件表達式,則需改為合條件表達式,則需改為 一系列一系列只有單只有單個條件的嵌套的判斷個條件的嵌套的判斷。6465abyxxif a or b then procedure x else procedure y;.662.程序環(huán)路復雜性程序環(huán)路復雜性程序的環(huán)路復雜性給出了程序的環(huán)路復雜性給出了程序基本路徑程序基本路徑集中的獨立路徑條數(shù)集中的獨立路徑條數(shù),這是確保程序中,這是確保程序中每個可執(zhí)行語句至少執(zhí)行一次所必需的每個可執(zhí)行語句至少執(zhí)行一次所必需的測試用例數(shù)目的上界。測試用例數(shù)目的上界。從控制流圖來看,一條獨立路徑是至少從控制流圖來看,一條獨立路徑是至少包含有一條在其他獨立路徑中從未有過包含有一條在其他獨立路徑中從未有過的邊的路徑。的邊的路徑。67例如,在圖示的控制流圖中,一組獨立例如,在圖示的控制流圖中,一組獨立的路徑是的路徑是path1:1-11path2:1-2-3-4-5-10-1-11path3:1-2-3-6-8-9-10-1-11path4:1-2-3-6-7-9-10-1-11路徑路徑 path1,path2,path3,path4組成組成了控制流圖的一個基本路徑集。了控制流圖的一個基本路徑集。683.導出測試用例導出測試用例導出測試用例,導出測試用例,確?;韭窂郊械拿看_保基本路徑集中的每一條路徑的執(zhí)行一條路徑的執(zhí)行。根據(jù)判斷結(jié)點給出的條件,選擇適當?shù)母鶕?jù)判斷結(jié)點給出的條件,選擇適當?shù)臄?shù)據(jù)以保證某一條路徑可以被測試到數(shù)據(jù)以保證某一條路徑可以被測試到 用邏輯覆蓋方法用邏輯覆蓋方法。每個每個測試用例執(zhí)行之后測試用例執(zhí)行之后,與預期結(jié)果進與預期結(jié)果進行比較行比較。如果所有測試用例都執(zhí)行完畢,。如果所有測試用例都執(zhí)行完畢,則可以確信程序中所有的可執(zhí)行語句至則可以確信程序中所有的可執(zhí)行語句至少被執(zhí)行了一次。少被執(zhí)行了一次。69必須注意,一些獨立的路徑必須注意,一些獨立的路徑(如例中的如例中的path1),往往不是完全孤立的,有時它往往不是完全孤立的,有時它是程序正常的控制流的一部分,這時,是程序正常的控制流的一部分,這時,這些路徑的測試可以是另一條路徑測試這些路徑的測試可以是另一條路徑測試的一部分。的一部分。70等價類劃分等價類劃分等價類劃分是一種典型的黑盒測試方法,等價類劃分是一種典型的黑盒測試方法,使用這一方法時,使用這一方法時,完全不考慮程序的內(nèi)完全不考慮程序的內(nèi)部結(jié)構(gòu)部結(jié)構(gòu),只依據(jù)程序的規(guī)格說明來設計只依據(jù)程序的規(guī)格說明來設計測試用例測試用例。等價類劃分方法等價類劃分方法把所有可能的輸入數(shù)據(jù)把所有可能的輸入數(shù)據(jù),即程序的輸入域即程序的輸入域劃分成若干部分劃分成若干部分,然后,然后從每一部分中選取少數(shù)有代表性的數(shù)據(jù)從每一部分中選取少數(shù)有代表性的數(shù)據(jù)做為測試用例做為測試用例。71使用這一方法設計測試用例要經(jīng)歷使用這一方法設計測試用例要經(jīng)歷劃分劃分等價類等價類(列出等價類表)和(列出等價類表)和選取測試用選取測試用例例兩步。兩步。(1)劃分等價類劃分等價類等價類是指某個輸入域的子集合。在該等價類是指某個輸入域的子集合。在該子集合中,子集合中,各個輸入數(shù)據(jù)對于揭露程序各個輸入數(shù)據(jù)對于揭露程序中的錯誤都是等效的中的錯誤都是等效的。測試某等價類的。測試某等價類的代表值就等價于對這一類其他值的測試。代表值就等價于對這一類其他值的測試。72等價類的劃分有兩種不同的情況:等價類的劃分有兩種不同的情況:有效等價類有效等價類:是指對于程序的規(guī)格說:是指對于程序的規(guī)格說明來說,是合理的,有意義的輸入數(shù)據(jù)明來說,是合理的,有意義的輸入數(shù)據(jù)構(gòu)成的集合。構(gòu)成的集合。無效等價類無效等價類:是指對于程序的規(guī)格說:是指對于程序的規(guī)格說明來說,是不合理的,無意義的輸入數(shù)明來說,是不合理的,無意義的輸入數(shù)據(jù)構(gòu)成的集合。據(jù)構(gòu)成的集合。在設計測試用例時,要同時考慮有效等在設計測試用例時,要同時考慮有效等價類和無效等價類的設計。價類和無效等價類的設計。73劃分等價類等價類的原則。劃分等價類等價類的原則。1)如果輸入條件規(guī)定了取值范圍,或值如果輸入條件規(guī)定了取值范圍,或值的個數(shù),則可以確立一個有效等價類和的個數(shù),則可以確立一個有效等價類和兩個無效等價類。兩個無效等價類。例如,在程序的規(guī)格說明中,對輸入條例如,在程序的規(guī)格說明中,對輸入條件有一句話:件有一句話:“項數(shù)可以從項數(shù)可以從1到到999”則有效等價類是則有效等價類是“1項數(shù)項數(shù)999”兩個無效等價類是兩個無效等價類是“項數(shù)項數(shù)1”或或“項數(shù)項數(shù)999”。74在數(shù)軸上表示成在數(shù)軸上表示成:2)如果輸入條件規(guī)定了輸入值的集合,或如果輸入條件規(guī)定了輸入值的集合,或者是規(guī)定了者是規(guī)定了“必須如何必須如何”的條件,這時可的條件,這時可確立一個有效等價類和一個無效等價類。確立一個有效等價類和一個無效等價類。例如,在例如,在Pascal語言中對變量標識符規(guī)定語言中對變量標識符規(guī)定為為“以字母打頭的以字母打頭的串串”。那么所有以。那么所有以字母打頭的構(gòu)成有效等價類,而不在此集字母打頭的構(gòu)成有效等價類,而不在此集合內(nèi)(不以字母打頭)的歸于無效等價類。合內(nèi)(不以字母打頭)的歸于無效等價類。753)如果輸入條件是一個布爾量,則可以確如果輸入條件是一個布爾量,則可以確定一個有效等價類和一個無效等價類。定一個有效等價類和一個無效等價類。4)如果規(guī)定了輸入數(shù)據(jù)的一組值,而且程如果規(guī)定了輸入數(shù)據(jù)的一組值,而且程序要對每個輸入值分別進行處理。序要對每個輸入值分別進行處理。這時可這時可為為 每一個輸入值確立一個有效等價類,此每一個輸入值確立一個有效等價類,此外針對這組值確立一個無效等價類,它是外針對這組值確立一個無效等價類,它是所有不允許的輸入值的集合。所有不允許的輸入值的集合。76 例如,在教師上崗方案中規(guī)定對教授、例如,在教師上崗方案中規(guī)定對教授、副教授、講師和助教分別計算分數(shù),做副教授、講師和助教分別計算分數(shù),做相應的處理。因此可以確定相應的處理。因此可以確定4個有效等個有效等價類為教授、副教授、講師和助教,一價類為教授、副教授、講師和助教,一個無效等價類,它是所有不符合以上身個無效等價類,它是所有不符合以上身分的人員的輸入值的集合。分的人員的輸入值的集合。5)如果規(guī)定了輸入數(shù)據(jù)必須遵守的規(guī)則,如果規(guī)定了輸入數(shù)據(jù)必須遵守的規(guī)則,則可以確立一個有效等價類(符合規(guī)則)則可以確立一個有效等價類(符合規(guī)則)和若干個無效等價類(從不同角度違反和若干個無效等價類(從不同角度違反規(guī)則)。規(guī)則)。77 例如,例如,Pascal語言規(guī)定語言規(guī)定“一個語句必須一個語句必須以分號以分號;結(jié)束結(jié)束”。這時可以確定一。這時可以確定一個有效等價類個有效等價類“以以;結(jié)束結(jié)束”,若干,若干個無效等價類個無效等價類“以以:結(jié)束結(jié)束”、“以以,結(jié)束結(jié)束”、“以以 結(jié)束結(jié)束”、“以以LF結(jié)束結(jié)束”等。等。(2)確立測試用例確立測試用例在確立了等價類之后,建立等價類表,在確立了等價類之后,建立等價類表,列出所有劃分出的等價類。列出所有劃分出的等價類。78再從劃分出的等價類中按以下原則選擇再從劃分出的等價類中按以下原則選擇測試用例:測試用例:1)為每一個等價類規(guī)定一個唯一編號;為每一個等價類規(guī)定一個唯一編號;2)設計一個新的測試用例,使其設計一個新的測試用例,使其盡可能盡可能多地覆蓋尚未被覆蓋的有效等價類多地覆蓋尚未被覆蓋的有效等價類,重,重復這一步,直到所有的有效等價類都被復這一步,直到所有的有效等價類都被覆蓋為止;覆蓋為止;3)設計一個新的測試用例,使其設計一個新的測試用例,使其僅覆蓋僅覆蓋一個尚未被覆蓋的無效等價類一個尚未被覆蓋的無效等價類,重復這,重復這一步,直到所有的無效等價類都被覆蓋一步,直到所有的無效等價類都被覆蓋為止。為止。79用等價類劃分法設計測試用例的實例用等價類劃分法設計測試用例的實例 在某一在某一PASCAL語言版本中規(guī)定:語言版本中規(guī)定:“標識符是由字母開頭標識符是由字母開頭,后跟字母或數(shù)后跟字母或數(shù)字的任意組合構(gòu)成字的任意組合構(gòu)成。有效字符數(shù)為有效字符數(shù)為8個個,最大字符數(shù)為最大字符數(shù)為80個個?!辈⑶乙?guī)定:并且規(guī)定:“標識符必須先說明標識符必須先說明,再使再使用用?!薄霸谕徽f明語句中在同一說明語句中,標識符至標識符至少必須有一個少必須有一個?!?0用等價類劃分方法,建立輸入等價類表用等價類劃分方法,建立輸入等價類表:81下面選取了下面選取了 9 個測試用例,它們覆蓋了所個測試用例,它們覆蓋了所有的等價類。有的等價類。VAR x,T1234567:REAL;BEGIN x:=3.414;T1234567:=2.732;.(1),(2),(4),(8),(9),(12),(14)VAR :REAL;(3)VAR x,:,:REAL;(5)82 VAR T12345678:REAL;(6)VAR T12345.:REAL;(7)多于多于80個字符個字符 VAR T$:CHAR;(10)VAR GOTO:INTEGER;(11)VAR 2T:REAL;(13)VAR PAR:REAL;(15)BEGIN .PAP:=SIN(3.14*0.8)/6;83邊界值分析邊界值分析邊界值分析也是一種黑盒測試方法,是邊界值分析也是一種黑盒測試方法,是對等價類劃分方法的補充。對等價類劃分方法的補充。人們從長期的測試工作經(jīng)驗得知,人們從長期的測試工作經(jīng)驗得知,大量大量的錯誤是發(fā)生在輸入或輸出范圍的邊界的錯誤是發(fā)生在輸入或輸出范圍的邊界上,而不是在輸入范圍的內(nèi)部。上,而不是在輸入范圍的內(nèi)部。因此針因此針對各種邊界情況設計測試用例,對各種邊界情況設計測試用例,可以查可以查出更多的錯誤出更多的錯誤。84比如,在做三角形計算時,要輸入三角比如,在做三角形計算時,要輸入三角形的三個邊長:形的三個邊長:A、B和和C。我們應注意我們應注意到這三個數(shù)值應當滿足到這三個數(shù)值應當滿足 A0、B0、C0、ABC、ACB、BCA,才能才能構(gòu)成三角形。但如果把六個不等式中的構(gòu)成三角形。但如果把六個不等式中的任何一個大于號任何一個大于號“”錯寫成大于等于錯寫成大于等于號號“”,那就不能構(gòu)成三角形。問題,那就不能構(gòu)成三角形。問題恰出現(xiàn)在容易被疏忽的邊界附近。恰出現(xiàn)在容易被疏忽的邊界附近。85這里所說的邊界是指,相當于輸入等價這里所說的邊界是指,相當于輸入等價類和輸出等價類而言,稍高于其邊界值類和輸出等價類而言,稍高于其邊界值及稍低于其邊界值的一些特定情況。及稍低于其邊界值的一些特定情況。使用邊界值分析方法設計測試用例,首使用邊界值分析方法設計測試用例,首先應確定邊界情況。先應確定邊界情況。應當選取正好等于,應當選取正好等于,剛剛大于,或剛剛小于邊界的值做為測剛剛大于,或剛剛小于邊界的值做為測試數(shù)據(jù)試數(shù)據(jù),而不是選取等價類中的典型值,而不是選取等價類中的典型值或任意值做為測試數(shù)據(jù)。或任意值做為測試數(shù)據(jù)。86錯誤推測法錯誤推測法人們也可以靠經(jīng)驗和直覺推測程序中可人們也可以靠經(jīng)驗和直覺推測程序中可能存在的各種錯誤,從而有針對性地編能存在的各種錯誤,從而有針對性地編寫檢查這些錯誤的例子。這就是錯誤推寫檢查這些錯誤的例子。這就是錯誤推測法。測法。錯誤推測法的基本想法是:錯誤推測法的基本想法是:列舉出程序列舉出程序中所有可能有的錯誤和容易發(fā)生錯誤的中所有可能有的錯誤和容易發(fā)生錯誤的特殊情況,根據(jù)它們選擇測試用例特殊情況,根據(jù)它們選擇測試用例。87因果圖因果圖因果圖的適用范圍因果圖的適用范圍 如果在測試時必須考慮如果在測試時必須考慮輸入條件的各種輸入條件的各種組合組合,可使用一種適合于描述,可使用一種適合于描述對于多種對于多種條件的組合條件的組合,相應產(chǎn)生多個動作相應產(chǎn)生多個動作的形式的形式來設計測試用例,這就需要利用因果圖。來設計測試用例,這就需要利用因果圖。因果圖方法最終生成的就是因果圖方法最終生成的就是判定表判定表。它。它適合于檢查程序輸入條件的各種組合情適合于檢查程序輸入條件的各種組合情況。況。用因果圖生成測試用例的基本步驟用因果圖生成測試用例的基本步驟88 1)分析軟件規(guī)格說明描述中,哪些是分析軟件規(guī)格說明描述中,哪些是原原因因(即輸入條件或輸入條件的等價類即輸入條件或輸入條件的等價類),哪些是哪些是結(jié)果結(jié)果(即輸出條件即輸出條件),并給每個原,并給每個原因和結(jié)果賦予一個標識符。因和結(jié)果賦予一個標識符。2)分析軟件規(guī)格說明描述的語義,找出分析軟件規(guī)格說明描述的語義,找出原因與結(jié)果之間原因與結(jié)果之間,原因與原因之間原因與原因之間對應對應的關系的關系?根據(jù)這些關系,畫出因果圖。根據(jù)這些關系,畫出因果圖。3)由于語法或環(huán)境限制由于語法或環(huán)境限制,有些原因與原有些原因與原因之間,原因與結(jié)果之間的組合情況不因之間,原因與結(jié)果之間的組合情況不可能出現(xiàn)。為表明這些特殊情況,在因可能出現(xiàn)。為表明這些特殊情況,在因果圖上用一些記號果圖上用一些記號標明約束或限制條件標明約束或限制條件。89 4)把因果圖轉(zhuǎn)換成判定表。把因果圖轉(zhuǎn)換成判定表。5)把判定表的每一列拿出來作為依據(jù),把判定表的每一列拿出來作為依據(jù),設計測試用例。設計測試用例。在因果圖中出現(xiàn)的基本符號在因果圖中出現(xiàn)的基本符號 通常在因果圖中用通常在因果圖中用Ci表示原因,用表示原因,用Ei表表示結(jié)果,各結(jié)點表示狀態(tài),可取值示結(jié)果,各結(jié)點表示狀態(tài),可取值“0”或或“1”?!?”表示某狀態(tài)不出現(xiàn),表示某狀態(tài)不出現(xiàn),“1”表示某狀態(tài)出現(xiàn)。表示某狀態(tài)出現(xiàn)。90主要的原因和結(jié)果之間的關系有主要的原因和結(jié)果之間的關系有:91表示約束條件的符號表示約束條件的符號為了表示原因與原因之間,結(jié)果與結(jié)果為了表示原因與原因之間,結(jié)果與結(jié)果之間可能存在的約束條件,在因果圖中之間可能存在的約束條件,在因果圖中可以附加一些表示約束條件的符號。可以附加一些表示約束條件的符號。92 例如,有一個處理單價為例如,有一個處理單價為5角錢的飲料的角錢的飲料的自動售貨機軟件測試用例的設計。其規(guī)格自動售貨機軟件測試用例的設計。其規(guī)格說明如下:說明如下:若若投入投入5角錢或角錢或1元錢的硬幣,元錢的硬幣,押下押下橙橙汁或啤酒的按鈕,則相應的飲料就汁或啤酒的按鈕,則相應的飲料就送出來。若售貨機送出來。若售貨機沒有零錢找沒有零錢找,則一個顯,則一個顯示零錢找完的紅燈亮,這時在投入示零錢找完的紅燈亮,這時在投入1元硬幣并押下按鈕后,飲料不送出來而且元硬幣并押下按鈕后,飲料不送出來而且1元硬幣也退出來;若元硬幣也退出來;若有零錢找有零錢找,則顯示,則顯示零錢找完的紅燈滅,在送出飲料的同零錢找完的紅燈滅,在送出飲料的同時退還時退還5角硬幣。角硬幣?!?31)分析這一段說明,列出原因和結(jié)果分析這一段說明,列出原因和結(jié)果原因原因:1.售貨機有零錢找售貨機有零錢找 2.投入投入1元硬幣元硬幣 3.投入投入5角硬幣角硬幣 4.押下橙汁按鈕押下橙汁按鈕 5.押下啤酒按鈕押下啤酒按鈕建立中間結(jié)點,表示處理中間狀態(tài)建立中間結(jié)點,表示處理中間狀態(tài)11.投入投入1元硬幣且押下飲料按鈕元硬幣且押下飲料按鈕12.押下橙汁或啤酒的按鈕押下橙汁或啤酒的按鈕13.應當找應當找5角零錢并且售貨機有零錢找角零錢并且售貨機有零錢找14.錢已付清錢已付清94 結(jié)果:結(jié)果:21.售貨機零錢找完燈亮售貨機零錢找完燈亮 22.退還退還1元硬幣元硬幣 23.退還退還5角硬幣角硬幣 24.送出橙汁飲料送出橙汁飲料 25.送出啤酒飲料送出啤酒飲料 2)畫出因果圖。畫出因果圖。所有原因結(jié)點列在左所有原因結(jié)點列在左邊,所有結(jié)果結(jié)點列在右邊。邊,所有結(jié)果結(jié)點列在右邊。3)由于由于 2 與與 3,4 與與 5 不能同時發(fā)生,不能同時發(fā)生,分別加上約束條件分別加上約束條件E。4)因果圖因果圖 5)轉(zhuǎn)換成判定表轉(zhuǎn)換成判定表95 96 97使用各種測試方法的綜合策略使用各種測試方法的綜合策略n n在任何情況下都必須使用在任何情況下都必須使用邊界值分析法邊界值分析法。用這種方法設計出測試用例發(fā)現(xiàn)程序錯用這種方法設計出測試用例發(fā)現(xiàn)程序錯誤的能力最強。誤的能力最強。n n必要時用必要時用等價類劃分法等價類劃分法補充一些測試用補充一些測試用例。例。n n用用錯誤推測法錯誤推測法再追加一些測試用例。再追加一些測試用例。n n對照程序邏輯,檢查已有測試用例的邏對照程序邏輯,檢查已有測試用例的邏輯覆蓋程度。如果未達到要求的覆蓋標輯覆蓋程度。如果未達到要求的覆蓋標準,應再補充足夠的測試用例。準,應再補充足夠的測試用例。98n n如果程序的功能說明中含有輸入條件的如果程序的功能說明中含有輸入條件的組合情況,則一開始就可選用組合情況,則一開始就可選用因果圖法因果圖法。99軟件測試的策略軟件測試的策略測試過程按測試過程按4個步驟進行,即個步驟進行,即單元測試單元測試、組裝測試組裝測試、確認測試確認測試和和系統(tǒng)測試系統(tǒng)測試。開始是開始是單元測試單元測試,集中對用源代碼實現(xiàn),集中對用源代碼實現(xiàn)的每一個程序單元進行測試,檢查各個的每一個程序單元進行測試,檢查各個程序模塊是否正確地實現(xiàn)了規(guī)定的功能。程序模塊是否正確地實現(xiàn)了規(guī)定的功能。組裝測試組裝測試把已測試過的模塊組裝起來,把已測試過的模塊組裝起來,主要對與設計相關的軟件體系結(jié)構(gòu)的構(gòu)主要對與設計相關的軟件體系結(jié)構(gòu)的構(gòu)造進行測試。造進行測試。100被測被測模塊模塊單元單元測試測試集成集成測試測試被測被測模塊模塊單元單元測試測試被測被測模塊模塊單元單元測試測試確認確認測試測試系統(tǒng)系統(tǒng)測試測試系系統(tǒng)統(tǒng)其其他他元元素素軟軟件件需需求求設設計計信信息息已已集集成的成的軟件軟件已已確確認的認的軟件軟件可交可交付的付的軟件軟件已經(jīng)過已經(jīng)過測試的測試的模塊模塊101確認測試確認測試則是要檢查已實現(xiàn)的軟件是否則是要檢查已實現(xiàn)的軟件是否滿足了需求規(guī)格說明中確定了的各種需滿足了需求規(guī)格說明中確定了的各種需求,以及軟件配置是否完全、正確。求,以及軟件配置是否完全、正確。系統(tǒng)測試系統(tǒng)測試把已經(jīng)經(jīng)過確認的軟件納入實把已經(jīng)經(jīng)過確認的軟件納入實際運行環(huán)境中,與其他系統(tǒng)成份組合在際運行環(huán)境中,與其他系統(tǒng)成份組合在一起進行測試。一起進行測試。102單元測試單元測試(Unit Testing)單元測試又稱模塊測試,單元測試又稱模塊測試,是針對軟件設是針對軟件設計的最小單位計的最小單位 程序模塊程序模塊,進行正確性進行正確性檢驗檢驗的測試工作。其目的在于發(fā)現(xiàn)各模的測試工作。其目的在于發(fā)現(xiàn)各模塊內(nèi)部可能存在的各種差錯。塊內(nèi)部可能存在的各種差錯。單元測試需要單元測試需要從程序的內(nèi)部結(jié)構(gòu)出發(fā)設從程序的內(nèi)部結(jié)構(gòu)出發(fā)設計測試用例計測試用例。多個模塊可以平行地獨立。多個模塊可以平行地獨立進行單元測試。進行單元測試。1031.單元測試的內(nèi)容單元測試的內(nèi)容在單元測試時,測試者需要依據(jù)詳細設在單元測試時,測試者需要依據(jù)詳細設計說明書和源程序清單,了解該模塊的計說明書和源程序清單,了解該模塊的I/O條件和模塊的邏輯結(jié)構(gòu),主要采用白條件和模塊的邏輯結(jié)構(gòu),主要采用白盒測試的測試用例,輔之以黑盒測試的盒測試的測試用例,輔之以黑盒測試的測試用例,使之對任何合理的輸入和不測試用例,使之對任何合理的輸入和不合理的輸入,都能鑒別和響應。合理的輸入,都能鑒別和響應。104模塊模塊出錯處理出錯處理獨立路徑獨立路徑模塊接口模塊接口局部數(shù)據(jù)結(jié)構(gòu)局部數(shù)據(jù)結(jié)構(gòu)邊界條件邊界條件105(1)模塊接口測試模塊接口測試在單元測試的開始,應對在單元測試的開始,應對通過被測模塊通過被測模塊的數(shù)據(jù)流的數(shù)據(jù)流進行測試。測試項目包括:進行測試。測試項目包括:調(diào)用本模塊的輸入?yún)?shù)是否正確;調(diào)用本模塊的輸入?yún)?shù)是否正確;本模塊調(diào)用子模塊時輸入給子模塊的本模塊調(diào)用子模塊時輸入給子模塊的參數(shù)是否正確;參數(shù)是否正確;全局量的定義在各模塊中是否一致;全局量的定義在各模塊中是否一致;106在做在做內(nèi)外存交換內(nèi)外存交換時要考慮:時要考慮:文件屬性是否正確;文件屬性是否正確;OPEN與與CLOSE語句是否正確;語句是否正確;緩沖區(qū)容量與記錄長度是否匹配;緩沖區(qū)容量與記錄長度是否匹配;在進行讀寫操作之前是否打開了文件;在進行讀寫操作之前是否打開了文件