doctest — 通过文档来测试
优质
小牛编辑
129浏览
2023-12-01
开始
# doctest_simple.py
def my_function(a, b):
"""
>>> my_function(2, 3)
6
>>> my_function('a', 3)
'aaa'
"""
return a * b
# doctest_simple_with_docs.py
def my_function(a, b):
"""Returns a * b.
Works with numbers:
>>> my_function(2, 3)
6
and strings:
>>> my_function('a', 3)
'aaa'
"""
return a * b
Handling Unpredictable Output
# doctest_unpredictable.py
class MyClass:
pass
def unpredictable(obj):
"""Returns a new list containing obj.
>>> unpredictable(MyClass())
[<doctest_unpredictable.MyClass object at 0x10055a2d0>]
"""
return [obj]
# doctest_ellipsis.py
class MyClass:
pass
def unpredictable(obj):
"""Returns a new list containing obj.
>>> unpredictable(MyClass()) #doctest: +ELLIPSIS
[<doctest_ellipsis.MyClass object at 0x...>]
"""
return [obj]
# doctest_hashed_values.py
keys = ['a', 'aa', 'aaa']
print('dict:', {k: len(k) for k in keys})
print('set :', set(keys))
# doctest_hashed_values_tests.py
import collections
def group_by_length(words):
"""Returns a dictionary grouping words into sets by length.
>>> grouped = group_by_length([ 'python', 'module', 'of',
... 'the', 'week' ])
>>> grouped == { 2:set(['of']),
... 3:set(['the']),
... 4:set(['week']),
... 6:set(['python', 'module']),
... }
True
"""
d = collections.defaultdict(set)
for word in words:
d[len(word)].add(word)
return d
Tracebacks
# doctest_tracebacks.py
def this_raises():
"""This function always raises an exception.
>>> this_raises()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/no/such/path/doctest_tracebacks.py", line 14, in
this_raises
raise RuntimeError('here is the error')
RuntimeError: here is the error
"""
raise RuntimeError('here is the error')
# doctest_tracebacks_no_body.py
def this_raises():
"""This function always raises an exception.
>>> this_raises()
Traceback (most recent call last):
RuntimeError: here is the error
>>> this_raises()
Traceback (innermost last):
RuntimeError: here is the error
"""
raise RuntimeError('here is the error')
Working Around Whitespace
# doctest_blankline_fail.py
def double_space(lines):
"""Prints a list of lines double-spaced.
>>> double_space(['Line one.', 'Line two.'])
Line one.
Line two.
"""
for l in lines:
print(l)
print()
# doctest_blankline.py
def double_space(lines):
"""Prints a list of lines double-spaced.
>>> double_space(['Line one.', 'Line two.'])
Line one.
<BLANKLINE>
Line two.
<BLANKLINE>
"""
for l in lines:
print(l)
print()
# doctest_extra_space.py
def my_function(a, b):
"""
>>> my_function(2, 3)
6
>>> my_function('a', 3)
'aaa'
"""
return a * b
# doctest_ndiff.py
def my_function(a, b):
"""
>>> my_function(2, 3) #doctest: +REPORT_NDIFF
6
>>> my_function('a', 3)
'aaa'
"""
return a * b
Test Locations
# doctest_docstrings.py
"""Tests can appear in any docstring within the module.
Module-level tests cross class and function boundaries.
>>> A('a') == B('b')
False
"""
class A:
"""Simple class.
>>> A('instance_name').name
'instance_name'
"""
def __init__(self, name):
self.name = name
def method(self):
"""Returns an unusual value.
>>> A('name').method()
'eman'
"""
return ''.join(reversed(self.name))
class B(A):
"""Another simple class.
>>> B('different_name').name
'different_name'
"""
# doctest_private_tests.py
import doctest_private_tests_external
__test__ = {
'numbers': """
>>> my_function(2, 3)
6
>>> my_function(2.0, 3)
6.0
""",
'strings': """
>>> my_function('a', 3)
'aaa'
>>> my_function(3, 'a')
'aaa'
""",
'external': doctest_private_tests_external,
}
def my_function(a, b):
"""Returns a * b
"""
return a * b
External Documentation
# doctest_in_help.py
def my_function(a, b):
"""Returns a*b
"""
return a * b
Running Tests
# doctest_testmod.py
def my_function(a, b):
"""
>>> my_function(2, 3)
6
>>> my_function('a', 3)
'aaa'
"""
return a * b
if __name__ == '__main__':
import doctest
doctest.testmod()
# doctest_testfile.py
import doctest
if __name__ == '__main__':
doctest.testfile('doctest_in_help.txt')
# doctest_unittest.py
import doctest
import unittest
import doctest_simple
suite = unittest.TestSuite()
suite.addTest(doctest.DocTestSuite(doctest_simple))
suite.addTest(doctest.DocFileSuite('doctest_in_help.txt'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
Test Context
# doctest_test_globals.py
class TestGlobals:
def one(self):
"""
>>> var = 'value'
>>> 'var' in globals()
True
"""
def two(self):
"""
>>> 'var' in globals()
False
"""
# doctest_mutable_globals.py
_module_data = {}
class TestGlobals:
def one(self):
"""
>>> TestGlobals().one()
>>> 'var' in _module_data
True
"""
_module_data['var'] = 'value'
def two(self):
"""
>>> 'var' in _module_data
False
"""