SlideShare a Scribd company logo
1 of 50
Download to read offline
12. 除錯、測試與效能
• 學習目標
– 使用 pdb 模組除錯
– 對程式進行單元測試
– 使用 timeit 評測程式片段
– 使用 cProfile
(profile)察看評測數
據
除錯
• 檢測錯誤的時候,有個順手的工具可以加
速錯誤的檢出,其中 Debugger 是最常使
用也是最基本的工具之一
– 中斷點
– 檢視變數
– 逐步執行
• Step Over 就是執行程式碼的下一步,如
果下步是個函式,會執行完該函式至返回
• 使用 Step Into,若下一步是個函式呼叫,
就會進入函式逐步執行,以便查看函式中
的演算與每一步執行結果
• 如果目前正在某個函式之中,接下來不想
逐步檢視函式中剩餘之程式碼,可以執行
Step Out
使用 pdb 模組
• 如果手邊正好沒有整合開發環境,只能在
文字模式下執行程式進行除錯,那麼可以
使用 Python 內建的 pdb 模組
• 直接使用 python -m pdb,指定想要除
錯的 .py 檔案
• 如果想要單點針對某個函式進行除錯,可
以使用 pdb.run()函式,通常可以在
REPL 中進行這類動作
• 可以將 pdb.set_trace() 直接撰寫在原
始碼中,當程式執行到 pdb.set_trace()
時,就會進入 (Pdb) 指令提示
• 若程式因為例外而無法繼續下去的話,可
以再使用 pdb.pm() 回到例外發生時的上
一步
測試
• Python 變數沒有型態,如果有型態上的操
作錯誤,基本上會是在執行時期運行至該
段程式碼時,才會產生錯誤訊息
• 檢查出型態不正確的任務,必須由開發者
來承擔,而減輕這個負擔的最好方式之一,
就是撰寫良好的測試程式
• 撰寫測試的相關工具
– assert
– doctest
– unittest
– 第三方測試工具(像是 nose、pytest 等)
• 要在程式中安插斷言,可以使用 assert
• 使用 assert expression 的話,相當於
以下的程式片段:
• 如果有兩個 expression,例如 assert
expression1, expression2:
• __debug__ 是個內建變數,一般情況下會
是 True
• 如果執行時需要最佳化時(在執行時加上-
O 引數)則會是 False
• 何時該使用斷言呢?
– 前置條件斷言客戶端呼叫函式前,已經準備好
某些條件。
– 後置條件驗證客戶端呼叫函式後,具有函式承
諾之結果。
– 類別不變量(Class invariant)驗證物件某個
時間點下的狀態。
– 內部不變量(Internal invariant)使用斷言取
代註解。
– 流程不變量(Control-flow invariant)斷言程
式流程中絕不會執行到的程式碼部份。
撰寫 doctest
• doctest 模組一方面是測試程式碼,一方
面也用來確認 DocStrings 的內容沒有過期
• 使用互動式的範例來執行驗證,開發者只
要為套件撰寫 REPL 形式的文件就可以
• 獨立地撰寫在另一個文字檔案中
使用 unittest 單元測試
• unittest 模組有時亦稱為"PyUnit",是
JUnit 的Python 語言實現
• JUnit 是個 Java 實現的單元測試(Unit
test)框架
• 單元測試指的是測試一個工作單元(a unit
of work)的行為
• 測試一個單元,基本上要與其他的單元獨
立,否則會是在同時測試兩個單元的正確
性,或是兩個單元之間的合作行為
• 就軟體測試而言,單元測試通常指的是測
試某個函式(或方法)
• unittest 模組主要包括四個部份:
– 測試案例(Test case)
– 測試設備(Test fixture)
– 測試套件(Test suite)
– 測試執行器(Test runner)
測試案例
測試設備
• 如果有定義 setUp() 方法,那麼執行每個
test 開頭的方法前,都會呼叫一次
setUp()
• 如果有定義 tearDown()方法,那麼執行
每個 test 開頭的方法後,都會呼叫一次
tearDown()
• 可以使用 setUp()、tearDown()來分別
定義每次單元測試前後的資源建立與銷毀
測試套件
• 想要將不同的測試組合在一起
• 想要自動載入某個 TestCase 子類別中所
有 test_xxx 方法
• 將某個測試套件與某個 TestCase 中的
test_xxx 方法組合為另一個測試套件:
• 將許多測試套件再全部組合為另一個測試
套件:
測試執行器
• 在程式碼中直接使用 TextTestRunner:
• 在命令列中使用 unittest 模組來運行模
組、類別或甚至個別的測試方法:
timeit 模組
• 用來量測一個小程式片段的執行時間
• 到底是使用 + 時比較快,還是 join() 比
較快呢?
• 效能是整體程式結合之後的執行考量,並
不是單一元素快慢的問題,也不是憑空猜
測,而是要有實際的評測作為依據
• timeit 預設是執行程式片段 1,000,000 次,
然後取平均時間
• 執行次數可透過 number 參數控制
• 以下是幾個直接透過 API 運行的範例:
使用 cProfile(profile)
• cProfile 用來收集程式執行時的一些時
間數據,提供各種統計數據,對大多數的
使用者來說是不錯的工具
• 這是用 C 撰寫的擴充模組,在評測時有較
低的額外成本,不過並不是所有系統上都
有提供
• profile 介面上仿造了cProfile,是用
純Python 來實現的模組,因此有較高的互
通性
• ncalls:"number of calls"的縮寫,也就是對
特定函式的呼叫次數。
• tottime:"total time"的縮寫,花費在函式上
的執行時間(不包括子函數
• 呼叫的時間)。
• percall:tottime 除以ncalls 的結果。
• cumtime:"cumulative time"的縮寫,花費
在函式與所有子函式的時間
• (從呼叫至離開)。
• percall:cumtime 除以ncalls 的結果。
• filename:lineno(function):提供程式碼執行
時的位置資訊。
• 可以使用 pstats 對 cProfile 的結果,
進行各種運算與排序

