單元測試介紹
Transcript of 單元測試介紹
![Page 2: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/2.jpg)
內容大綱
❖ 前言❖ 說明、介紹、實作單元測試 Unit Test
❖ 用法介紹❖ 覆蓋率介紹❖ 與其他相關技術的關係
❖ 與其他常提及技術、開發流程的關係
![Page 3: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/3.jpg)
Unit Test
❖ Unit: 最小單元,在程式中為方法 method
❖ Unit Test: 對方法進行測試❖ 優點 : 族繁不及備載..所以看別人整理的比較快
![Page 4: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/4.jpg)
範例環境
❖ 環境eclipse luna ( 內建 junit 3, 4)安裝套件 :EclEmma Java Code Coverage ( 覆蓋率用 )
❖ 範例 : 羅馬數字轉換器範例 https://bitbucket.org/adison/unit-test-demo
![Page 5: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/5.jpg)
無測試作法
❖ 範例 : No-Auto-Test 分支❖ 作法
❖ 寫完程式,然後手動測試 ..
❖ 改完程式,然後手動測試 ..
❖ 問題❖ 程式有多少可能?❖ 每改一次都要跑一次?❖ 我們知道引用了什麼物件,但怎麼知道被引用物件以及改變後的影響範
圍?
![Page 6: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/6.jpg)
Unit Test 基本用法
Hello World: Step 1
範例 : Unit-Test 分支寫完物件後,建立一個新的 Junit Test Case
![Page 7: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/7.jpg)
Unit Test 基本用法
Hello World: Step 2
測試物件名稱,慣例上會用 test 開頭小寫表示與正規物件不同test 開頭表示是測試用物件
![Page 8: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/8.jpg)
Unit Test 基本用法
Hello World: Step 3
預設內容Unit Test 建議從一個不會通過的測試開始,然後直接測試,確認這功能確實尚未實作
![Page 9: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/9.jpg)
Unit Test 基本用法
Hello World: Step 4
執行測試Eclipse 上,在不同區域執行的範疇會不同(在專案、在物件、在方法)這種作法只會執行該方法
![Page 10: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/10.jpg)
Unit Test 基本用法
Hello World: Step 5
Junit Tab 上會出現測試結果位置可能根據 layout 有所不同
![Page 11: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/11.jpg)
Unit Test 基本用法
Hello World: Step 6
放兩個可以過的測試AssertEquals: 判斷內容是否相等
![Page 12: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/12.jpg)
Unit Test 基本用法
Hello World: Step 7
再跑一次
![Page 13: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/13.jpg)
Unit Test 基本用法
Hello World: Step 8
通過測試了!這是一個奇蹟!!
![Page 14: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/14.jpg)
Unit Test 基本用法
Hello World: Step 9
萬一失敗,會提示錯誤地點
![Page 15: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/15.jpg)
剛剛發生了什麼事?
❖ 展示 Unit Test 過程❖ 新增了測試案例❖ 用測試語法 (AssertEquals) 輸入了測試條件❖ 執行自動測試流程,判斷是否有測試失敗
![Page 16: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/16.jpg)
Unit Test 還有哪些可能?
❖ Junit Org官網網址❖ 更多斷言方法: AssertThat, AssertNotEquals,
AssertNull, AssertNouNull….
❖ 前置後置處理 , Before and After: 針對不同測試進行的前置 / 後置處理
❖ Mock and Stub: 針對複雜環境,可透過提供偽資料 / 物件或攔截方法取得測試結果
❖ 延伸作法 : 覆蓋率檢查 , Integration Test, CI
![Page 17: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/17.jpg)
前置後置處理
Before/After TestBeforeClass, AfterClass: 測試物件開始前/ 結束後呼叫 (static)Before, After: ( 物件內 ) 每個測試方法執行前 / 執行後呼叫
Junit4 使用 annotation 方式 , ex @BeforeJunit3 使用特定方法名稱 setUp/tearDown, setUp/tearDownClass
![Page 18: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/18.jpg)
Mock, Stub 簡介
Mock, Stub
Mock: 形似的個體
Stub:
![Page 19: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/19.jpg)
覆蓋率
❖ 覆蓋率 : 測試案例涵蓋的內容❖ 計算方式 : 行數、方法數、可執行路徑
❖ 可執行路徑: if/else, while, switch
❖ EclEmma Java Coverage: 覆蓋率套件❖ 中文介紹
![Page 20: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/20.jpg)
EclEmma Java Coverage
基本用法在方法、物件或專案上,右鍵選擇 Coverage As
![Page 21: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/21.jpg)
EclEmma Java Coverage
結果畫面切換到 Coverage tab綠色代表有測試到
![Page 22: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/22.jpg)
EclEmma Java Coverage
取消對 x4 的測試黃色 : 未執行到內容的判斷紅色 : 從未執行的內容
![Page 23: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/23.jpg)
哪些內容該被覆蓋 / 測試?
❖ 邏輯元件❖ 控制元件❖ 與 UI 無關❖ 義大利麵程式 (UI+ 邏輯煮成的程式大餐 ) 怎麼辦?多加點辣椒,大
口吞下去❖ 有些事你永遠不必問,有些人你永遠不必等❖ 重構吧 ..
❖ 這都不要?那這招總行了吧
![Page 24: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/24.jpg)
剛說的重構是啥?
❖ 推薦書籍 : 重構 — 改善既有程式的設計
❖ Refactor 的重點是在不改變程式外在行為的情況下改進程式內部的架構
![Page 25: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/25.jpg)
可是教練,我就是想要寫測試
❖ 自動化測試方法其實很多 .. http://openhome.cc/Gossip/JUnit/
❖ 能力越大,責任越大❖ 程式越複雜,測試越難寫❖ 方法內部的流程越複雜,測試越
難完善
![Page 26: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/26.jpg)
單元測試結尾感言
❖ Unit Test 是一個提供驗證程式結果是否與預期符合的自動化方式
❖ 優點 :
❖ 自動化❖ 自我驗證
![Page 27: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/27.jpg)
所以,那個 TDD 呢 ..
❖ 先看範例 : TDD 分支❖ 精神
❖ 先決定結果的測試方式,再寫程式❖ 執行測試看結果❖ 測試即文件❖ 與敏捷開發 /BDD/IT/CI 的關係
![Page 28: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/28.jpg)
TDD? BDD? 能吃嗎?❖ 不行,不過 BUG 可以❖ TDD, Test-Driven Development, 測試驅動開發
寫方法 / 物件前先寫測試 , 測試案例就是程式規格❖ BDD, Behavior-Driven Development, 行為驅動開發
ATDD: Acceptance Test Driven Development 驗收測試驅動開發Specification by Example, 規格範例基於驗收方法 / 條件、規格說明、 USer Story 等寫測試
![Page 29: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/29.jpg)
傳統瀑布流 V 型流程
❖ V 型流程
![Page 30: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/30.jpg)
W 開發模型
❖ 每一步驟都有對應的測試方法
![Page 31: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/31.jpg)
W 模型的起源
❖ 傳統開發❖ 瀑布流❖ 一次性開發,前期花很多時間進行分析
❖ 敏捷開發❖ 多次迭代❖ 一次做一點,像雕塑一樣,一次做一部分,系統是不停
演進、不斷變更
![Page 32: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/32.jpg)
所以 TDD/BDD 是?
❖ Unit Test: 單元測試,測試方法❖ TDD: 測試先行的開發方法 , 規格決定後,先寫好 ( 部分 ) 測試
再開發 ( 對應 ) 程式方法❖ BDD/ATDD: 做好對應設計後,也一併決定測試方式的設計方
法❖ 優點 : 通過測試案例的程式一定可以通過測試(啥?
❖ 測試案例來自規格,通過了測試案例 = 達到及格標準❖ 嫌 60 分太低?那 100 分的標準在哪?
![Page 33: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/33.jpg)
BDD, 行為驅動開發範例
❖ 建立使用者行為的測試結果❖ When, Given, What
❖ 搞笑談軟工 BDD(2)
❖ 搞笑談軟工 BDD(3)
❖ 搞笑談軟工 BDD(4)
![Page 34: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/34.jpg)
環境建置
❖ convert to Maven project
❖ if faile: add m2e connector, window > preference > Maven > Discovery > open category > find all M2E connector by Jboss
❖ add cucumber settings to maven’s dependency
❖ info.cukes/cucumber-java/1.2.2
❖ info.cukes/cucumber-junit/1.2.2
❖ junit/junit/4.12
![Page 35: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/35.jpg)
BDD 套件 - Natural
❖ Natural: 官方 wiki
❖ Cheng-Wei Chien 的簡單說明
❖ 安裝❖ eclipse 新增站台
http://rlogiacco.github.com/Natural
❖ xText 2.6+
![Page 36: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/36.jpg)
Hello BDD
❖ follow BDD3 webpage
❖ BUT!! use @CucumerOption instead of @Cucumber.Options, which is deprecated
❖ .feature: 功能說明文件❖ GreetingTest.java: 測試案例 ( 測試 Greeting)
❖ HelloClass, HelloStepDef: 膠水程式,黏合文件與實際測試
❖ Hello.java: 實際物件
![Page 37: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/37.jpg)
TDD/BDD/ATDD?
❖ W 型流程中的產出結果❖ 由設計人員決定的測試方法❖ 適用於需求不斷變更的專案❖ 實際順序
ATDD&BDD > TDD > Unit Test > Refactoring
![Page 38: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/38.jpg)
Something in mind
❖ There is not silver bullet, neither TDD/BDD/ATDD.
❖ 自從我吃了TDD,考試都拿一百分了呢(神棍調
❖ TDD is DEAD!! Long life testing.
❖ 懶人包:TDD is Dead 戰文總整理
![Page 39: 單元測試介紹](https://reader030.fdocument.pub/reader030/viewer/2022032620/55c9b1c1bb61eb9d7d8b45e4/html5/thumbnails/39.jpg)
推薦閱讀
❖ 開源框架:JUnit Gossip
❖ 30天快速上手 TDD
❖ 搞笑談軟工
❖ 自從我吃了TDD,考試都拿一百分了呢(神棍調
❖ TDD is DEAD!! Long life testing.
❖ 懶人包:TDD is Dead 戰文總整理