【簡介】python
說實話吧,以前一直沒有怎麼重視給本身的代碼加上測試邏輯;也就是說我只是寫了代碼,可是並無給本身的代碼加上測試代碼;linux
整個過程就是寫完後本身測試一下,看一下跑出來的結果是正確的就心滿意足了。過一段時間以後老是對本身的代碼有一種陌生感,算法
就算有無缺的註釋,我也不能100%保證它的功能上是OK的。sql
一方面是對於功能上的細節我已經忘記的差很少了,另外一方面就算是有註釋我也要看上一會才能回想起本身當初是怎麼想的,大聲框架
的說出個人代碼沒有問題確實是一件比較難的事。函數
【給本身的代碼加上測試代碼的必要性】單元測試
一、一種態度問題,就我如今而言不給本身的代碼加上測試代碼是對質量的不負責任;我但願本身儘量的生成出沒有Bug的代碼測試
然而給代碼加上測試代碼就是一個比較好的解決方案spa
二、雖然給代碼加上測試代碼會用到更多的人天,可是對於一個大點的項目來講它更加的可按;也就是說當我改動現有代碼或增長code
新的功能的時候是否是會引起bug,咱們只要跑一遍測試用例,若是測試用例都能經過那麼說明是OK的,若是有用例沒有經過這個
時候開發人員就能夠本身查了,不用等到測試發現以後再報給咱們。
三、總的來講給本身的代碼加上測試代碼,這會使我對本身的 代碼|項目 更加的放心
【doctest模塊的功能】
doctest模塊會讀取python代碼中的文檔字符串,並按文檔字符串中的內容來運行測試邏輯;那咱們的測試邏輯怎麼加到文檔字符串
中去呢?這個doctest已經幫咱們想好了,開發工程師只要把python交互式下的內容寫入到文檔字符串中就好了。
【doctest使用舉例】
一個簡單的選擇排序算法爲例子
def select_sort(lst): """ 選擇排序算法 """ for i in range(0,len(lst)): min_item_index = i for j in range(i,len(lst)): if lst[j] < lst[min_item_index]: min_item_index = j if min_item_index != i: lst[min_item_index],lst[i] = lst[i],lst[min_item_index]
能夠看到的代碼只提供了一個簡單的文檔字符串,用來講明瞭一下這個函數的做用。那咱們怎麼給這個方法加上測試代碼呢?
事實上這個就是從簡單的手工測試(工程師本身在python交互式模式下測試本身的代碼)演化而來的,假設工程是在交互模式下
測試了三個用例
>>> from selectsort import select_sort >>> lst = [3,2,1,4,5,6,-1] >>> select_sort(lst) >>> lst [-1, 1, 2, 3, 4, 5, 6] >>> >>> lst = [2,1] >>> select_sort(lst) >>> lst [1, 2] >>> >>> lst = [0] >>> select_sort(lst) >>> lst [0]
doctest只要求咱們把複製到文件字符串中就好了,固然啦仍是另外加兩行代碼不過這個是死的,記下來就是了
def select_sort(lst): """ 選擇排序算法 >>> lst = [3,2,1,4,5,6,-1] >>> select_sort(lst) >>> lst [-1, 1, 2, 3, 4, 5, 6] >>> >>> lst = [2,1] >>> select_sort(lst) >>> lst [1, 2] >>> >>> lst = [0] >>> select_sort(lst) >>> lst [0] """ for i in range(0,len(lst)): min_item_index = i for j in range(i,len(lst)): if lst[j] < lst[min_item_index]: min_item_index = j if min_item_index != i: lst[min_item_index],lst[i] = lst[i],lst[min_item_index] if __name__ == "__main__": import doctest doctest.testmod()
能夠看到最後三行表示當咱們單獨運行這個文件的時候就執行測試,那我測試下看看
python3 selectsort.py -v Trying: lst = [3,2,1,4,5,6,-1] Expecting nothing ok Trying: select_sort(lst) Expecting nothing ok Trying: lst Expecting: [-1, 1, 2, 3, 4, 5, 6] ok Trying: lst = [2,1] Expecting nothing ok Trying: select_sort(lst) Expecting nothing ok Trying: lst Expecting: [1, 2] ok Trying: lst = [0] Expecting nothing ok Trying: select_sort(lst) Expecting nothing ok Trying: lst Expecting: [0] ok 1 items had no tests: __main__ 1 items passed all tests: 9 tests in __main__.select_sort 9 tests in 2 items. 9 passed and 0 failed. Test passed.
最後一行的 "Test passed" 表示測試經過了,之因此有這麼多輸出是由於咱們加了 -v 參數,不加這個的話就是真正的linux哲學了
「沒有輸出就是最好的輸出」
yifengliu-nb:sorts jianglexing$ python3 selectsort.py yifengliu-nb:sorts jianglexing$ yifengliu-nb:sorts jianglexing$
【總結】
python中還有一個專門用於單元測試的unittest框架,這個相比doctest來講要強大很多,一次再說吧!
---