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

More Related Content

Similar to 單元測試介紹

Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Fong Liou
 
Angular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular TaiwanAngular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular Taiwan志龍 陳
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探hua qiu
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-developfangdeng
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
2020.04.01 DDD讀書會第三次導讀資料
2020.04.01 DDD讀書會第三次導讀資料2020.04.01 DDD讀書會第三次導讀資料
2020.04.01 DDD讀書會第三次導讀資料hoblues
 
2012上海chinatest演讲 从开发看测试,从测试看开发
2012上海chinatest演讲 从开发看测试,从测试看开发2012上海chinatest演讲 从开发看测试,从测试看开发
2012上海chinatest演讲 从开发看测试,从测试看开发drewz lin
 
敏捷软件测试之简介
敏捷软件测试之简介敏捷软件测试之简介
敏捷软件测试之简介Yi Xu
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous deliveryQiao Liang
 
银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011Yi Xu
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試國昭 張
 
Top100summit 游戏中的自动化测试 - 金山 - 白银祖
Top100summit 游戏中的自动化测试 - 金山 - 白银祖Top100summit 游戏中的自动化测试 - 金山 - 白银祖
Top100summit 游戏中的自动化测试 - 金山 - 白银祖drewz lin
 
Tdd with rspec.md
Tdd with rspec.mdTdd with rspec.md
Tdd with rspec.mdLeo Chang
 
About Usability可用性测试杂谈
About Usability可用性测试杂谈About Usability可用性测试杂谈
About Usability可用性测试杂谈Vinny Wu
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)悦 温
 
How+we+make+tests
How+we+make+testsHow+we+make+tests
How+we+make+tests甘 李
 

Similar to 單元測試介紹 (20)

Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
 
Angular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular TaiwanAngular Testing for Book Club Online of Angular Taiwan
Angular Testing for Book Club Online of Angular Taiwan
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
前端測試
前端測試前端測試
前端測試
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
2020.04.01 DDD讀書會第三次導讀資料
2020.04.01 DDD讀書會第三次導讀資料2020.04.01 DDD讀書會第三次導讀資料
2020.04.01 DDD讀書會第三次導讀資料
 
2012上海chinatest演讲 从开发看测试,从测试看开发
2012上海chinatest演讲 从开发看测试,从测试看开发2012上海chinatest演讲 从开发看测试,从测试看开发
2012上海chinatest演讲 从开发看测试,从测试看开发
 
敏捷软件测试之简介
敏捷软件测试之简介敏捷软件测试之简介
敏捷软件测试之简介
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
 
Coding dojo
Coding dojoCoding dojo
Coding dojo
 
银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011
 
例外處理與單元測試
例外處理與單元測試例外處理與單元測試
例外處理與單元測試
 
Top100summit 游戏中的自动化测试 - 金山 - 白银祖
Top100summit 游戏中的自动化测试 - 金山 - 白银祖Top100summit 游戏中的自动化测试 - 金山 - 白银祖
Top100summit 游戏中的自动化测试 - 金山 - 白银祖
 
Tdd with rspec.md
Tdd with rspec.mdTdd with rspec.md
Tdd with rspec.md
 
About Usability可用性测试杂谈
About Usability可用性测试杂谈About Usability可用性测试杂谈
About Usability可用性测试杂谈
 
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)Java DSL与动态代码生成技术的应用 (上集:DSL部分)
Java DSL与动态代码生成技术的应用 (上集:DSL部分)
 
How+we+make+tests
How+we+make+testsHow+we+make+tests
How+we+make+tests
 

單元測試介紹

Editor's Notes

  1. 單元測試一點都不難,就像被蚊子叮一樣,學一下很快就懂了 TDD, 測試驅動開發 test-driven development BDD, 行為驅動 behavior-driven development ATDD, 驗收測試驅動開發 Acceptance test-driven development
  2. https://bitbucket.org/adison/unit-test-demo-roman-digit-converter https://bitbucket.org/adison/tdd-demo-roman-digit-converter
  3. 證明測試案例有效 如果通過了..不是測試方法撰寫錯誤,就是這功能已經存在現存系統中。 無論哪個都是很有意義的結果
  4. 還有更多的測試方法、測試準備 以及因應複雜資料、遠端物件、第三方物件的作法
  5. 因此很多設計模式的起源與效果都與讓測試更簡單有關
  6. 自動化代表只要按一下就好,不用每次都重新追蹤一次 而且是一種可以出報表的結果, 也因此是 持續整合的基礎技術
  7. 為何而來
  8. BDD http://teddy-chen-tw.blogspot.tw/2014/09/bddtdd.html
  9. 需求測試的產出是 user story 文件 架構測試比較像是傳統規格書,但多了測試條件 元件測試、單元測試的產出就是TDD 缺點:一次只做一點,無法做全局最佳化 有一天會亂掉,因此需要一些額外的成本(重構) 時程難估 優點: 不容易做出不符合需求的東西 特色每次的產出都是可運作的系統,所以1. 隨時有可運作的程式 2. 每次都需要完整測試
  10. TDD 不保證全局最佳化 每次都在前一系統的屍體上進化,會有一定程度的重構
  11. http://teddy-chen-tw.blogspot.tw/2013/07/bdd4cucumber-jvm.html
  12. group id/ article id/ version
  13. 支援 Cucumer, JBehave
  14. TDD 作法並不適合所有環境,也不該套用於所有情況