單元測試介紹

39
單單單單 , Unit Test TDD, Test Driven Develop BDD, Behavior Driven Develop 單單 Adison Wu [email protected]

Transcript of 單元測試介紹

Page 1: 單元測試介紹

單元測試 , Unit TestTDD, Test Driven DevelopBDD, Behavior Driven Develop簡介

Adison [email protected]

Page 2: 單元測試介紹

內容大綱

❖ 前言❖ 說明、介紹、實作單元測試 Unit Test

❖ 用法介紹❖ 覆蓋率介紹❖ 與其他相關技術的關係

❖ 與其他常提及技術、開發流程的關係

Page 3: 單元測試介紹

Unit Test

❖ Unit: 最小單元,在程式中為方法 method

❖ Unit Test: 對方法進行測試❖ 優點 : 族繁不及備載..所以看別人整理的比較快

Page 4: 單元測試介紹

範例環境

❖ 環境eclipse luna ( 內建 junit 3, 4)安裝套件 :EclEmma Java Code Coverage ( 覆蓋率用 )

❖ 範例 : 羅馬數字轉換器範例 https://bitbucket.org/adison/unit-test-demo

Page 5: 單元測試介紹

無測試作法

❖ 範例 : No-Auto-Test 分支❖ 作法

❖ 寫完程式,然後手動測試 ..

❖ 改完程式,然後手動測試 ..

❖ 問題❖ 程式有多少可能?❖ 每改一次都要跑一次?❖ 我們知道引用了什麼物件,但怎麼知道被引用物件以及改變後的影響範

圍?

Page 6: 單元測試介紹

Unit Test 基本用法

Hello World: Step 1

範例 : Unit-Test 分支寫完物件後,建立一個新的 Junit Test Case

Page 7: 單元測試介紹

Unit Test 基本用法

Hello World: Step 2

測試物件名稱,慣例上會用 test 開頭小寫表示與正規物件不同test 開頭表示是測試用物件

Page 8: 單元測試介紹

Unit Test 基本用法

Hello World: Step 3

預設內容Unit Test 建議從一個不會通過的測試開始,然後直接測試,確認這功能確實尚未實作

Page 9: 單元測試介紹

Unit Test 基本用法

Hello World: Step 4

執行測試Eclipse 上,在不同區域執行的範疇會不同(在專案、在物件、在方法)這種作法只會執行該方法

Page 10: 單元測試介紹

Unit Test 基本用法

Hello World: Step 5

Junit Tab 上會出現測試結果位置可能根據 layout 有所不同

Page 11: 單元測試介紹

Unit Test 基本用法

Hello World: Step 6

放兩個可以過的測試AssertEquals: 判斷內容是否相等

Page 12: 單元測試介紹

Unit Test 基本用法

Hello World: Step 7

再跑一次

Page 13: 單元測試介紹

Unit Test 基本用法

Hello World: Step 8

通過測試了!這是一個奇蹟!!

Page 14: 單元測試介紹

Unit Test 基本用法

Hello World: Step 9

萬一失敗,會提示錯誤地點

Page 15: 單元測試介紹

剛剛發生了什麼事?

❖ 展示 Unit Test 過程❖ 新增了測試案例❖ 用測試語法 (AssertEquals) 輸入了測試條件❖ 執行自動測試流程,判斷是否有測試失敗

Page 16: 單元測試介紹

Unit Test 還有哪些可能?

❖ Junit Org官網網址❖ 更多斷言方法: AssertThat, AssertNotEquals,

AssertNull, AssertNouNull….

❖ 前置後置處理 , Before and After: 針對不同測試進行的前置 / 後置處理

❖ Mock and Stub: 針對複雜環境,可透過提供偽資料 / 物件或攔截方法取得測試結果

❖ 延伸作法 : 覆蓋率檢查 , Integration Test, CI

Page 17: 單元測試介紹

前置後置處理

Before/After TestBeforeClass, AfterClass: 測試物件開始前/ 結束後呼叫 (static)Before, After: ( 物件內 ) 每個測試方法執行前 / 執行後呼叫

Junit4 使用 annotation 方式 , ex @BeforeJunit3 使用特定方法名稱 setUp/tearDown, setUp/tearDownClass

Page 18: 單元測試介紹

Mock, Stub 簡介

Mock, Stub

Mock: 形似的個體

Stub:

Page 19: 單元測試介紹

覆蓋率

❖ 覆蓋率 : 測試案例涵蓋的內容❖ 計算方式 : 行數、方法數、可執行路徑

❖ 可執行路徑: if/else, while, switch

❖ EclEmma Java Coverage: 覆蓋率套件❖ 中文介紹

Page 20: 單元測試介紹

EclEmma Java Coverage

基本用法在方法、物件或專案上,右鍵選擇 Coverage As

Page 21: 單元測試介紹

EclEmma Java Coverage

