1. 程式人生 > >Python測試框架doctest

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