




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、單元測試與JUNIT主要內容1. 單元測試介紹 2. 單元測試 Quick Start3. 使用JUNIT4. 測試的一些技巧5. 邊界條件6. MOCK對象簡介7. 單元測試與軟件設計1.單元測試介紹 1.1什么是單元測試 單元測試是開發(fā)者寫的一小段代碼,用于檢驗被測代碼的一個很小的、明確的功能是否正確。通常而言,一個單元測試是用于判斷某個特定條件下某個特定的函數(shù)的行為。 執(zhí)行單元測試,是為了證明某段代碼的行為確定和開發(fā)者所期望的一致。1.2單元測試的目的 及早發(fā)現(xiàn)軟件開發(fā)過程中實現(xiàn)或者設計帶來的缺陷 跟蹤詳細設計文檔中設計的實現(xiàn),發(fā)現(xiàn)詳細設計文檔中存在的錯誤 驗證單元代碼和詳細設計文檔的一
2、致性 發(fā)現(xiàn)在編碼過程中引入的錯誤單元測試標準是什么 單元測試標準通常為詳細設計說明書 但是在沒有詳細設計說明書的情況下可以以注釋為測試標準單元測試過程 單元測試計劃 單元測試設計 單元測試實現(xiàn) 單元測試執(zhí)行 單元測試評估單元測試計劃 時間表 工作量 任務分配 資源安排 測試工具 結束標準 風險分析 風險應對 輸出單元測試計劃文檔單元測試設計 對哪些單元進行測試 被測單元的關系 被測單元與其他模塊的關系 測試策略選擇 如何設計測試用例 如何設計單元測試代碼 輸出單元測試用例文檔單元測試實現(xiàn) 編寫測試用例 編寫測試規(guī)程 測試腳本編寫 測試驅動構建 樁構建 輸出測試用例 輸出測試規(guī)程 輸出測試代碼和
3、腳本單元測試執(zhí)行 搭建測試環(huán)境 執(zhí)行測試腳本 記錄測試結果 跟蹤缺陷 回歸測試 輸出單元測試報告單元測試策略 自頂向下的單元測試 方法 先對最頂層的單元進行測試,把頂層單元所調用的單元做成樁模塊。其次對第二層單元進行測試,使用上面已測試的單元做驅動模塊。依次類推直至測試完所有的模塊。 優(yōu)點 可以節(jié)省驅動函數(shù)開發(fā)的工作量,測試效率較高 缺點 隨著被測單元一個個的加入,測試過程將變得復雜,并且開發(fā)和維護的成本將增加。 自底向上的單元測試 孤立的單元測試 混合的單元測試 自底向上的單元測試 先對最底層的單元進行測試,模擬主調單元構建驅動模塊。然后再對上面一層做單元測試,用下面已經測試通過的模塊做樁模
4、塊。依次類推,直至測試完所有的模塊。 優(yōu)點 可以節(jié)省樁模塊開發(fā)的工作量,測試效率高 缺點 不是純粹的單元測試,底層函數(shù)的測試質量對上層函數(shù)的測試將產生很大的影響。 孤立的單元測試 方法 不考慮模塊和模塊之間的關系,為每個模塊設立樁模塊和驅動模塊。每個模塊進行獨立的單元測試 優(yōu)點 該策略最簡單,最容易操作。可以達到很高的覆蓋率。似乎純粹的單元測試 缺點 該策略效率很低,需要構建大量的驅動和樁 混合的單元測試 自頂向下和自底向上的測試策略綜合了集成的概念,隨著單元測試的進行,可以看到系統(tǒng)一個初步集成的概貌,但是測試覆蓋率會越來越難保證。并且在每個單元測試之前必須保證相關的單元的正確性。孤立的測試策
5、略比較獨立,覆蓋率容易保證,并且可以并行進行,但工作量大。所以采用混合方法比較好。單元測試用例設計 單元測試用例設計方法 黑盒 白盒 單元測試用例編寫思路 為系統(tǒng)運行起來設計測試用例 為正向測試設計用例 為逆向測試設計用例 為滿足特殊需求而設計用例 為代碼覆蓋而設計測試用例 單元測試用例設計五要點 單元接口 局部數(shù)據(jù)結構 獨立路徑 出錯處理 邊界條件 理解需求和設計 設計測試用例 搭建單元測試環(huán)境 執(zhí)行測試 補充和完善測試用例 分析結果,給出評價1.3 我需要做什么呢 它的行為和我的期望一致嗎? 它的行為一直和我的期望一致嗎? 我可以依賴單元測試嗎? 單元測試說明我的意圖了嗎?1.4不寫單元測
6、試的借口 編寫單元測試太花時間了 運行測試的時間太長了 測試代碼并不是我的工作 我并不清楚代碼的行為,所以也就無從測試 但是這些代碼都能編譯通過 公司請我是為了寫代碼,而不是寫單元測試 如果我讓測試員失去工作,我會覺得內疚 公司不會讓我在真實系統(tǒng)中運行單元測試2.單元測試 Quick Start2.1測試對象尋找數(shù)組中的最大數(shù):public class Largest public static int largest(int list) int index, max=Integer.MAX_VALUE; for (index = 0; index max) max = listindex;
7、return max; 2.2設計測試排序測試:【9,7,8】9【7,9,8】9【7,8,9】9重復值:【7,9,8,9】 9單值:【1】 1負值:【-9,-8,-7】 -7.空值2.3執(zhí)行測試 執(zhí)行測試并修正錯誤 理解單元測試3.使用JUNITJunit簡介Junit的定位Junit的安裝Junit的體系結構Junit的使用3.1構建單元測試 TestAccount.java Account.java準備要測試的條件調用要測試的方法驗證被測試方法的行為是否和結果一致完成后清理各種資源testCreateAccount()testCreateAccountDef()testCreateAcco
8、untDup()createAccount()3.2 JUNIT的各種斷言lassertEquals(String message,expected,actual)lassertEquals(String message,expected,actual,tolerance)lassertNull (String message,Object object)lassertNotNull (String message,Object object)lassertSame (String message,expected,actual)lassertNotSame (String message,e
9、xpected,actual)lassertTrue (String message,boolean condition)lassertFalse (String message,boolean condition)lfail (String message)l自定義斷言3.3 JUNIT框架import junit.framework.*; /引入測試包public class TestSimple extends TestCase /繼承 TestCase public TestSimple(String name) /默認使用父類的實例化方法 super(name); public vo
10、id testAdd() /書寫以test開頭的斷言,凡是以test開頭的都會 /被junit自動運行 assertEquals(2, 1+1); public void testAdds() /一個測試方法里也可以有多個斷言 assertEquals(2, 1+1); assertEquals(4, 2+2); assertEquals(-8, -12+4); 測試類也能調用其他測試類:單獨的類、包、甚至完整的一個系統(tǒng)。這可以通過創(chuàng)建test suite來取得。任何測試類都能包含一個名為suite的靜態(tài)方法: Public static Test suite(); 現(xiàn)假設有第2個類TestC
11、lassTwo,它使用brute-force算法來尋找旅行銷售商Bob的最短行程。但這個算法是復雜度是指數(shù)級的。默認情況下你不想包括這些測試。3.4 JUNIT測試的組成(1)import junit.framework.*;public class TestClassTwo extends TestCase public TestClassTwo(String method) super(method); public void testLongRunner() public void testShortTest() public void testAnotherShortTest() pu
12、blic static Test suite() TestSuite suite = new TestSuite(); suite.addTest(new TestClassTwo(“testShortTest”);/裝入測試方法 suite.addTest(new TestClassTwo(testAnotherShortTest); return suite; 3.4 JUNIT測試的組成(2)import junit.framework.*;public class TestClassComposite extends TestCase public TestClassComposite
13、(String method) super(method); static public Test suite() TestSuite suite = new TestSuite();/執(zhí)行第一個測試類所有的測試 suite.addTestSuite(TestClassOne.class); /執(zhí)行第二個測試類中指定的測試 suite.addTest(TestClassTwo.suite(); return suite; 假設對于每個測試,你都需要某種數(shù)據(jù)庫連接,這時,你不需要在每個測試方法中重復建立連接和釋放連接了,而只須在setup和teardown方法中分別建立和釋放連接。 執(zhí)行每個測試
14、方法之前會執(zhí)行setup,之后會執(zhí)行teardownJUnit和異常 對測試而言,下面兩種異常我們可能會感興趣: 從測試代碼拋出的可預測異常。 由于某個某塊(或代碼)發(fā)生嚴重錯誤,而拋出的不可預測異常。 如有一個名為sortMyList()的方法,如果傳入參數(shù)是一個nulllist,那么我們希望該方法拋出一個異常。在這種情況下,我們就需要顯式地測試這一點。 assertTure(true)表示“我預期控制流程會達到這個地方。 Junit可以捕獲任何異常,并且把它報告為一個錯誤,這些都不需要你的參與。更好的是,Junit不只是讓一個斷言失敗,而是能夠跟蹤整個堆棧,并且報告bug的堆棧調用順序,當
15、你需要查找一個失敗測試的原因時,這將非常有用。4.測試哪些內容測試哪些內容4.1測試內容(Right-BICEP)Right-結果是否正確?B-是否所有的邊界條件都是正確的?I-能查一下反向關聯(lián)嗎?C-能使用其它手段交叉檢查一下結果嗎?E-你是否可以強制錯誤條件發(fā)生?P-是否滿足性能要求? 完全偽造或者不一致的輸入數(shù)據(jù),例如一個名為“!*w:gjagja;,/.d;”的文件。 格式錯誤的數(shù)據(jù),例如沒有頂層域名的電子郵件地址,如fredfoobar 空值或不完整的值 一些與意料中的合理值相去甚遠的數(shù)值。如一個歲數(shù)為10000歲。 如果要求的是一個不允許出現(xiàn)重復數(shù)值的list,但是傳入的是一個存在
16、重復數(shù)值的list如果要求的是一個有序list,但是傳入的是一個無序list;或者反之事情到達的次序是錯誤的,或者碰巧和期望的次序不一致,如未登陸系統(tǒng)之前,就嘗試打印文檔??赡艿倪吔缰捣聪蜿P聯(lián) 如對結果進行平方的方式來檢查一個計算平方根的函數(shù),然后測試結果是否和原數(shù)據(jù)很接近。 類似地,為了檢查某條記錄是否成功地插入了數(shù)據(jù)庫,你也可以通過查詢這條記錄來驗證。其它手段交叉檢查 通常計算一個量會有一種以上的算法。我們可能會基于運行效率或者其他的特性,來選擇算法,那是我們要在產品中使用的,但在測試時可以使用剩下的算法來做交叉測試。其它手段交叉檢查 另一種辦法,使用類本身不同組成部分的數(shù)據(jù),并且確信它們
17、能“合起來”。如,正在做一個圖書館的數(shù)據(jù)系統(tǒng)。在這個系統(tǒng)中,對每一本具體的書,它的數(shù)量永遠是平衡的。 我們可以用一種數(shù)量檢查另一種數(shù)量。強制產生錯誤條件 真實世界中,錯誤總是會發(fā)生:磁盤會滿,網絡連線會斷開,電子郵件會多得像掉進了黑洞,而程序會崩潰。你應當能夠通過強制引發(fā)錯誤,來測試你的代碼是如何處理所有這些真實世界中的問題的。強制產生錯誤條件性能問題 不是性能本身 如:“隨著輸入尺寸慢慢變大,問題慢慢變復雜”的趨勢。 確保性能曲線能夠保持穩(wěn)定5. CORRECT邊界條件5.1 邊界條件o 思考public int calculate(int a,int b)return a/(a+b);5.
18、2 邊界條件o 一致性(Conformance)o值是否和預期的一致o 有序性(Ordering)o值是否如應該的那樣,是有序或無序o 區(qū)間性(Range)o值是否位于合理的最小值和最大值之內。o 引用,耦合性(Reference)o代碼是否引用了一些不在代碼本身控制范圍之內的外部資源5.2 邊界條件o 存在性(Existence):值是否存在o 基數(shù)性(Cardinality)o是否恰好有足夠的值o 時間性(Time)區(qū)間性 如果數(shù)據(jù)不能像你期望的那樣與結構相一致,將會出現(xiàn)什么情況?象這種情況,你就需要測試你的結果并確保其一致性。(一致性) 任何一個搜索程序都應該針對搜索目標位于最前或最后的
19、條件做測試。(有序性) 如果這種情況可能發(fā)生,并且在發(fā)生的時候,你的程序需要處理她,那么你就需要測試這種情況。耦合性 如,網站上一個用來顯示用戶記錄的方法,可能要求用戶先登錄。 棧的pop()方法要求一個非空的棧。 給汽車換擋。 前條件、后條件存在性 通過詢問:“給定的事物存在嗎?” 對于你傳入或者維護的值,先詢問如果值不存在如果它為null、或者等于0,方法的行為將會怎樣? 面對這些不存在的數(shù)據(jù),java庫的許多方法會拋出異常。然而要調試一個隱藏在庫深處的運行期異常通常并不容易。 在期望值不存在的時候,大多數(shù)方法都會失敗,但這可能并不是你所期望的結果。因此,你可以對這些情況進行測試,查看當網
20、絡不通、文件不存在的時候,又會發(fā)生什么事情。確認你的方法處理了“不存在”的情況。 一年中的每一天都是24小時嗎? 并發(fā)問題練習(思考棧的測試方法)public interface StackExercise public String pop() throws StackEmptyException; public void push(String item); public String top() throws StackEmptyException; public boolean isEmpty();答案(思考棧的測試方法)o 對于空棧 isEmpty=true,pop(),top(),
21、拋異常。o push(“字符”),top(),返回剛壓入的字符串,isEmpty()=false。o 多次調用push();驗證每一次top()。o push(null),top()=null。o 發(fā)生異常后,棧仍可以使用。6. MOCK對象簡介對象簡介6.1 MOCK對象 概念: MOCK對象是真實對象在調試期間的替代品。簡單的替換 一般,我們建議對應用程序范圍外的功能調用進行包裝。 因為被測試代碼只會通過接口來引用對象,所以它完全不知道它引用的究竟是真實對象還是mock 對象。 在產品環(huán)境(賣給客戶的真正的代碼)中,當初始化這個類的對象時,傳入的是一個真實的systemEnvironmen
22、t,而另一方面,測試代碼傳入的是則是mockSystemEnvironment。6.2 什么情況下使用MOCK對象o 真實對象行為不確定(如股票行情)。o 真實對象很難被創(chuàng)建。o 真實對象的某些行為很難被觸發(fā)。o 真實對象令程序的運行很慢。o 真實對象有(或者是)用戶界面。o 測試含有回調函數(shù)。o 真實對象并不存在。6.3 使用MOCK對象的步驟o 使用一個接口來描述這個對象。o 為產品代碼實現(xiàn)這個接口。o 以測試為目的,在MOCK對象中實現(xiàn)這個接口。練習:實現(xiàn)MP3的MOCK對象import java.util.ArrayList;public interface Mp3Player pub
23、lic void play();public void pause();public void stop();public double currentPosition();public String currentSong();public void next();public void prev();public boolean isPlaying();public void loadSongs(ArrayList names);7. 單元測試與軟件設計單元測試與軟件設計7.1 軟件設計關注的幾個層面o 通過面向測試的軟件設計,更好地分離關注點。o 通過測試驅動的方法,改善接口設計。o 確
24、立和局部化驗證的責任。7.2 面向測試的軟件設計例:public void sleepUtilNextHour throws InterrupedExceptionint howlong;計算休眠時間的一系列代碼Thread.sleep(howlong);Return; 等一個小時? 設一個計時器,調用這個函數(shù),等結束后回來再檢查時間,如果失敗了,再來處理一下,重新測試?7.3 面向測試的軟件設計重構代碼public void sleepUtilNextHour throws InterrupedExceptionint howlong=milliSecondsTONextHour(new Date();Thread.sleep(howlong);Return;測試:asserEquals(10000, mil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有聲讀物市場前景研究報告:2025年市場需求與科幻題材內容創(chuàng)作
- 2025年農業(yè)產業(yè)集群區(qū)域農業(yè)產業(yè)協(xié)同發(fā)展政策研究報告
- 2025年山東省濟寧市、曲阜市七下英語期中調研試題含答案
- 2025年醫(yī)藥行業(yè)SDGs目標實現(xiàn)路徑與案例分析
- 2025屆山東省棗莊市第四十一中學七下英語期末達標測試試題含答案
- 針對工業(yè)互聯(lián)網平臺的微服務架構性能測試報告2025:邊緣節(jié)點資源調度策略
- 食品飲料包裝行業(yè)節(jié)能減排技術創(chuàng)新報告
- 山西省呂梁市區(qū)改革實驗示范學校2025屆英語八下期中達標檢測試題含答案
- 周期問題說課課件
- 2025年不良資產處置行業(yè)市場格局與競爭態(tài)勢研究報告
- 電工廠搬遷方案(3篇)
- 培訓班助教教師管理制度
- 2025年安徽能源集團招聘筆試參考題庫含答案解析
- 河道維修養(yǎng)護管理制度
- 2025年 事業(yè)單位公基真題考試卷庫(附答案)
- 派出所消防管理制度
- 北京市朝陽區(qū)招聘社區(qū)工作者筆試真題2024
- 2025年重慶市中考數(shù)學試卷真題(含標準答案)
- 2024年深圳市中考歷史試卷真題(含答案解析)
- 江蘇省建筑與裝飾工程計價定額(2014)電子表格版
- 脫碳塔CO2脫氣塔設計計算
評論
0/150
提交評論