測試與除錯
單元測試
單元測試基於最小單元,也就是程式的基本部件,比如函式、類等,在隔離測試各部件,確保底層正確的前提下,在行組合向上完成套件測試。
測試驅動開發(TDD)要求在編寫程式碼之前,先構建測試,但這並不容易。多數時候,需求和架構的不成熟會導致演算法劇烈變化,這樣很難先行將測試確定下來。可以考慮和編碼同步,在重構過程中剝離出測試用例。兩廂對照,還可要求程式碼必須具備可測試性。
請注意,測試用例要檢查的是錯誤,而非目標正確返回。另外,單個用例要足夠簡單,僅測試一項功能,否則其本身就難以維護。可將複雜功能分解以測試套件的方式進行打包。另外,還應避免測試目標的私有成員,這會導致過高的耦合,讓程式碼重構變得困難。同樣第三方庫也不是測試目標,或許有一個基於介面的隔離代理。
效能測試
1.timeit為標準庫自帶,用於測量少於程式碼片段的執行時間。其基本演算法思路就是執行足夠多的次數,從中選取最小平均值,以縮小測量誤差。
2.標準庫的profile模組用於測量執行過程中函式的執行時間和呼叫次數
標準庫自帶兩個版本,呼叫介面基本一致。cProfile以C實現,額外開銷小。
profile是純python實現,開銷大,適合編寫擴充套件分析器。
3.獲知引發效能問題的函式後,接下來需要進一步分析具體成因。line_profiler可以對函式內的程式碼逐行進行測量。
4.memory profile用於逐行分析程式碼記憶體佔用。
當記憶體佔用過多時,可能會引發實體記憶體不足,或者導致與硬碟的平凡交換,這些會導致嚴重的效能問題。
5.pympler被用來統計物件例項的記憶體使用
他的方法summary可以對整個直譯器程序內的存活物件做出評估,以查證哪類物件可能存在問題。
tracker可在不同執行點建立跟蹤快照,這樣通過輸出快照的差異,就可能發現嫌疑目s標,以及問題程式碼的位置。
sizeof找到嫌疑目標之後,我們開始對其進行個體檢查,這需要使用asizeof.與sys.getsizeof不同,他遞迴統計所有成員和屬性。
程式碼除錯
pdb
啟動方式
1.python -m pdb main.py # 命令列除錯
2.import pdb
pdb.set_trace() # 特定位置插入斷點,除錯
3.pdb.run('test()') # 直接除錯
插入斷點後,語句就會停在該處,命令列顯示pdb語句,輸入help可看到pdb的命令。
努力拼搏吧,不要害怕,不要去規劃,不要迷茫。但你一定要在路上一直的走下去,儘管可能停滯不前,但也要走。