第七講 調試python
測試算法
測試是爲了找出代碼中的錯誤,調試是經過錯誤修改代碼使其達到預期的效果編程
經過將代碼分解成獨立的模塊,從而進行獨立的測試和調試。ide
代碼設計好以後,就須要進行測試。函數
爲了測試,須要:單元測試
1, 確保代碼能夠運行測試
2, 摸索出一套預期的結果,對於一個特定的輸入,程序的輸出是什麼設計
測試方法:調試
將輸入分解成一系列子集,而且保證每一個元素都在一個子集裏。而後構建一個測試集,其中少包含每一個子集中的一個元素。從每個子集中,咱們挑選一個輸入元素,而後運行測試,看它可否成功運行。code
測試方法分爲兩類:
1, 經過特定分類使用啓發式的方法探索路徑。咱們稱之爲黑盒測試。
2, 基於代碼自己使用啓發式方法探索路徑。咱們稱之爲白盒測試。
黑盒測試 :
黑盒,即一個表面全黑的盒子,所以咱們看不到它的裏面。所以,事實上,這個檢測套件的設計令人們無需查看代碼。它的優勢在於實施者之外的其餘人也可使用它進行測試。
具體方式:根據函數接受的數據,將輸入分解成一系列子集,明確邊界狀況,對每個輸入子集及邊界狀況至少檢測一次。
白盒測試 :
白盒,意味着咱們能夠看到代碼的內容,白盒測試使用代碼自己來引導測試用例的設計,這是一個更全面的手段,它能夠找出存在潛在錯誤的地方,白盒測試也被稱做窮舉路徑測試,其中代碼的每一條可能路徑至少都被檢測了一次。
具體方式:根據函數的全部執行路徑,將輸入分解成一系列子集,明確邊界狀況,對每個輸入子集及邊界狀況至少檢測一次。對於循環,能夠分爲0次,1次, 屢次的狀況。
測試將從單元測試入手,單元測試會選擇一個模塊,好比說一個函數,而後檢測它。
以確保該模塊運行良好。這裏就就會抓住一些算法錯誤,這些就是我會遇到錯誤的地方,要麼
會發生在編寫算法時,要麼會發生在思考該代碼的時候。發現錯誤並修改,而後從新測試,直到模塊正常運行。
完成了對模塊的檢驗以後,接着進行集成測試,以檢驗做爲總體的系統是否工做正常若是咱們有若干個相互做用的函數,我須要確保即使這些模塊運行正常,那麼整個系統也得工做正常。通常地,這將會抓住所謂的交互錯誤。這個的意思是說,在一些地方,不正確的數值將會傳遞給另外一個函數。發現錯誤並修改以後再回頭對模塊進行單元測試,以後進行集合測試,往復屢次,直到咱們認爲已經抓到了全部可能的錯誤
調試 :
找到錯誤可能所在位置的理念是,使用白盒測試和黑盒測試設計檢測套件,首先證實
確實有錯誤出現,而後使用代碼自己來發現錯誤可能的位置。
使用經過打印語句查看運行時的變量,使用二分查找來定位錯誤的具體位置。
第八講 斷言和異常
異常 :
python提供了異常處理:
def divide(x, y): try: #try代碼塊中的代碼若是發生異常會被捕獲 result = x / y except ZeroDivisionError, e: #except 是處理異常的代碼塊,能夠指定要處理的異常類型這裏是ZeroDivisionError, #若是指定了類型,則只會處理指定類型的異常,固然你能夠捕獲多個異常 print "division by zero! " + str(e) except TypeError: divideNew(int(x), int(y)) else: # else: 用於沒有異常時執行的語句 print "result is", result finally: #finally 中的代碼,無論有沒有異常都會執行,一般用於關閉文件等操做 print "executing finally clause"
防護式編程:
在處理數據前檢測數據的正確性,使用assert 斷言,能夠很好的限制輸入
def avg(grades, weights): assert not len(grades) == 0, 'no grades data' #斷言 assert 表達式[,輸出語句] 若是表達式爲真則繼續執行,不然中止程序拋出異常或者輸出自定義信息 newgrades = [convertLetterGrade(elt) for elt in grades] return dotProduct(newgrades, weights)/len(newgrades)