Python測試框架doctest
doctest是python自帶的一個模組。本部落格將介紹doctest的兩種使用方式:一種是嵌入到python原始碼中,另外一種是放到一個獨立檔案。
doctest 的概念模型
在python的官方文件中,對doctest是這樣介紹的:
doctest模組會搜尋那些看起來像是python互動式會話中的程式碼片段,然後嘗試執行並驗證結果。
從名字上是否會讓你聯想到docstring呢?
doctest的編寫過程就像你在一個互動式shell中匯入了一個被測試模組,然後一條一條執行被測試模組裡面的函式一樣。其實實際上doctest也是這麼編寫的,寫好一個模組之後,在shell中測試這個模組裡面的函式,將shell會話中的內容複製貼上成doctest用例。
doctest嵌入原始碼中
下面的模組只有一個函式,裡面嵌入了兩個doctest測試用例。
unnecessary_math.py:
'''
這個例子展示如何在原始碼中嵌入doctest用例。
'>>>' 開頭的行就是doctest測試用例。
不帶 '>>>' 的行就是測試用例的輸出。
如果實際執行的結果與期望的結果不一致,就標記為測試失敗。
'''
def multiply(a, b): """ >>> multiply(4, 3) 12 >>> multiply('a', 3) 'aaa' """ return a * b if __name__=='__main__': import doctest doctest.testmod(verbose=True)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
有兩個地方可以放doctest測試用例,一個位置是模組的最開頭,另一個位置是函式宣告語句的下一行(就像上面的例子這樣)。除此之外的其它地方不能放,放了也不會執行。
那個verbose引數,如果設定為True則在執行測試的時候會輸出詳細資訊。預設是False,表示執行測試時,只有失敗的用例會輸出詳細資訊,成功的測試用例不會輸入任何資訊。
執行
python unnecessary_math.py
- 1
得到輸出結果是:
liuchunmings-MacBook-Pro:exersice liuchunming$ python unnecessary_math.py
Trying:
multiply(4, 3)
Expecting:
12
ok
Trying:
multiply('a', 3) Expecting: 'aaa' ok 1 items had no tests: __main__ 1 items passed all tests: 2 tests in __main__.multiply 2 tests in 2 items. 2 passed and 0 failed. Test passed.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
上面啟動測試的方式是在__main__函式中呼叫了doctest.testmod()方法。如果__main__函式有其他用途,不方便呼叫doctest.testmod()方法,那麼可以用另外一種執行測試的方法:
$ python -m doctest unnecessary_math.py
$ python -m doctest -v unnecessary_math.py
- 1
- 2
這裡 -m 表示引用一個模組,-v 等價於 verbose=True。執行輸出與上面基本一樣。
doctest獨立檔案
如果不想將doctest測試用例嵌入到python的原始碼中,則可以建立一個獨立的文字檔案來儲存測試用例。
將doctest測試用例從上面的python原始碼中剝離出來放到test_unnecessary_math.txt檔案裡。
這個例子展示如何將doctest用例放到一個獨立的檔案中。
'>>>' 開頭的行就是doctest測試用例。
不帶 '>>>' 的行就是測試用例的輸出。
如果實際執行的結果與期望的結果不一致,就標記為測試失敗。
>>> from unnecessary_math import multiply >>> multiply(3, 4) 12 >>> multiply('a', 3) 'aaa'
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
注意:from 那一行也要以>>>開頭。
在系統的shell中執行:
python -m doctest -v test_unnecessary_math.txt