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.