結果畫面切換到 Coverage tab綠色代表有測試到

Page 22: 單元測試介紹

EclEmma Java Coverage

取消對 x4 的測試黃色 : 未執行到內容的判斷紅色 : 從未執行的內容

Page 23: 單元測試介紹

哪些內容該被覆蓋 / 測試?

❖ 邏輯元件❖ 控制元件❖ 與 UI 無關❖ 義大利麵程式 (UI+ 邏輯煮成的程式大餐 ) 怎麼辦?多加點辣椒,大

口吞下去❖ 有些事你永遠不必問,有些人你永遠不必等❖ 重構吧 ..

❖ 這都不要?那這招總行了吧

Page 24: 單元測試介紹

剛說的重構是啥?

❖ 推薦書籍 : 重構 — 改善既有程式的設計

❖ Refactor 的重點是在不改變程式外在行為的情況下改進程式內部的架構

Page 25: 單元測試介紹

可是教練,我就是想要寫測試

❖ 自動化測試方法其實很多 .. http://openhome.cc/Gossip/JUnit/

❖ 能力越大,責任越大❖ 程式越複雜,測試越難寫❖ 方法內部的流程越複雜,測試越

難完善

Page 26: 單元測試介紹

單元測試結尾感言

❖ Unit Test 是一個提供驗證程式結果是否與預期符合的自動化方式

❖ 優點 :

❖ 自動化❖ 自我驗證

Page 27: 單元測試介紹

所以,那個 TDD 呢 ..

❖ 先看範例 : TDD 分支❖ 精神

❖ 先決定結果的測試方式,再寫程式❖ 執行測試看結果❖ 測試即文件❖ 與敏捷開發 /BDD/IT/CI 的關係

Page 28: 單元測試介紹

TDD? BDD? 能吃嗎?❖ 不行,不過 BUG 可以❖ TDD, Test-Driven Development, 測試驅動開發

寫方法 / 物件前先寫測試 , 測試案例就是程式規格❖ BDD, Behavior-Driven Development, 行為驅動開發

ATDD: Acceptance Test Driven Development 驗收測試驅動開發Specification by Example, 規格範例基於驗收方法 / 條件、規格說明、 USer Story 等寫測試

Page 29: 單元測試介紹

傳統瀑布流 V 型流程

❖ V 型流程

Page 30: 單元測試介紹

W 開發模型

❖ 每一步驟都有對應的測試方法

Page 31: 單元測試介紹

W 模型的起源

❖ 傳統開發❖ 瀑布流❖ 一次性開發,前期花很多時間進行分析

❖ 敏捷開發❖ 多次迭代❖ 一次做一點,像雕塑一樣,一次做一部分,系統是不停

演進、不斷變更

Page 32: 單元測試介紹

所以 TDD/BDD 是?

❖ Unit Test: 單元測試,測試方法❖ TDD: 測試先行的開發方法 , 規格決定後,先寫好 ( 部分 ) 測試

再開發 ( 對應 ) 程式方法❖ BDD/ATDD: 做好對應設計後,也一併決定測試方式的設計方

法❖ 優點 : 通過測試案例的程式一定可以通過測試(啥?

❖ 測試案例來自規格,通過了測試案例 = 達到及格標準❖ 嫌 60 分太低?那 100 分的標準在哪?

Page 33: 單元測試介紹

BDD, 行為驅動開發範例

❖ 建立使用者行為的測試結果❖ When, Given, What

❖ 搞笑談軟工 BDD(2)

❖ 搞笑談軟工 BDD(3)

❖ 搞笑談軟工 BDD(4)

Page 34: 單元測試介紹

環境建置

❖ 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: 單元測試介紹

BDD 套件 - Natural

❖ Natural: 官方 wiki

❖ Cheng-Wei Chien 的簡單說明

❖ 安裝❖ eclipse 新增站台

http://rlogiacco.github.com/Natural

❖ xText 2.6+

Page 36: 單元測試介紹

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: 單元測試介紹

TDD/BDD/ATDD?

❖ W 型流程中的產出結果❖ 由設計人員決定的測試方法❖ 適用於需求不斷變更的專案❖ 實際順序

ATDD&BDD > TDD > Unit Test > Refactoring

Page 38: 單元測試介紹

Something in mind

❖ There is not silver bullet, neither TDD/BDD/ATDD.

❖ 自從我吃了TDD,考試都拿一百分了呢(神棍調

❖ TDD is DEAD!! Long life testing.

❖ 懶人包:TDD is Dead 戰文總整理

Page 39: 單元測試介紹

推薦閱讀

❖ 開源框架:JUnit Gossip

❖ 30天快速上手 TDD

❖ 搞笑談軟工

❖ 自從我吃了TDD,考試都拿一百分了呢(神棍調

❖ TDD is DEAD!! Long life testing.

❖ 懶人包:TDD is Dead 戰文總整理