三言兩語聊Python模塊–文檔測試模塊doctest

doctest是屬於測試模塊裏的一種,對註釋文檔裏的示例進行檢測。

 

給出一個例子:

splitter.pydef split(line, types=None, delimiter=None):
    """Splits a line of test and optionally performs type conversion.
    For example:

    >>> split('GOOD 100 490.50')
    ['GOOD', '100', '490.50']
    >>> split('GOOD 100 490.50', [str, int, float])
    ['GOOD', 100, 490.50]
    >>>
    By default, splitting is perfomed on whitespace, but a different delimiter
    can be selected with the delimiter keyword argument:

    >>> split('GOOD, 100, 490.50', delimiter=',')
    ['GOOOD', '100', '490.50']
    >>>
    """

    fields = line.split(delimiter)
    if types:
        fields = [ty(val) for ty, val in zip(types, fields)]
    return fields


可以有2種方式來使用doctest:

  • 第一種,單獨建一個腳本來測試。
testsplitter.py# testsplitter.py
import splitter
import doctest

nfail, ntests = doctest.testmod(splitter, verbose=True)


運行結果:

Result>>> 
**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts\splitter.py", line 8, in splitter.split
Failed example:
    split('GOOD 100 490.50', [str, int, float])
Expected:
    ['GOOD', 100, 490.50]
Got:
    ['GOOD', 100, 490.5]
**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts\splitter.py", line 14, in splitter.split
Failed example:
    split('GOOD, 100, 490.50', delimiter=',')
Expected:
    ['GOOOD', '100', '490.50']
Got:
    ['GOOD', ' 100', ' 490.50']
**********************************************************************
1 items had failures:
   2 of   3 in splitter.split
***Test Failed*** 2 failures.
>>> 


這樣注意一點,這個比對是嚴格比對,所以490.50和490.5是不同的。

 

doctest.testmod還可以帶一個參數使用,顯示更爲詳細的結果

nfail, ntests = doctest.testmod(splitter, verbose=True)

 

Result2>>> 
Trying:
    split('GOOD 100 490.50')
Expecting:
    ['GOOD', '100', '490.50']
ok
Trying:
    split('GOOD 100 490.50', [str, int, float])
Expecting:
    ['GOOD', 100, 490.50]
**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts\splitter.py", line 8, in splitter.split
Failed example:
    split('GOOD 100 490.50', [str, int, float])
Expected:
    ['GOOD', 100, 490.50]
Got:
    ['GOOD', 100, 490.5]
Trying:
    split('GOOD, 100, 490.50', delimiter=',')
Expecting:
    ['GOOOD', '100', '490.50']
**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts\splitter.py", line 14, in splitter.split
Failed example:
    split('GOOD, 100, 490.50', delimiter=',')
Expected:
    ['GOOOD', '100', '490.50']
Got:
    ['GOOD', ' 100', ' 490.50']
1 items had no tests:
    splitter
**********************************************************************
1 items had failures:
   2 of   3 in splitter.split
3 tests in 2 items.
1 passed and 2 failed.
***Test Failed*** 2 failures.
>>> 

 

  • 第二種,使用__name__ == ‘__main__’: (大部分好像都使用這種的)
splitter2.py# splitter.py
def split(line, types=None, delimiter=None):
    """Splits a line of test and optionally performs type conversion.
    For example:

    >>> split('GOOD 100 490.50')
    ['GOOD', '100', '490.50']
    >>> split('GOOD 100 490.50', [str, int, float])
    ['GOOD', 100, 490.50]
    >>>
    By default, splitting is perfomed on whitespace, but a different delimiter
    can be selected with the delimiter keyword argument:

    >>> split('GOOD, 100, 490.50', delimiter=',')
    ['GOOOD', '100', '490.50']
    >>>
    """

    fields = line.split(delimiter)
    if types:
        fields = [ty(val) for ty, val in zip(types, fields)]
    return fields

if __name__ == '__main__':
    # test myself
    import doctest
    doctest.testmod()


結果是一樣的:

Result3**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts/splitter.py", line 8, in __main__.split
Failed example:
    split('GOOD 100 490.50', [str, int, float])
Expected:
    ['GOOD', 100, 490.50]
Got:
    ['GOOD', 100, 490.5]
**********************************************************************
File "C:/Users/Administrator/Desktop/Python Scripts/splitter.py", line 14, in __main__.split
Failed example:
    split('GOOD, 100, 490.50', delimiter=',')
Expected:
    ['GOOOD', '100', '490.50']
Got:
    ['GOOD', ' 100', ' 490.50']
**********************************************************************
1 items had failures:
   2 of   3 in __main__.split
***Test Failed*** 2 failures.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章