SlideShare a Scribd company logo
1 of 24
Download to read offline
認識軟體測試的世界 &
TDD/BDD 入門
Wan-Ting Jheng
2015/4/28
為什麼需要軟體測試?
● 正確性、完整性、安全性和品質評量的依據
● 評量項目
○ 是否符合使用者需求
○ 元件/模組功能是否正常
○ 效能
○ UI/UX
○ 安全性
○ 邊界案例 boundary/edge case
○ 壓力測試
○ ...
軟體測試技術
● 白箱測試
○ 目的:測試軟體的內部邏輯結構
○ 已知程式內部結構情況下進行測試
○ 依程式邏輯設計測試案例
○ 衍生出 覆蓋率 (coverage) 議題
■ Function, Statement, Branch, …
● 黑箱測試
○ 目的:測試軟體功能
○ 給定輸入,對處理過程結構流程一無所知,預測輸出
○ 需根據規格設計測試案例
軟體測試階段
● 單元測試
○ 針對程式最小單元,隔離外部模組下進行測試
● 整合測試
○ 在單元模組整合組裝後,針對各模組之間的互動運作測試是否正常
● 系統測試
○ 在實際或模擬實際環境下,對系統進行全面的測試
● 驗收測試
○ 由使用者設計測試案例
○ 使用實際資料測試產品功能是否滿足使用者需求
程式實作
V-model
使用者需求
系統需求
架構設計
細節設計
驗收測試
系統測試
整合測試
單元測試
單元測試
● 單元指的是程式裡的最小單位,通常是函數
● 待測物與外部環境/類別/資源/服務獨立,不直接相依
○ 讓變因降到只有一個
○ 避免其它真實物件拉長執行時間
● 產品程式設計好壞會影響測試程式是否好寫
○ 程式設計要符合高聚合,低耦合原則
○ 元件只相依於介面或抽象類別
● 試想情境:登入帳號密碼驗證
✕ 在驗證方法裡,建立資料庫、加密物件
⇨ 設計不夠彈性,無法輕易擴充抽換,不易撰寫測試程式
✓ 透過建構子、公開屬性等手段,將驗證元件與資料庫、加密物件連接
假物件
● Collaborator:協作者,和待測物有互動關係的元件
● 在單元測試中,待測物須獨立不能與外界相依
● 建立假物件模擬協作者
○ stub
○ mock
● 請務必搭配 TDD/BDD 開發流程
若用傳統開發流程,即先開發再寫測試
API 可能設計不良,導致要寫一堆複雜的假物件
且程式重構時會牽一髮動全身,改不完
單元測試三步驟:3A Pattern
● Arrange
○ 預先作業,場地佈置
○ 安排要進行測試的資料,或準備要執行該測試所需的變數
● Act
○ 執行待測物方法
● Assert
○ 斷言,驗證執行結果是否符合預期
○ 例如 assert.equal(3, 1+2);
xUnit: 單元測試框架
● xUnit 是單元測試框架的統稱 題外話,雖然實際上也真的有一套叫xUnit
○ 用來幫助測試的一套工具庫
● x: 為變數之意,程式語言的泛稱
● 幾乎各大程式語言都有類似的測試框架
○ PhpUnit
○ Junit
○ JsUnit
○ ... 族繁不及備載
p.s. 一種語言可能有很多套框架,名稱不一定後綴unit,以上所列為效果舉例
ref. http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks
TDD (Test-driven development)
● 一種程式開發的流程,而不是工具
● 它講究的是
○ 小步前進
○ 快速且持續回饋,擁抱變化
○ 重視溝通
○ 滿足需求
Red / Green / Refactor
一次只針對一個案例,持續重覆以下三步驟
● (Red) 依規格寫測試程式,跑一遍確定測試失敗
○ 千萬不要省略這步,也許會覺得有點蠢、沒意義
○ 在這一步去思考如何使用產品程式,有助於介面設計
● (Green) 寫產品程式,通過測試
○ 盡可能寫愈少的程式碼,以剛剛好通過測試為目標
○ 以確保不會有冗餘程式、過度設計
● (Refactor) 重構產品程式碼
ref. wiki/TDD
失敗
通過
重構
ref. wiki/TDD
TDD 幾件事
● 一般只針對具有功能性的程式作 TDD
○ 例如: lib、元件、模組
● 不要寫下任何一行沒有相對應測試程式的產品程式
● 不要省略 red 步驟,有可能一開始測就是綠燈...!?
○ 程式裡有同樣功能的程式 => 測試程式需寫的更完善
○ 沒有測到重點的測試程式 => 需改善
● 測式程式中不能有邏輯
● 不需要測試私有方法
● 接到 bug 通知,第一件事是先寫對應的測試案例
TDD 釋疑
許多剛接觸的人會有疑問...
● 誰要負責寫測試程式?
○ 由 API 開發者寫 => 開發工程師
● 寫程式的時間都不夠了,還要先寫測試程式?
○ 並不會造成額外的成本,只是將測試移到一開始做罷了
○ 而且可以減少未來測試/維護成本
● 功能複雜,元件關係糾纏不清,這樣可以寫單元測試嗎?
○ 這種情形更需要 TDD
○ 在開發前先透過測試程式,思考產品 API
BDD (Behavior-driven development)
● 產品程式是為了滿足使用者需求而存在
● 其實終端使用者對測試沒興趣...
● BDD 是基於 TDD 概念的進化版本
○ BDD 從實際需求去思考
○ TDD 從測試去思考程式如何實作
● 用自然語言描述測試案例
○ 使用者和工程師用同一種語言,避免溝通成本
○ 測試後的輸出結果可以直接做為文件閱讀
BDD 測試案例句型
● 需求描述
○ User story:[標題 描述故事的單行文字]
○ 身為一個 [角色],我想要 [特定功能],以便 [得到好處]
● 系統行為,一個需求會有一系列的場景來定義驗證標準
○ Scenario [#]:[標題 描述場景的單行文字]
■ Given [上下文]
■ When [事件]
■ Then [結果] and [其它結果]
在什麼前提、環境下
發生什麼事
預期有什麼樣的結果
Arrange
Act
Assert
● 需求描述
○ User story:[帳戶持有人要領錢]
○ 身為一個 [帳戶持有人],我想要 [從atm領錢],以便 [可以在銀行關門後領
到錢]
● 系統行為, 一個需求會有一系列的場景來定義驗證標準
○ Scenario [1]:[帳戶裡有足夠的錢,要給錢]
■ Given [帳戶餘額100] and [有效的領款卡] and [提款機夠錢]
■ When [帳戶持有人要求提20元]
■ Then [提款機應該給20] and [帳戶餘額80] and [退提款卡]
○ Scenario [2]:[帳戶裡沒有足夠的錢,要提示餘額不足]
■ Given [帳戶餘額100] and [有效的領款卡] and [提款機夠錢]
■ When [帳戶持有人要求提120元]
■ Then [提示餘額不足] and [退提款卡]
BDD 的一些慣例
● 一個元件配一隻測試程式,測試檔名後綴 spec
ex. 加法器元件 Adder.js 搭配 AdderSpec.js
● describe
○ # 純方法
○ . 類別成員方法
mocha http://mochajs.org
● javascript 測試框架
○ 支援 node.js
○ web client
● 在 node.js 環境使用方式
○ cmd:npm install -g mocha //npm 全域安裝 mocha
○ 測試程式放在專案目錄的 test 資料夾下
○ cmd:mocha //執行 test 資料夾下的程式
mocha 基本用法
● describe: 描術場景
● it:代表一個測試案例; ”它”應該如何...
● done(err, arg)
○ 在非同步測試案例上,向測試框架提示已完成
○ 用在花時間的測試上,如讀檔、DB連線
○ 預設兩秒以上為超時 透過 this.timeout(milliseconds) 調整
chai http://chaijs.com/api/
● 提供語意化的斷言庫
○ expect('string').to.be.a('string') //type check
○ expect('string').to.equal('bar') //value
○ expect('string').to.have.length(6)
○ ...
總結
● BDD
○ 有助於從呼叫者的角度對看程式
○ 進而設計出良好的介面
○ 以需求為導向的設計,
○ 語意化的測試案例,減少溝通成本
○ 測試結果即文件
○ 測試程式即範例
● 練習
○ CodeWars http://www.codewars.com/
Reference
《軟體測試專案實作:技術、流程與管理》筆記
http://w1a2d3s4q5e6.blogspot.tw/2012/11/blog-post_7.html
30天快速上手 TDD
https://msdn.microsoft.com/zh-tw/library/dn743856.aspx
自動化測試
https://ihower.tw/rails4/testing.html
初探行为驱动开发(Bdd)
http://www.slideshare.net/dualface/bdd-1068404
Testing in Node.js
http://code.tutsplus.com/tutorials/testing-in-nodejs--net-35018
程式設計師升級必練內功:TDD Kata
https://ihower.tw/blog/archives/8162

More Related Content

What's hot

探索的テスト入門
探索的テスト入門探索的テスト入門
探索的テスト入門H Iseri
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with CucumberBrandon Keepers
 
ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向Keizo Tatsumi
 
ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011H Iseri
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTakuto Wada
 
BDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVABDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVASrinivas Katakam
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with JestMichał Pierzchała
 
Behavior Driven Development (BDD)
Behavior Driven Development (BDD)Behavior Driven Development (BDD)
Behavior Driven Development (BDD)Ajay Danait
 
Introduction to Behaviour Driven Development (BDD) and Cucumber with Java
Introduction to Behaviour Driven Development (BDD) and Cucumber with JavaIntroduction to Behaviour Driven Development (BDD) and Cucumber with Java
Introduction to Behaviour Driven Development (BDD) and Cucumber with JavaJawad Khan
 
テストを分類してみよう!
テストを分類してみよう!テストを分類してみよう!
テストを分類してみよう!Kenji Okumura
 
APIテスト自動化とテストピラミッド
APIテスト自動化とテストピラミッドAPIテスト自動化とテストピラミッド
APIテスト自動化とテストピラミッド友隆 浅黄
 
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化JustSystems Corporation
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIKoichiro Sumi
 
アジャイル×テスト開発を考える
アジャイル×テスト開発を考えるアジャイル×テスト開発を考える
アジャイル×テスト開発を考えるyasuohosotani
 
Agile Testing and Test Automation
Agile Testing and Test AutomationAgile Testing and Test Automation
Agile Testing and Test AutomationNaveen Kumar Singh
 
twMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC
 

What's hot (20)

探索的テスト入門
探索的テスト入門探索的テスト入門
探索的テスト入門
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
 
ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向ソフトウェアテストの歴史と近年の動向
ソフトウェアテストの歴史と近年の動向
 
ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011ユニットテストの保守性を作りこむ, xpjugkansai2011
ユニットテストの保守性を作りこむ, xpjugkansai2011
 
Test Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
 
BDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVABDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVA
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with Jest
 
Bdd and spec flow
Bdd and spec flowBdd and spec flow
Bdd and spec flow
 
Behavior Driven Development (BDD)
Behavior Driven Development (BDD)Behavior Driven Development (BDD)
Behavior Driven Development (BDD)
 
Introduction to Behaviour Driven Development (BDD) and Cucumber with Java
Introduction to Behaviour Driven Development (BDD) and Cucumber with JavaIntroduction to Behaviour Driven Development (BDD) and Cucumber with Java
Introduction to Behaviour Driven Development (BDD) and Cucumber with Java
 
テストを分類してみよう!
テストを分類してみよう!テストを分類してみよう!
テストを分類してみよう!
 
APIテスト自動化とテストピラミッド
APIテスト自動化とテストピラミッドAPIテスト自動化とテストピラミッド
APIテスト自動化とテストピラミッド
 
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化
 
軟體架構模式
軟體架構模式軟體架構模式
軟體架構模式
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCI
 
アジャイル×テスト開発を考える
アジャイル×テスト開発を考えるアジャイル×テスト開発を考える
アジャイル×テスト開発を考える
 
Agile Testing and Test Automation
Agile Testing and Test AutomationAgile Testing and Test Automation
Agile Testing and Test Automation
 
Bdd Introduction
Bdd IntroductionBdd Introduction
Bdd Introduction
 
Test Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and CucumberTest Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and Cucumber
 
twMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwrighttwMVC#44 如何測試與保護你的 web application with playwright
twMVC#44 如何測試與保護你的 web application with playwright
 

Similar to 認試軟體測試的世界 & TDD/BDD 入門

前端单元测试
前端单元测试前端单元测试
前端单元测试LC2009
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探hua qiu
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-developfangdeng
 
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志Drupal Taiwan
 
SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4Rick Hwang
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
2019-03-13-ddd taiwan-community-iddd-studygroup-2nd
2019-03-13-ddd taiwan-community-iddd-studygroup-2nd2019-03-13-ddd taiwan-community-iddd-studygroup-2nd
2019-03-13-ddd taiwan-community-iddd-studygroup-2ndFong Liou
 
單元測試介紹
單元測試介紹單元測試介紹
單元測試介紹Adison wu
 
20130325 mldm monday spide r
20130325 mldm monday spide r20130325 mldm monday spide r
20130325 mldm monday spide rChia-Chi Chang
 
SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4Rick Hwang
 
20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiirIsaac Tseng
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生Rick Hwang
 
20121115 Slides
20121115 Slides20121115 Slides
20121115 SlidesTonyq Wang
 
Best practice for coding
Best practice for codingBest practice for coding
Best practice for codingBin Feng
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless Rick Hwang
 
團隊協作實戰DDD
團隊協作實戰DDD團隊協作實戰DDD
團隊協作實戰DDDJed Lin
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章浒 刘
 
2020 MLaaS 產業介紹.pdf
2020 MLaaS 產業介紹.pdf2020 MLaaS 產業介紹.pdf
2020 MLaaS 產業介紹.pdf家弘 周
 

Similar to 認試軟體測試的世界 & TDD/BDD 入門 (20)

前端单元测试
前端单元测试前端单元测试
前端单元测试
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志
[DCTPE2011] Drupal 6 的 CCK/Views運用--黎偉志
 
SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
2019-03-13-ddd taiwan-community-iddd-studygroup-2nd
2019-03-13-ddd taiwan-community-iddd-studygroup-2nd2019-03-13-ddd taiwan-community-iddd-studygroup-2nd
2019-03-13-ddd taiwan-community-iddd-studygroup-2nd
 
單元測試介紹
單元測試介紹單元測試介紹
單元測試介紹
 
20130325 mldm monday spide r
20130325 mldm monday spide r20130325 mldm monday spide r
20130325 mldm monday spide r
 
SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4SRE Study Notes - CH2,3,4
SRE Study Notes - CH2,3,4
 
20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiir
 
Java 網路程式
Java 網路程式Java 網路程式
Java 網路程式
 
在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生在生命轉彎的地方 - 從軟體開發職涯,探索人生
在生命轉彎的地方 - 從軟體開發職涯,探索人生
 
20121115 Slides
20121115 Slides20121115 Slides
20121115 Slides
 
Rootkit tw(0224)
Rootkit tw(0224)Rootkit tw(0224)
Rootkit tw(0224)
 
Best practice for coding
Best practice for codingBest practice for coding
Best practice for coding
 
Ops as Code using Serverless
Ops as Code using Serverless Ops as Code using Serverless
Ops as Code using Serverless
 
團隊協作實戰DDD
團隊協作實戰DDD團隊協作實戰DDD
團隊協作實戰DDD
 
软件工程 第七章
软件工程 第七章软件工程 第七章
软件工程 第七章
 
2020 MLaaS 產業介紹.pdf
2020 MLaaS 產業介紹.pdf2020 MLaaS 產業介紹.pdf
2020 MLaaS 產業介紹.pdf
 

認試軟體測試的世界 & TDD/BDD 入門