SlideShare una empresa de Scribd logo
1 de 39
Descargar para leer sin conexión
測試驅動開發
潘冠辰 (水球潘)
2018/5/14
- Unit test
- Dependency Inversion
- Mocking
What is TDD ?
什麼是測試驅動開發?
2
“
▷ 先測試再開發
3
屁!這不符合邏輯阿!
TDD 位於哪一個階段 ?
4
系統交付
系統測試
系統開發
系統設計
系統分析
提案與可行性分析
TDD 的技能所須
5
程式語言 單元測試 物件導向 設計模式 TDD
要做到測試驅動
你需要了解如何將模組解耦
Why TDD ?
為什麼要用測試驅動開發?
6
Why TDD?
1. 穩住開發軌道 – 提早將規格萃取成程式。
2. 進行良好的設計 – MVC, MVP …
3. 去除工作依賴 – 由於模組解耦,工作不具依賴性。
4. 重複驗證 – 撰寫好的測試碼可重複驗證。
5. 綠燈就下班!
7
How TDD ?
先學單元測試!
8
“▷ 單元測試就是測試軟體中最小
單位的邏輯→函數
9
來進行計算機的測試驅動開發吧!
10
但是我們要先撰寫測試碼!才進行開發!
計算機單元測試碼設計
(一般測試框架都可以這麼用)
11
10
20
30
加法
驗證加法是否正確
然後工程師才開始開發計算機
12
寫好了!
錯了!
13
繼續改進
14
寫好了!
終於完成了!下班囉!
15
TDD 流程
16
但你以為你真的會
測試驅動開發了?
當你的軟體涉及到許多技術跟框架時
你的程式碼是無法被測試的!
17
請問以下函數能夠被測試嗎?
18
依賴具體
依賴TTS套件
依賴作業系統
依賴介面
函數解說:
1. 首先檢查資料庫裡是否有學生資料,沒有的話就新增一份。
2. 然後再利用TTS技術將學生的姓名唸出來 (唱名)。
3. 最後再把這個事件顯示在介面上。
“▷ 這就是為什麼你需要設計模式
才能學會 TDD,把模組解耦是
非常重要的能力!綁定了視窗
的程式碼是無法被測試的!
19
因此TDD是設計階段!不是測試階段!
依賴注入
20
Dependency injection (DI)
1. 模組解耦 → 建立介面
21
2. 套用 MVP 模式 (此為實際案例)
22
定義清楚介面可能有興趣的事件跟動作!
別讓模組直接耦和圖形化介面框架!
3. 注入你的依賴! (就是從建構子傳啦!)
23
4. 看看改善後的程式碼
24
到底改善了什麼 ?
25
來撰寫測試程式就知道了!
Mocking
你需要一些”假”的物件
才能進行測試
26
“▷ Mock 是 一種測試手段,為了
不要讓複雜的技術、框架或者
是無法被測試的圖形化介面被
涉入在測試邏輯中,而去虛設
一些子類別。此虛設物件須能
足夠表達測試狀態。
27
Mocking
28
Mocking
29
Mocking
30
Mocking
31
Mocking
32
Testing 測試點名狀態及流程
33
看到這你應該就能理解
34
為什麼能先撰寫測試程式再開發
因為所有邏輯都是依賴抽象
以下是真實TDD案例
用來測試 ApringFileMcrRepository 是否能非同步
新增1000筆學生資料
(沒做這個測試的話就無法知道當有1000個學生同時點名究竟會怎樣!)
35
給想練TDD和物件導向的人
36
的作業
用 TDD 流程 開發 1A2B 遊戲模組
1. 先創建一個介面,有兩個主要功能(函數)
(1) 產生四個0~9的不同數字 (e.g. 1234, 0519, 9843)
(2) 產生根據玩家猜測的數字,回傳結果 (幾A幾B)。(e.g. 1A2B, 0A0B, 4A0B)
2. 對該介面撰寫單元測試邏輯 (e.g. 產生的數字真的沒有重複嗎? 回傳的
結果真的正確嗎?)。
3. 創建該模組介面的子類別,開始開發!
4. 開發完成後,new出來該子類別跑跑看測試框架吧!
37
Thanks!
Any questions?
38
References
1. Writing Great Unit Tests: Best and Worst
Practices
2. Unit Tests, How to Write Testable Code and
Why it Matters
3. Effective Tests
4. TDD WIKI
5. 點名專案的實際案例

Más contenido relacionado

La actualidad más candente

JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャJJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
Kaname Motoyama
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
佐久本正太
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
Taku Miyakawa
 

La actualidad más candente (20)

Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のことSpring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
Btrfsの基礎 part1 機能編
Btrfsの基礎 part1 機能編Btrfsの基礎 part1 機能編
Btrfsの基礎 part1 機能編
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
 
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
TDDワークショップ(第2回)
TDDワークショップ(第2回)TDDワークショップ(第2回)
TDDワークショップ(第2回)
 
Selenium入門(2023年版)
Selenium入門(2023年版)Selenium入門(2023年版)
Selenium入門(2023年版)
 
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャJJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
JJUGCCC2022spring_連続画像処理による位置情報計算を支えるマイクロサービスアーキテクチャ
 
Software development life cycle yazılım geliştirme yaşam döngüsü
Software development life cycle   yazılım geliştirme yaşam döngüsüSoftware development life cycle   yazılım geliştirme yaşam döngüsü
Software development life cycle yazılım geliştirme yaşam döngüsü
 
DDD TW Conference 2020 與RD一起跳坑DDD (20201127)
DDD TW Conference 2020 與RD一起跳坑DDD (20201127)DDD TW Conference 2020 與RD一起跳坑DDD (20201127)
DDD TW Conference 2020 與RD一起跳坑DDD (20201127)
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴SQLアンチパターン - 開発者を待ち受ける25の落とし穴
SQLアンチパターン - 開発者を待ち受ける25の落とし穴
 
Jenkinsとamazon ecsで コンテナCI
Jenkinsとamazon ecsで コンテナCIJenkinsとamazon ecsで コンテナCI
Jenkinsとamazon ecsで コンテナCI
 
如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案如何讓一個敏捷團隊,同時執行多個專案
如何讓一個敏捷團隊,同時執行多個專案
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
 
ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 
5分で分かった気になるTekton
5分で分かった気になるTekton5分で分かった気になるTekton
5分で分かった気になるTekton
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 

Similar a TDD (Test-driven development, 測試驅動開發) 基本教學

前端单元测试
前端单元测试前端单元测试
前端单元测试
LC2009
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
浒 刘
 
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
奕孝 陳
 
2012 China 软件测试大会
2012 China 软件测试大会2012 China 软件测试大会
2012 China 软件测试大会
mayun1688
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享
Wade Huang
 
service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012
Qiao Liang
 

Similar a TDD (Test-driven development, 測試驅動開發) 基本教學 (20)

From Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent WorldFrom Coders to Builders of the Intelligent World
From Coders to Builders of the Intelligent World
 
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
 
前端单元测试
前端单元测试前端单元测试
前端单元测试
 
2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生2012/05/23 AU Talk - 讓事情發生
2012/05/23 AU Talk - 讓事情發生
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
 
單元測試
單元測試單元測試
單元測試
 
UnitTest.pptx
UnitTest.pptxUnitTest.pptx
UnitTest.pptx
 
有效的单元测试.ppt
有效的单元测试.ppt有效的单元测试.ppt
有效的单元测试.ppt
 
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
打造完全免費的,JAVA專案持續整合環境_ 2013 java developer_day_by 李書豪
 
2012 China 软件测试大会
2012 China 软件测试大会2012 China 软件测试大会
2012 China 软件测试大会
 
Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析Static Code Analysis 靜態程式碼分析
Static Code Analysis 靜態程式碼分析
 
在B2B硬體產業運用 Agile 與 DevOps 的實務與心法
在B2B硬體產業運用 Agile 與 DevOps 的實務與心法在B2B硬體產業運用 Agile 與 DevOps 的實務與心法
在B2B硬體產業運用 Agile 與 DevOps 的實務與心法
 
Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享Nhibernate+sqlite測試實戰經驗分享
Nhibernate+sqlite測試實戰經驗分享
 
打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012打造面向服务的敏捷团队 Q con-beijing2012
打造面向服务的敏捷团队 Q con-beijing2012
 
service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012service-oriented agile team-Q con-beijing2012
service-oriented agile team-Q con-beijing2012
 
前端測試
前端測試前端測試
前端測試
 
前端測試
前端測試前端測試
前端測試
 
Xpp
XppXpp
Xpp
 
程序员与技术
程序员与技术程序员与技术
程序员与技术
 
The way to continuous delivery
The way to continuous deliveryThe way to continuous delivery
The way to continuous delivery
 

TDD (Test-driven development, 測試驅動開發) 基本教學