More Related Content

Viewers also liked

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式Justin Lin
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming LanguageTahani Al-Manie
 
《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿Justin Lin
 
並行與平行
並行與平行並行與平行
並行與平行Justin Lin
 
類別的繼承
類別的繼承類別的繼承
類別的繼承Justin Lin
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentP3 InfoTech Solutions Pvt. Ltd.
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換Justin Lin
 
從模組到類別
從模組到類別從模組到類別
從模組到類別Justin Lin
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDEJustin Lin
 
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組Justin Lin
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialJustin Lin
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCADJustin Lin
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知Justin Lin
 
型態與運算子
型態與運算子型態與運算子
型態與運算子Justin Lin
 
常用內建模組
常用內建模組常用內建模組
常用內建模組Justin Lin
 
Python 起步走
Python 起步走Python 起步走
Python 起步走Justin Lin
 

Viewers also liked (20)

流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
Python 3 Programming Language
Python 3 Programming LanguagePython 3 Programming Language
Python 3 Programming Language
 
《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿《Python 3.5 技術手冊》第二章草稿
《Python 3.5 技術手冊》第二章草稿
 
並行與平行
並行與平行並行與平行
並行與平行
 
類別的繼承
類別的繼承類別的繼承
類別的繼承
 
Python Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File OperationsPython Programming Essentials - M22 - File Operations
Python Programming Essentials - M22 - File Operations
 
Python Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web DevelopmentPython Programming Essentials - M44 - Overview of Web Development
Python Programming Essentials - M44 - Overview of Web Development
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
 
資料結構
資料結構資料結構
資料結構
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
從 REPL 到 IDE
從 REPL 到 IDE從 REPL 到 IDE
從 REPL 到 IDE
 
open() 與 io 模組
open() 與 io 模組open() 與 io 模組
open() 與 io 模組
 
例外處理
例外處理例外處理
例外處理
 
PyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 TutorialPyCon Taiwan 2013 Tutorial
PyCon Taiwan 2013 Tutorial
 
3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD3D 之邏輯與美感交會 - OpenSCAD
3D 之邏輯與美感交會 - OpenSCAD
 
網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知網站系統安全及資料保護設計認知
網站系統安全及資料保護設計認知
 
型態與運算子
型態與運算子型態與運算子
型態與運算子
 
常用內建模組
常用內建模組常用內建模組
常用內建模組
 
進階主題
進階主題進階主題
進階主題
 
Python 起步走
Python 起步走Python 起步走
Python 起步走
 

Similar to 除錯、測試與效能

Mobile app的測試v2
Mobile app的測試v2Mobile app的測試v2
Mobile app的測試v2Mr PM
 
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipsenetdbncku
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)Max Lai
 
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志龍 陳
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Fong Liou
 
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)Chen Cheng-Wei
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述pop2008
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學潘 冠辰
 
Beta testing with CI
Beta testing with CIBeta testing with CI
Beta testing with CILiyao Chen
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formaljameslabs
 
银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011Yi Xu
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探hua qiu
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-developfangdeng
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享Tony Deng
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationnetdbncku
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 StartupSteve Luo
 

Similar to 除錯、測試與效能 (20)

Mobile app的測試v2
Mobile app的測試v2Mobile app的測試v2
Mobile app的測試v2
 
Tip for Editors
Tip for EditorsTip for Editors
Tip for Editors
 
Tutorial of eclipse
Tutorial of eclipseTutorial of eclipse
Tutorial of eclipse
 
使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)使用 Pytest 進行單元測試 (PyCon TW 2021)
使用 Pytest 進行單元測試 (PyCon TW 2021)
 
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
 
Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)Legacy code 讀書會 1st (Ch1 - Ch5)
Legacy code 讀書會 1st (Ch1 - Ch5)
 
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)
Ansible & GitLab CI / CD Workshop 101 ( @Agile Tour Taipei 2017)
 
网站前端代码静态检查工具综述
网站前端代码静态检查工具综述网站前端代码静态检查工具综述
网站前端代码静态检查工具综述
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學TDD (Test-driven development, 測試驅動開發) 基本教學
TDD (Test-driven development, 測試驅動開發) 基本教學
 
Xpp
XppXpp
Xpp
 
Beta testing with CI
Beta testing with CIBeta testing with CI
Beta testing with CI
 
PHPUnit slide formal
PHPUnit slide formalPHPUnit slide formal
PHPUnit slide formal
 
银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011银弹!银弹! 徐毅@Italk salon 2011
银弹!银弹! 徐毅@Italk salon 2011
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
异步和队列分享
异步和队列分享异步和队列分享
异步和队列分享
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
Phalcon2014 Startup
Phalcon2014 StartupPhalcon2014 Startup
Phalcon2014 Startup
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 

除錯、測試與效能