[Python-checkins] python/dist/src/Lib/test sample_doctest.py, NONE,
1.1.2.1 test_doctest.txt, NONE, 1.1.2.1 test_doctest2.txt,
NONE, 1.1.2.1 test_doctest.py, 1.5.18.9, 1.5.18.10
dcjim at users.sourceforge.net
dcjim at users.sourceforge.net
Thu Aug 5 23:38:53 CEST 2004
Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28896/test
Modified Files:
Tag: tim-doctest-branch
test_doctest.py
Added Files:
Tag: tim-doctest-branch
sample_doctest.py test_doctest.txt test_doctest2.txt
Log Message:
- Added DocFileSuite
- Added a script_from_examples method to convert examples to a script.
- Changed the way the debugger works to include all of the text around
the exaples. Having the explanatory text can make debugging a lot
easier.
- Added a DebugRunner for that raises an error on the first unexpected
error or failure.
- Wrote tests for DocTestSuite, DocFileSuite, script_from_examples,
and DebugRunner.
- Added a debug method to DocTestCase that uses the DebugRunner to
raise an error on the first failure, to support post-mortem
debugging.
--- NEW FILE: sample_doctest.py ---
"""This is a sample module that doesn't really test anything all that
interesting
It simply has a few tests, some of which suceed and some of which fail.
It's important that the numbers remain constance, as another test is
testing the running of these tests.
>>> 2+2
4
"""
def foo():
"""
>>> 2+2
5
>>> 2+2
4
"""
def bar():
"""
>>> 2+2
4
"""
def test_silly_setup():
"""
>>> import test.test_doctest
>>> test.test_doctest.sillySetup
True
"""
def w_blank():
"""
>>> if 1:
... print 'a'
... print
... print 'b'
a
<BLANKLINE>
b
"""
x = 1
def x_is_one():
"""
>>> x
1
"""
def y_is_one():
"""
>>> y
1
"""
def test_suite():
import doctest
return doctest.DocTestSuite()
--- NEW FILE: test_doctest.txt ---
This is a sample doctest in a text file.
In this example, we'll rely on a global variable being set for us
already:
>>> favorite_color
'blue'
We can make this fail by disabling the blank-line feature.
>>> if 1:
... print 'a'
... print
... print 'b'
a
<BLANKLINE>
b
--- NEW FILE: test_doctest2.txt ---
This is a sample doctest in a text file.
In this example, we'll rely on some silly setup:
>>> import test.test_doctest
>>> test.test_doctest.sillySetup
True
Index: test_doctest.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_doctest.py,v
retrieving revision 1.5.18.9
retrieving revision 1.5.18.10
diff -C2 -d -r1.5.18.9 -r1.5.18.10
*** test_doctest.py 4 Aug 2004 14:06:27 -0000 1.5.18.9
--- test_doctest.py 5 Aug 2004 21:38:50 -0000 1.5.18.10
***************
*** 12,17 ****
--- 12,21 ----
def sample_func(v):
"""
+ Blah blah
+
>>> print sample_func(22)
44
+
+ Yee ha!
"""
return v+v
***************
*** 253,257 ****
>>> e = tests[0].examples[0]
>>> print (e.source, e.want, e.lineno)
! ('print sample_func(22)', '44\n', 1)
>>> doctest: -ELLIPSIS # Turn ellipsis back off
--- 257,261 ----
>>> e = tests[0].examples[0]
>>> print (e.source, e.want, e.lineno)
! ('print sample_func(22)', '44\n', 3)
>>> doctest: -ELLIPSIS # Turn ellipsis back off
***************
*** 913,927 ****
The testsource() function takes a module and a name, finds the (first)
! test with that name in that module, and converts it to an
>>> import test.test_doctest
>>> name = 'test.test_doctest.sample_func'
>>> print doctest.testsource(test.test_doctest, name)
print sample_func(22)
# Expected:
# 44
>>> name = 'test.test_doctest.SampleNewStyleClass'
>>> print doctest.testsource(test.test_doctest, name)
print '1\n2\n3'
# Expected:
--- 917,940 ----
The testsource() function takes a module and a name, finds the (first)
! test with that name in that module, and converts it to a script. The
! example code is converted to regular Python code. The surrounding
! words and expected output are converted to comments:
>>> import test.test_doctest
>>> name = 'test.test_doctest.sample_func'
>>> print doctest.testsource(test.test_doctest, name)
+ #
+ # Blah blah
+ #
print sample_func(22)
# Expected:
# 44
+ #
+ # Yee ha!
+ #
>>> name = 'test.test_doctest.SampleNewStyleClass'
>>> print doctest.testsource(test.test_doctest, name)
+ #
print '1\n2\n3'
# Expected:
***************
*** 929,935 ****
--- 942,950 ----
# 2
# 3
+ #
>>> name = 'test.test_doctest.SampleClass.a_classmethod'
>>> print doctest.testsource(test.test_doctest, name)
+ #
print SampleClass.a_classmethod(10)
# Expected:
***************
*** 938,941 ****
--- 953,957 ----
# Expected:
# 12
+ #
"""
***************
*** 976,979 ****
--- 992,1160 ----
"""
+ def test_DocTestSuite():
+ """DocTestSuite creates a unittest test suite into a doctest.
+
+ We create a Suite by providing a module. A module can be provided
+ by passing a module object:
+
+ >>> import unittest
+ >>> import test.sample_doctest
+ >>> suite = doctest.DocTestSuite(test.sample_doctest)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=3>
+
+ We can also supply the module by name:
+
+ >>> suite = doctest.DocTestSuite('test.sample_doctest')
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=3>
+
+ We can use the current module:
+
+ >>> suite = test.sample_doctest.test_suite()
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=3>
+
+ We can supply global variables. If we pass globs, they will be
+ used instead of the module globals. Here we'll pass an empty
+ globals, triggering an extra error:
+
+ >>> suite = doctest.DocTestSuite('test.sample_doctest', globs={})
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=4>
+
+ Alternatively, we can provide extra globals. Here we'll make an
+ error go away by providing an extra global variable:
+
+ >>> suite = doctest.DocTestSuite('test.sample_doctest',
+ ... extraglobs={'y': 1})
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=2>
+
+ You can pass option flags. Here we'll cause an extra error
+ by disabling the blank-line feature:
+
+ >>> suite = doctest.DocTestSuite('test.sample_doctest',
+ ... optionflags=doctest.DONT_ACCEPT_BLANKLINE)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=4>
+
+ You can supply setUp and teatDoen functions:
+
+ >>> def setUp():
+ ... import test.test_doctest
+ ... test.test_doctest.sillySetup = True
+
+ >>> def tearDown():
+ ... import test.test_doctest
+ ... del test.test_doctest.sillySetup
+
+ Here, we installed a silly variable that the test expects:
+
+ >>> suite = doctest.DocTestSuite('test.sample_doctest',
+ ... setUp=setUp, tearDown=tearDown)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=7 errors=0 failures=2>
+
+ But the tearDown restores sanity:
+
+ >>> import test.test_doctest
+ >>> test.test_doctest.sillySetup
+ Traceback (most recent call last):
+ ...
+ AttributeError: 'module' object has no attribute 'sillySetup'
+
+ Finally, you can provide an alternate test finder. Here we'll
+ use a custom test_finder to to run just the test named bar:
+
+ >>> finder = doctest.DocTestFinder(
+ ... namefilter=lambda prefix, base: base!='bar')
+ >>> suite = doctest.DocTestSuite('test.sample_doctest',
+ ... test_finder=finder)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=0>
+
+ """
+
+ def test_DocFileSuite():
+ """We can test tests found in text files using a DocFileSuite.
+
+ We create a suite by providing the names of one or more text
+ files that include examples:
+
+ >>> import unittest
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest2.txt')
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=2>
+
+ The test files are looked for in the directory containing the
+ calling module. A package keyword argument can be provided to
+ specify a different relative location.
+
+ >>> import unittest
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest2.txt',
+ ... package='test')
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=2>
+
+ Note that '/' should be used as a path separator. It will be
+ converted to a native separator at run time:
+
+
+ >>> suite = doctest.DocFileSuite('../test/test_doctest.txt')
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=1 errors=0 failures=1>
+
+ You can specify initial global variables:
+
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest2.txt',
+ ... globs={'favorite_color': 'blue'})
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=1>
+
+ In this case, we supplied a missing favorite color. You can
+ provide doctest options:
+
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest2.txt',
+ ... optionflags=doctest.DONT_ACCEPT_BLANKLINE,
+ ... globs={'favorite_color': 'blue'})
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=2>
+
+ And, you can provide setUp and tearDown functions:
+
+ You can supply setUp and teatDoen functions:
+
+ >>> def setUp():
+ ... import test.test_doctest
+ ... test.test_doctest.sillySetup = True
+
+ >>> def tearDown():
+ ... import test.test_doctest
+ ... del test.test_doctest.sillySetup
+
+ Here, we installed a silly variable that the test expects:
+
+ >>> suite = doctest.DocFileSuite('test_doctest.txt',
+ ... 'test_doctest2.txt',
+ ... setUp=setUp, tearDown=tearDown)
+ >>> suite.run(unittest.TestResult())
+ <unittest.TestResult run=2 errors=0 failures=1>
+
+ But the tearDown restores sanity:
+
+ >>> import test.test_doctest
+ >>> test.test_doctest.sillySetup
+ Traceback (most recent call last):
+ ...
+ AttributeError: 'module' object has no attribute 'sillySetup'
+
+ """
+
+
######################################################################
## Main
More information about the Python-checkins
mailing list