1 # -*- coding: utf-8 -*- 2 """ 3 Test script for doctest. 4 """ 5 6 import sys 7 from test import test_support 8 import doctest 9 10 # NOTE: There are some additional tests relating to interaction with 11 # zipimport in the test_zipimport_support test module. 12 13 ###################################################################### 14 ## Sample Objects (used by test cases) 15 ###################################################################### 16 17 def sample_func(v): 18 """ 19 Blah blah 20 21 >>> print sample_func(22) 22 44 23 24 Yee ha! 25 """ 26 return v+v 27 28 class SampleClass: 29 """ 30 >>> print 1 31 1 32 33 >>> # comments get ignored. so are empty PS1 and PS2 prompts: 34 >>> 35 ... 36 37 Multiline example: 38 >>> sc = SampleClass(3) 39 >>> for i in range(10): 40 ... sc = sc.double() 41 ... print sc.get(), 42 6 12 24 48 96 192 384 768 1536 3072 43 """ 44 def __init__(self, val): 45 """ 46 >>> print SampleClass(12).get() 47 12 48 """ 49 self.val = val 50 51 def double(self): 52 """ 53 >>> print SampleClass(12).double().get() 54 24 55 """ 56 return SampleClass(self.val + self.val) 57 58 def get(self): 59 """ 60 >>> print SampleClass(-5).get() 61 -5 62 """ 63 return self.val 64 65 def a_staticmethod(v): 66 """ 67 >>> print SampleClass.a_staticmethod(10) 68 11 69 """ 70 return v+1 71 a_staticmethod = staticmethod(a_staticmethod) 72 73 def a_classmethod(cls, v): 74 """ 75 >>> print SampleClass.a_classmethod(10) 76 12 77 >>> print SampleClass(0).a_classmethod(10) 78 12 79 """ 80 return v+2 81 a_classmethod = classmethod(a_classmethod) 82 83 a_property = property(get, doc=""" 84 >>> print SampleClass(22).a_property 85 22 86 """) 87 88 class NestedClass: 89 """ 90 >>> x = SampleClass.NestedClass(5) 91 >>> y = x.square() 92 >>> print y.get() 93 25 94 """ 95 def __init__(self, val=0): 96 """ 97 >>> print SampleClass.NestedClass().get() 98 0 99 """ 100 self.val = val 101 def square(self): 102 return SampleClass.NestedClass(self.val*self.val) 103 def get(self): 104 return self.val 105 106 class SampleNewStyleClass(object): 107 r""" 108 >>> print '1\n2\n3' 109 1 110 2 111 3 112 """ 113 def __init__(self, val): 114 """ 115 >>> print SampleNewStyleClass(12).get() 116 12 117 """ 118 self.val = val 119 120 def double(self): 121 """ 122 >>> print SampleNewStyleClass(12).double().get() 123 24 124 """ 125 return SampleNewStyleClass(self.val + self.val) 126 127 def get(self): 128 """ 129 >>> print SampleNewStyleClass(-5).get() 130 -5 131 """ 132 return self.val 133 134 ###################################################################### 135 ## Fake stdin (for testing interactive debugging) 136 ###################################################################### 137 138 class _FakeInput: 139 """ 140 A fake input stream for pdb's interactive debugger. Whenever a 141 line is read, print it (to simulate the user typing it), and then 142 return it. The set of lines to return is specified in the 143 constructor; they should not have trailing newlines. 144 """ 145 def __init__(self, lines): 146 self.lines = lines 147 148 def readline(self): 149 line = self.lines.pop(0) 150 print line 151 return line+'\n' 152 153 ###################################################################### 154 ## Test Cases 155 ###################################################################### 156 157 def test_Example(): r""" 158 Unit tests for the `Example` class. 159 160 Example is a simple container class that holds: 161 - `source`: A source string. 162 - `want`: An expected output string. 163 - `exc_msg`: An expected exception message string (or None if no 164 exception is expected). 165 - `lineno`: A line number (within the docstring). 166 - `indent`: The example's indentation in the input string. 167 - `options`: An option dictionary, mapping option flags to True or 168 False. 169 170 These attributes are set by the constructor. `source` and `want` are 171 required; the other attributes all have default values: 172 173 >>> example = doctest.Example('print 1', '1\n') 174 >>> (example.source, example.want, example.exc_msg, 175 ... example.lineno, example.indent, example.options) 176 ('print 1\n', '1\n', None, 0, 0, {}) 177 178 The first three attributes (`source`, `want`, and `exc_msg`) may be 179 specified positionally; the remaining arguments should be specified as 180 keyword arguments: 181 182 >>> exc_msg = 'IndexError: pop from an empty list' 183 >>> example = doctest.Example('[].pop()', '', exc_msg, 184 ... lineno=5, indent=4, 185 ... options={doctest.ELLIPSIS: True}) 186 >>> (example.source, example.want, example.exc_msg, 187 ... example.lineno, example.indent, example.options) 188 ('[].pop()\n', '', 'IndexError: pop from an empty list\n', 5, 4, {8: True}) 189 190 The constructor normalizes the `source` string to end in a newline: 191 192 Source spans a single line: no terminating newline. 193 >>> e = doctest.Example('print 1', '1\n') 194 >>> e.source, e.want 195 ('print 1\n', '1\n') 196 197 >>> e = doctest.Example('print 1\n', '1\n') 198 >>> e.source, e.want 199 ('print 1\n', '1\n') 200 201 Source spans multiple lines: require terminating newline. 202 >>> e = doctest.Example('print 1;\nprint 2\n', '1\n2\n') 203 >>> e.source, e.want 204 ('print 1;\nprint 2\n', '1\n2\n') 205 206 >>> e = doctest.Example('print 1;\nprint 2', '1\n2\n') 207 >>> e.source, e.want 208 ('print 1;\nprint 2\n', '1\n2\n') 209 210 Empty source string (which should never appear in real examples) 211 >>> e = doctest.Example('', '') 212 >>> e.source, e.want 213 ('\n', '') 214 215 The constructor normalizes the `want` string to end in a newline, 216 unless it's the empty string: 217 218 >>> e = doctest.Example('print 1', '1\n') 219 >>> e.source, e.want 220 ('print 1\n', '1\n') 221 222 >>> e = doctest.Example('print 1', '1') 223 >>> e.source, e.want 224 ('print 1\n', '1\n') 225 226 >>> e = doctest.Example('print', '') 227 >>> e.source, e.want 228 ('print\n', '') 229 230 The constructor normalizes the `exc_msg` string to end in a newline, 231 unless it's `None`: 232 233 Message spans one line 234 >>> exc_msg = 'IndexError: pop from an empty list' 235 >>> e = doctest.Example('[].pop()', '', exc_msg) 236 >>> e.exc_msg 237 'IndexError: pop from an empty list\n' 238 239 >>> exc_msg = 'IndexError: pop from an empty list\n' 240 >>> e = doctest.Example('[].pop()', '', exc_msg) 241 >>> e.exc_msg 242 'IndexError: pop from an empty list\n' 243 244 Message spans multiple lines 245 >>> exc_msg = 'ValueError: 1\n 2' 246 >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg) 247 >>> e.exc_msg 248 'ValueError: 1\n 2\n' 249 250 >>> exc_msg = 'ValueError: 1\n 2\n' 251 >>> e = doctest.Example('raise ValueError("1\n 2")', '', exc_msg) 252 >>> e.exc_msg 253 'ValueError: 1\n 2\n' 254 255 Empty (but non-None) exception message (which should never appear 256 in real examples) 257 >>> exc_msg = '' 258 >>> e = doctest.Example('raise X()', '', exc_msg) 259 >>> e.exc_msg 260 '\n' 261 262 Compare `Example`: 263 >>> example = doctest.Example('print 1', '1\n') 264 >>> same_example = doctest.Example('print 1', '1\n') 265 >>> other_example = doctest.Example('print 42', '42\n') 266 >>> example == same_example 267 True 268 >>> example != same_example 269 False 270 >>> hash(example) == hash(same_example) 271 True 272 >>> example == other_example 273 False 274 >>> example != other_example 275 True 276 """ 277 278 def test_DocTest(): r""" 279 Unit tests for the `DocTest` class. 280 281 DocTest is a collection of examples, extracted from a docstring, along 282 with information about where the docstring comes from (a name, 283 filename, and line number). The docstring is parsed by the `DocTest` 284 constructor: 285 286 >>> docstring = ''' 287 ... >>> print 12 288 ... 12 289 ... 290 ... Non-example text. 291 ... 292 ... >>> print 'another\example' 293 ... another 294 ... example 295 ... ''' 296 >>> globs = {} # globals to run the test in. 297 >>> parser = doctest.DocTestParser() 298 >>> test = parser.get_doctest(docstring, globs, 'some_test', 299 ... 'some_file', 20) 300 >>> print test 301 <DocTest some_test from some_file:20 (2 examples)> 302 >>> len(test.examples) 303 2 304 >>> e1, e2 = test.examples 305 >>> (e1.source, e1.want, e1.lineno) 306 ('print 12\n', '12\n', 1) 307 >>> (e2.source, e2.want, e2.lineno) 308 ("print 'another\\example'\n", 'another\nexample\n', 6) 309 310 Source information (name, filename, and line number) is available as 311 attributes on the doctest object: 312 313 >>> (test.name, test.filename, test.lineno) 314 ('some_test', 'some_file', 20) 315 316 The line number of an example within its containing file is found by 317 adding the line number of the example and the line number of its 318 containing test: 319 320 >>> test.lineno + e1.lineno 321 21 322 >>> test.lineno + e2.lineno 323 26 324 325 If the docstring contains inconsistant leading whitespace in the 326 expected output of an example, then `DocTest` will raise a ValueError: 327 328 >>> docstring = r''' 329 ... >>> print 'bad\nindentation' 330 ... bad 331 ... indentation 332 ... ''' 333 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) 334 Traceback (most recent call last): 335 ValueError: line 4 of the docstring for some_test has inconsistent leading whitespace: 'indentation' 336 337 If the docstring contains inconsistent leading whitespace on 338 continuation lines, then `DocTest` will raise a ValueError: 339 340 >>> docstring = r''' 341 ... >>> print ('bad indentation', 342 ... ... 2) 343 ... ('bad', 'indentation') 344 ... ''' 345 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) 346 Traceback (most recent call last): 347 ValueError: line 2 of the docstring for some_test has inconsistent leading whitespace: '... 2)' 348 349 If there's no blank space after a PS1 prompt ('>>>'), then `DocTest` 350 will raise a ValueError: 351 352 >>> docstring = '>>>print 1\n1' 353 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) 354 Traceback (most recent call last): 355 ValueError: line 1 of the docstring for some_test lacks blank after >>>: '>>>print 1' 356 357 If there's no blank space after a PS2 prompt ('...'), then `DocTest` 358 will raise a ValueError: 359 360 >>> docstring = '>>> if 1:\n...print 1\n1' 361 >>> parser.get_doctest(docstring, globs, 'some_test', 'filename', 0) 362 Traceback (most recent call last): 363 ValueError: line 2 of the docstring for some_test lacks blank after ...: '...print 1' 364 365 Compare `DocTest`: 366 367 >>> docstring = ''' 368 ... >>> print 12 369 ... 12 370 ... ''' 371 >>> test = parser.get_doctest(docstring, globs, 'some_test', 372 ... 'some_test', 20) 373 >>> same_test = parser.get_doctest(docstring, globs, 'some_test', 374 ... 'some_test', 20) 375 >>> test == same_test 376 True 377 >>> test != same_test 378 False 379 >>> hash(test) == hash(same_test) 380 True 381 >>> docstring = ''' 382 ... >>> print 42 383 ... 42 384 ... ''' 385 >>> other_test = parser.get_doctest(docstring, globs, 'other_test', 386 ... 'other_file', 10) 387 >>> test == other_test 388 False 389 >>> test != other_test 390 True 391 392 Compare `DocTestCase`: 393 394 >>> DocTestCase = doctest.DocTestCase 395 >>> test_case = DocTestCase(test) 396 >>> same_test_case = DocTestCase(same_test) 397 >>> other_test_case = DocTestCase(other_test) 398 >>> test_case == same_test_case 399 True 400 >>> test_case != same_test_case 401 False 402 >>> hash(test_case) == hash(same_test_case) 403 True 404 >>> test == other_test_case 405 False 406 >>> test != other_test_case 407 True 408 409 """ 410 411 def test_DocTestFinder(): r""" 412 Unit tests for the `DocTestFinder` class. 413 414 DocTestFinder is used to extract DocTests from an object's docstring 415 and the docstrings of its contained objects. It can be used with 416 modules, functions, classes, methods, staticmethods, classmethods, and 417 properties. 418 419 Finding Tests in Functions 420 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 For a function whose docstring contains examples, DocTestFinder.find() 422 will return a single test (for that function's docstring): 423 424 >>> finder = doctest.DocTestFinder() 425 426 We'll simulate a __file__ attr that ends in pyc: 427 428 >>> import test.test_doctest 429 >>> old = test.test_doctest.__file__ 430 >>> test.test_doctest.__file__ = 'test_doctest.pyc' 431 432 >>> tests = finder.find(sample_func) 433 434 >>> print tests # doctest: +ELLIPSIS 435 [<DocTest sample_func from ...:17 (1 example)>] 436 437 The exact name depends on how test_doctest was invoked, so allow for 438 leading path components. 439 440 >>> tests[0].filename # doctest: +ELLIPSIS 441 '...test_doctest.py' 442 443 >>> test.test_doctest.__file__ = old 444 445 446 >>> e = tests[0].examples[0] 447 >>> (e.source, e.want, e.lineno) 448 ('print sample_func(22)\n', '44\n', 3) 449 450 By default, tests are created for objects with no docstring: 451 452 >>> def no_docstring(v): 453 ... pass 454 >>> finder.find(no_docstring) 455 [] 456 457 However, the optional argument `exclude_empty` to the DocTestFinder 458 constructor can be used to exclude tests for objects with empty 459 docstrings: 460 461 >>> def no_docstring(v): 462 ... pass 463 >>> excl_empty_finder = doctest.DocTestFinder(exclude_empty=True) 464 >>> excl_empty_finder.find(no_docstring) 465 [] 466 467 If the function has a docstring with no examples, then a test with no 468 examples is returned. (This lets `DocTestRunner` collect statistics 469 about which functions have no tests -- but is that useful? And should 470 an empty test also be created when there's no docstring?) 471 472 >>> def no_examples(v): 473 ... ''' no doctest examples ''' 474 >>> finder.find(no_examples) # doctest: +ELLIPSIS 475 [<DocTest no_examples from ...:1 (no examples)>] 476 477 Finding Tests in Classes 478 ~~~~~~~~~~~~~~~~~~~~~~~~ 479 For a class, DocTestFinder will create a test for the class's 480 docstring, and will recursively explore its contents, including 481 methods, classmethods, staticmethods, properties, and nested classes. 482 483 >>> finder = doctest.DocTestFinder() 484 >>> tests = finder.find(SampleClass) 485 >>> for t in tests: 486 ... print '%2s %s' % (len(t.examples), t.name) 487 3 SampleClass 488 3 SampleClass.NestedClass 489 1 SampleClass.NestedClass.__init__ 490 1 SampleClass.__init__ 491 2 SampleClass.a_classmethod 492 1 SampleClass.a_property 493 1 SampleClass.a_staticmethod 494 1 SampleClass.double 495 1 SampleClass.get 496 497 New-style classes are also supported: 498 499 >>> tests = finder.find(SampleNewStyleClass) 500 >>> for t in tests: 501 ... print '%2s %s' % (len(t.examples), t.name) 502 1 SampleNewStyleClass 503 1 SampleNewStyleClass.__init__ 504 1 SampleNewStyleClass.double 505 1 SampleNewStyleClass.get 506 507 Finding Tests in Modules 508 ~~~~~~~~~~~~~~~~~~~~~~~~ 509 For a module, DocTestFinder will create a test for the class's 510 docstring, and will recursively explore its contents, including 511 functions, classes, and the `__test__` dictionary, if it exists: 512 513 >>> # A module 514 >>> import types 515 >>> m = types.ModuleType('some_module') 516 >>> def triple(val): 517 ... ''' 518 ... >>> print triple(11) 519 ... 33 520 ... ''' 521 ... return val*3 522 >>> m.__dict__.update({ 523 ... 'sample_func': sample_func, 524 ... 'SampleClass': SampleClass, 525 ... '__doc__': ''' 526 ... Module docstring. 527 ... >>> print 'module' 528 ... module 529 ... ''', 530 ... '__test__': { 531 ... 'd': '>>> print 6\n6\n>>> print 7\n7\n', 532 ... 'c': triple}}) 533 534 >>> finder = doctest.DocTestFinder() 535 >>> # Use module=test.test_doctest, to prevent doctest from 536 >>> # ignoring the objects since they weren't defined in m. 537 >>> import test.test_doctest 538 >>> tests = finder.find(m, module=test.test_doctest) 539 >>> for t in tests: 540 ... print '%2s %s' % (len(t.examples), t.name) 541 1 some_module 542 3 some_module.SampleClass 543 3 some_module.SampleClass.NestedClass 544 1 some_module.SampleClass.NestedClass.__init__ 545 1 some_module.SampleClass.__init__ 546 2 some_module.SampleClass.a_classmethod 547 1 some_module.SampleClass.a_property 548 1 some_module.SampleClass.a_staticmethod 549 1 some_module.SampleClass.double 550 1 some_module.SampleClass.get 551 1 some_module.__test__.c 552 2 some_module.__test__.d 553 1 some_module.sample_func 554 555 Duplicate Removal 556 ~~~~~~~~~~~~~~~~~ 557 If a single object is listed twice (under different names), then tests 558 will only be generated for it once: 559 560 >>> from test import doctest_aliases 561 >>> assert doctest_aliases.TwoNames.f 562 >>> assert doctest_aliases.TwoNames.g 563 >>> tests = excl_empty_finder.find(doctest_aliases) 564 >>> print len(tests) 565 2 566 >>> print tests[0].name 567 test.doctest_aliases.TwoNames 568 569 TwoNames.f and TwoNames.g are bound to the same object. 570 We can't guess which will be found in doctest's traversal of 571 TwoNames.__dict__ first, so we have to allow for either. 572 573 >>> tests[1].name.split('.')[-1] in ['f', 'g'] 574 True 575 576 Empty Tests 577 ~~~~~~~~~~~ 578 By default, an object with no doctests doesn't create any tests: 579 580 >>> tests = doctest.DocTestFinder().find(SampleClass) 581 >>> for t in tests: 582 ... print '%2s %s' % (len(t.examples), t.name) 583 3 SampleClass 584 3 SampleClass.NestedClass 585 1 SampleClass.NestedClass.__init__ 586 1 SampleClass.__init__ 587 2 SampleClass.a_classmethod 588 1 SampleClass.a_property 589 1 SampleClass.a_staticmethod 590 1 SampleClass.double 591 1 SampleClass.get 592 593 By default, that excluded objects with no doctests. exclude_empty=False 594 tells it to include (empty) tests for objects with no doctests. This feature 595 is really to support backward compatibility in what doctest.master.summarize() 596 displays. 597 598 >>> tests = doctest.DocTestFinder(exclude_empty=False).find(SampleClass) 599 >>> for t in tests: 600 ... print '%2s %s' % (len(t.examples), t.name) 601 3 SampleClass 602 3 SampleClass.NestedClass 603 1 SampleClass.NestedClass.__init__ 604 0 SampleClass.NestedClass.get 605 0 SampleClass.NestedClass.square 606 1 SampleClass.__init__ 607 2 SampleClass.a_classmethod 608 1 SampleClass.a_property 609 1 SampleClass.a_staticmethod 610 1 SampleClass.double 611 1 SampleClass.get 612 613 Turning off Recursion 614 ~~~~~~~~~~~~~~~~~~~~~ 615 DocTestFinder can be told not to look for tests in contained objects 616 using the `recurse` flag: 617 618 >>> tests = doctest.DocTestFinder(recurse=False).find(SampleClass) 619 >>> for t in tests: 620 ... print '%2s %s' % (len(t.examples), t.name) 621 3 SampleClass 622 623 Line numbers 624 ~~~~~~~~~~~~ 625 DocTestFinder finds the line number of each example: 626 627 >>> def f(x): 628 ... ''' 629 ... >>> x = 12 630 ... 631 ... some text 632 ... 633 ... >>> # examples are not created for comments & bare prompts. 634 ... >>> 635 ... ... 636 ... 637 ... >>> for x in range(10): 638 ... ... print x, 639 ... 0 1 2 3 4 5 6 7 8 9 640 ... >>> x//2 641 ... 6 642 ... ''' 643 >>> test = doctest.DocTestFinder().find(f)[0] 644 >>> [e.lineno for e in test.examples] 645 [1, 9, 12] 646 """ 647 648 def test_DocTestParser(): r""" 649 Unit tests for the `DocTestParser` class. 650 651 DocTestParser is used to parse docstrings containing doctest examples. 652 653 The `parse` method divides a docstring into examples and intervening 654 text: 655 656 >>> s = ''' 657 ... >>> x, y = 2, 3 # no output expected 658 ... >>> if 1: 659 ... ... print x 660 ... ... print y 661 ... 2 662 ... 3 663 ... 664 ... Some text. 665 ... >>> x+y 666 ... 5 667 ... ''' 668 >>> parser = doctest.DocTestParser() 669 >>> for piece in parser.parse(s): 670 ... if isinstance(piece, doctest.Example): 671 ... print 'Example:', (piece.source, piece.want, piece.lineno) 672 ... else: 673 ... print ' Text:', `piece` 674 Text: '\n' 675 Example: ('x, y = 2, 3 # no output expected\n', '', 1) 676 Text: '' 677 Example: ('if 1:\n print x\n print y\n', '2\n3\n', 2) 678 Text: '\nSome text.\n' 679 Example: ('x+y\n', '5\n', 9) 680 Text: '' 681 682 The `get_examples` method returns just the examples: 683 684 >>> for piece in parser.get_examples(s): 685 ... print (piece.source, piece.want, piece.lineno) 686 ('x, y = 2, 3 # no output expected\n', '', 1) 687 ('if 1:\n print x\n print y\n', '2\n3\n', 2) 688 ('x+y\n', '5\n', 9) 689 690 The `get_doctest` method creates a Test from the examples, along with the 691 given arguments: 692 693 >>> test = parser.get_doctest(s, {}, 'name', 'filename', lineno=5) 694 >>> (test.name, test.filename, test.lineno) 695 ('name', 'filename', 5) 696 >>> for piece in test.examples: 697 ... print (piece.source, piece.want, piece.lineno) 698 ('x, y = 2, 3 # no output expected\n', '', 1) 699 ('if 1:\n print x\n print y\n', '2\n3\n', 2) 700 ('x+y\n', '5\n', 9) 701 """ 702 703 class test_DocTestRunner: 704 def basics(): r""" 705 Unit tests for the `DocTestRunner` class. 706 707 DocTestRunner is used to run DocTest test cases, and to accumulate 708 statistics. Here's a simple DocTest case we can use: 709 710 >>> def f(x): 711 ... ''' 712 ... >>> x = 12 713 ... >>> print x 714 ... 12 715 ... >>> x//2 716 ... 6 717 ... ''' 718 >>> test = doctest.DocTestFinder().find(f)[0] 719 720 The main DocTestRunner interface is the `run` method, which runs a 721 given DocTest case in a given namespace (globs). It returns a tuple 722 `(f,t)`, where `f` is the number of failed tests and `t` is the number 723 of tried tests. 724 725 >>> doctest.DocTestRunner(verbose=False).run(test) 726 TestResults(failed=0, attempted=3) 727 728 If any example produces incorrect output, then the test runner reports 729 the failure and proceeds to the next example: 730 731 >>> def f(x): 732 ... ''' 733 ... >>> x = 12 734 ... >>> print x 735 ... 14 736 ... >>> x//2 737 ... 6 738 ... ''' 739 >>> test = doctest.DocTestFinder().find(f)[0] 740 >>> doctest.DocTestRunner(verbose=True).run(test) 741 ... # doctest: +ELLIPSIS 742 Trying: 743 x = 12 744 Expecting nothing 745 ok 746 Trying: 747 print x 748 Expecting: 749 14 750 ********************************************************************** 751 File ..., line 4, in f 752 Failed example: 753 print x 754 Expected: 755 14 756 Got: 757 12 758 Trying: 759 x//2 760 Expecting: 761 6 762 ok 763 TestResults(failed=1, attempted=3) 764 """ 765 def verbose_flag(): r""" 766 The `verbose` flag makes the test runner generate more detailed 767 output: 768 769 >>> def f(x): 770 ... ''' 771 ... >>> x = 12 772 ... >>> print x 773 ... 12 774 ... >>> x//2 775 ... 6 776 ... ''' 777 >>> test = doctest.DocTestFinder().find(f)[0] 778 779 >>> doctest.DocTestRunner(verbose=True).run(test) 780 Trying: 781 x = 12 782 Expecting nothing 783 ok 784 Trying: 785 print x 786 Expecting: 787 12 788 ok 789 Trying: 790 x//2 791 Expecting: 792 6 793 ok 794 TestResults(failed=0, attempted=3) 795 796 If the `verbose` flag is unspecified, then the output will be verbose 797 iff `-v` appears in sys.argv: 798 799 >>> # Save the real sys.argv list. 800 >>> old_argv = sys.argv 801 802 >>> # If -v does not appear in sys.argv, then output isn't verbose. 803 >>> sys.argv = ['test'] 804 >>> doctest.DocTestRunner().run(test) 805 TestResults(failed=0, attempted=3) 806 807 >>> # If -v does appear in sys.argv, then output is verbose. 808 >>> sys.argv = ['test', '-v'] 809 >>> doctest.DocTestRunner().run(test) 810 Trying: 811 x = 12 812 Expecting nothing 813 ok 814 Trying: 815 print x 816 Expecting: 817 12 818 ok 819 Trying: 820 x//2 821 Expecting: 822 6 823 ok 824 TestResults(failed=0, attempted=3) 825 826 >>> # Restore sys.argv 827 >>> sys.argv = old_argv 828 829 In the remaining examples, the test runner's verbosity will be 830 explicitly set, to ensure that the test behavior is consistent. 831 """ 832 def exceptions(): r""" 833 Tests of `DocTestRunner`'s exception handling. 834 835 An expected exception is specified with a traceback message. The 836 lines between the first line and the type/value may be omitted or 837 replaced with any other string: 838 839 >>> def f(x): 840 ... ''' 841 ... >>> x = 12 842 ... >>> print x//0 843 ... Traceback (most recent call last): 844 ... ZeroDivisionError: integer division or modulo by zero 845 ... ''' 846 >>> test = doctest.DocTestFinder().find(f)[0] 847 >>> doctest.DocTestRunner(verbose=False).run(test) 848 TestResults(failed=0, attempted=2) 849 850 An example may not generate output before it raises an exception; if 851 it does, then the traceback message will not be recognized as 852 signaling an expected exception, so the example will be reported as an 853 unexpected exception: 854 855 >>> def f(x): 856 ... ''' 857 ... >>> x = 12 858 ... >>> print 'pre-exception output', x//0 859 ... pre-exception output 860 ... Traceback (most recent call last): 861 ... ZeroDivisionError: integer division or modulo by zero 862 ... ''' 863 >>> test = doctest.DocTestFinder().find(f)[0] 864 >>> doctest.DocTestRunner(verbose=False).run(test) 865 ... # doctest: +ELLIPSIS 866 ********************************************************************** 867 File ..., line 4, in f 868 Failed example: 869 print 'pre-exception output', x//0 870 Exception raised: 871 ... 872 ZeroDivisionError: integer division or modulo by zero 873 TestResults(failed=1, attempted=2) 874 875 Exception messages may contain newlines: 876 877 >>> def f(x): 878 ... r''' 879 ... >>> raise ValueError, 'multi\nline\nmessage' 880 ... Traceback (most recent call last): 881 ... ValueError: multi 882 ... line 883 ... message 884 ... ''' 885 >>> test = doctest.DocTestFinder().find(f)[0] 886 >>> doctest.DocTestRunner(verbose=False).run(test) 887 TestResults(failed=0, attempted=1) 888 889 If an exception is expected, but an exception with the wrong type or 890 message is raised, then it is reported as a failure: 891 892 >>> def f(x): 893 ... r''' 894 ... >>> raise ValueError, 'message' 895 ... Traceback (most recent call last): 896 ... ValueError: wrong message 897 ... ''' 898 >>> test = doctest.DocTestFinder().find(f)[0] 899 >>> doctest.DocTestRunner(verbose=False).run(test) 900 ... # doctest: +ELLIPSIS 901 ********************************************************************** 902 File ..., line 3, in f 903 Failed example: 904 raise ValueError, 'message' 905 Expected: 906 Traceback (most recent call last): 907 ValueError: wrong message 908 Got: 909 Traceback (most recent call last): 910 ... 911 ValueError: message 912 TestResults(failed=1, attempted=1) 913 914 However, IGNORE_EXCEPTION_DETAIL can be used to allow a mismatch in the 915 detail: 916 917 >>> def f(x): 918 ... r''' 919 ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL 920 ... Traceback (most recent call last): 921 ... ValueError: wrong message 922 ... ''' 923 >>> test = doctest.DocTestFinder().find(f)[0] 924 >>> doctest.DocTestRunner(verbose=False).run(test) 925 TestResults(failed=0, attempted=1) 926 927 IGNORE_EXCEPTION_DETAIL also ignores difference in exception formatting 928 between Python versions. For example, in Python 3.x, the module path of 929 the exception is in the output, but this will fail under Python 2: 930 931 >>> def f(x): 932 ... r''' 933 ... >>> from httplib import HTTPException 934 ... >>> raise HTTPException('message') 935 ... Traceback (most recent call last): 936 ... httplib.HTTPException: message 937 ... ''' 938 >>> test = doctest.DocTestFinder().find(f)[0] 939 >>> doctest.DocTestRunner(verbose=False).run(test) 940 ... # doctest: +ELLIPSIS 941 ********************************************************************** 942 File ..., line 4, in f 943 Failed example: 944 raise HTTPException('message') 945 Expected: 946 Traceback (most recent call last): 947 httplib.HTTPException: message 948 Got: 949 Traceback (most recent call last): 950 ... 951 HTTPException: message 952 TestResults(failed=1, attempted=2) 953 954 But in Python 2 the module path is not included, an therefore a test must look 955 like the following test to succeed in Python 2. But that test will fail under 956 Python 3. 957 958 >>> def f(x): 959 ... r''' 960 ... >>> from httplib import HTTPException 961 ... >>> raise HTTPException('message') 962 ... Traceback (most recent call last): 963 ... HTTPException: message 964 ... ''' 965 >>> test = doctest.DocTestFinder().find(f)[0] 966 >>> doctest.DocTestRunner(verbose=False).run(test) 967 TestResults(failed=0, attempted=2) 968 969 However, with IGNORE_EXCEPTION_DETAIL, the module name of the exception 970 (if any) will be ignored: 971 972 >>> def f(x): 973 ... r''' 974 ... >>> from httplib import HTTPException 975 ... >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL 976 ... Traceback (most recent call last): 977 ... HTTPException: message 978 ... ''' 979 >>> test = doctest.DocTestFinder().find(f)[0] 980 >>> doctest.DocTestRunner(verbose=False).run(test) 981 TestResults(failed=0, attempted=2) 982 983 The module path will be completely ignored, so two different module paths will 984 still pass if IGNORE_EXCEPTION_DETAIL is given. This is intentional, so it can 985 be used when exceptions have changed module. 986 987 >>> def f(x): 988 ... r''' 989 ... >>> from httplib import HTTPException 990 ... >>> raise HTTPException('message') #doctest: +IGNORE_EXCEPTION_DETAIL 991 ... Traceback (most recent call last): 992 ... foo.bar.HTTPException: message 993 ... ''' 994 >>> test = doctest.DocTestFinder().find(f)[0] 995 >>> doctest.DocTestRunner(verbose=False).run(test) 996 TestResults(failed=0, attempted=2) 997 998 But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type: 999 1000 >>> def f(x): 1001 ... r''' 1002 ... >>> raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL 1003 ... Traceback (most recent call last): 1004 ... TypeError: wrong type 1005 ... ''' 1006 >>> test = doctest.DocTestFinder().find(f)[0] 1007 >>> doctest.DocTestRunner(verbose=False).run(test) 1008 ... # doctest: +ELLIPSIS 1009 ********************************************************************** 1010 File ..., line 3, in f 1011 Failed example: 1012 raise ValueError, 'message' #doctest: +IGNORE_EXCEPTION_DETAIL 1013 Expected: 1014 Traceback (most recent call last): 1015 TypeError: wrong type 1016 Got: 1017 Traceback (most recent call last): 1018 ... 1019 ValueError: message 1020 TestResults(failed=1, attempted=1) 1021 1022 If an exception is raised but not expected, then it is reported as an 1023 unexpected exception: 1024 1025 >>> def f(x): 1026 ... r''' 1027 ... >>> 1//0 1028 ... 0 1029 ... ''' 1030 >>> test = doctest.DocTestFinder().find(f)[0] 1031 >>> doctest.DocTestRunner(verbose=False).run(test) 1032 ... # doctest: +ELLIPSIS 1033 ********************************************************************** 1034 File ..., line 3, in f 1035 Failed example: 1036 1//0 1037 Exception raised: 1038 Traceback (most recent call last): 1039 ... 1040 ZeroDivisionError: integer division or modulo by zero 1041 TestResults(failed=1, attempted=1) 1042 """ 1043 def displayhook(): r""" 1044 Test that changing sys.displayhook doesn't matter for doctest. 1045 1046 >>> import sys 1047 >>> orig_displayhook = sys.displayhook 1048 >>> def my_displayhook(x): 1049 ... print('hi!') 1050 >>> sys.displayhook = my_displayhook 1051 >>> def f(): 1052 ... ''' 1053 ... >>> 3 1054 ... 3 1055 ... ''' 1056 >>> test = doctest.DocTestFinder().find(f)[0] 1057 >>> r = doctest.DocTestRunner(verbose=False).run(test) 1058 >>> post_displayhook = sys.displayhook 1059 1060 We need to restore sys.displayhook now, so that we'll be able to test 1061 results. 1062 1063 >>> sys.displayhook = orig_displayhook 1064 1065 Ok, now we can check that everything is ok. 1066 1067 >>> r 1068 TestResults(failed=0, attempted=1) 1069 >>> post_displayhook is my_displayhook 1070 True 1071 """ 1072 def optionflags(): r""" 1073 Tests of `DocTestRunner`'s option flag handling. 1074 1075 Several option flags can be used to customize the behavior of the test 1076 runner. These are defined as module constants in doctest, and passed 1077 to the DocTestRunner constructor (multiple constants should be ORed 1078 together). 1079 1080 The DONT_ACCEPT_TRUE_FOR_1 flag disables matches between True/False 1081 and 1/0: 1082 1083 >>> def f(x): 1084 ... '>>> True\n1\n' 1085 1086 >>> # Without the flag: 1087 >>> test = doctest.DocTestFinder().find(f)[0] 1088 >>> doctest.DocTestRunner(verbose=False).run(test) 1089 TestResults(failed=0, attempted=1) 1090 1091 >>> # With the flag: 1092 >>> test = doctest.DocTestFinder().find(f)[0] 1093 >>> flags = doctest.DONT_ACCEPT_TRUE_FOR_1 1094 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1095 ... # doctest: +ELLIPSIS 1096 ********************************************************************** 1097 File ..., line 2, in f 1098 Failed example: 1099 True 1100 Expected: 1101 1 1102 Got: 1103 True 1104 TestResults(failed=1, attempted=1) 1105 1106 The DONT_ACCEPT_BLANKLINE flag disables the match between blank lines 1107 and the '<BLANKLINE>' marker: 1108 1109 >>> def f(x): 1110 ... '>>> print "a\\n\\nb"\na\n<BLANKLINE>\nb\n' 1111 1112 >>> # Without the flag: 1113 >>> test = doctest.DocTestFinder().find(f)[0] 1114 >>> doctest.DocTestRunner(verbose=False).run(test) 1115 TestResults(failed=0, attempted=1) 1116 1117 >>> # With the flag: 1118 >>> test = doctest.DocTestFinder().find(f)[0] 1119 >>> flags = doctest.DONT_ACCEPT_BLANKLINE 1120 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1121 ... # doctest: +ELLIPSIS 1122 ********************************************************************** 1123 File ..., line 2, in f 1124 Failed example: 1125 print "a\n\nb" 1126 Expected: 1127 a 1128 <BLANKLINE> 1129 b 1130 Got: 1131 a 1132 <BLANKLINE> 1133 b 1134 TestResults(failed=1, attempted=1) 1135 1136 The NORMALIZE_WHITESPACE flag causes all sequences of whitespace to be 1137 treated as equal: 1138 1139 >>> def f(x): 1140 ... '>>> print 1, 2, 3\n 1 2\n 3' 1141 1142 >>> # Without the flag: 1143 >>> test = doctest.DocTestFinder().find(f)[0] 1144 >>> doctest.DocTestRunner(verbose=False).run(test) 1145 ... # doctest: +ELLIPSIS 1146 ********************************************************************** 1147 File ..., line 2, in f 1148 Failed example: 1149 print 1, 2, 3 1150 Expected: 1151 1 2 1152 3 1153 Got: 1154 1 2 3 1155 TestResults(failed=1, attempted=1) 1156 1157 >>> # With the flag: 1158 >>> test = doctest.DocTestFinder().find(f)[0] 1159 >>> flags = doctest.NORMALIZE_WHITESPACE 1160 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1161 TestResults(failed=0, attempted=1) 1162 1163 An example from the docs: 1164 >>> print range(20) #doctest: +NORMALIZE_WHITESPACE 1165 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1166 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 1167 1168 The ELLIPSIS flag causes ellipsis marker ("...") in the expected 1169 output to match any substring in the actual output: 1170 1171 >>> def f(x): 1172 ... '>>> print range(15)\n[0, 1, 2, ..., 14]\n' 1173 1174 >>> # Without the flag: 1175 >>> test = doctest.DocTestFinder().find(f)[0] 1176 >>> doctest.DocTestRunner(verbose=False).run(test) 1177 ... # doctest: +ELLIPSIS 1178 ********************************************************************** 1179 File ..., line 2, in f 1180 Failed example: 1181 print range(15) 1182 Expected: 1183 [0, 1, 2, ..., 14] 1184 Got: 1185 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 1186 TestResults(failed=1, attempted=1) 1187 1188 >>> # With the flag: 1189 >>> test = doctest.DocTestFinder().find(f)[0] 1190 >>> flags = doctest.ELLIPSIS 1191 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1192 TestResults(failed=0, attempted=1) 1193 1194 ... also matches nothing: 1195 1196 >>> for i in range(100): 1197 ... print i**2, #doctest: +ELLIPSIS 1198 0 1...4...9 16 ... 36 49 64 ... 9801 1199 1200 ... can be surprising; e.g., this test passes: 1201 1202 >>> for i in range(21): #doctest: +ELLIPSIS 1203 ... print i, 1204 0 1 2 ...1...2...0 1205 1206 Examples from the docs: 1207 1208 >>> print range(20) # doctest:+ELLIPSIS 1209 [0, 1, ..., 18, 19] 1210 1211 >>> print range(20) # doctest: +ELLIPSIS 1212 ... # doctest: +NORMALIZE_WHITESPACE 1213 [0, 1, ..., 18, 19] 1214 1215 The SKIP flag causes an example to be skipped entirely. I.e., the 1216 example is not run. It can be useful in contexts where doctest 1217 examples serve as both documentation and test cases, and an example 1218 should be included for documentation purposes, but should not be 1219 checked (e.g., because its output is random, or depends on resources 1220 which would be unavailable.) The SKIP flag can also be used for 1221 'commenting out' broken examples. 1222 1223 >>> import unavailable_resource # doctest: +SKIP 1224 >>> unavailable_resource.do_something() # doctest: +SKIP 1225 >>> unavailable_resource.blow_up() # doctest: +SKIP 1226 Traceback (most recent call last): 1227 ... 1228 UncheckedBlowUpError: Nobody checks me. 1229 1230 >>> import random 1231 >>> print random.random() # doctest: +SKIP 1232 0.721216923889 1233 1234 The REPORT_UDIFF flag causes failures that involve multi-line expected 1235 and actual outputs to be displayed using a unified diff: 1236 1237 >>> def f(x): 1238 ... r''' 1239 ... >>> print '\n'.join('abcdefg') 1240 ... a 1241 ... B 1242 ... c 1243 ... d 1244 ... f 1245 ... g 1246 ... h 1247 ... ''' 1248 1249 >>> # Without the flag: 1250 >>> test = doctest.DocTestFinder().find(f)[0] 1251 >>> doctest.DocTestRunner(verbose=False).run(test) 1252 ... # doctest: +ELLIPSIS 1253 ********************************************************************** 1254 File ..., line 3, in f 1255 Failed example: 1256 print '\n'.join('abcdefg') 1257 Expected: 1258 a 1259 B 1260 c 1261 d 1262 f 1263 g 1264 h 1265 Got: 1266 a 1267 b 1268 c 1269 d 1270 e 1271 f 1272 g 1273 TestResults(failed=1, attempted=1) 1274 1275 >>> # With the flag: 1276 >>> test = doctest.DocTestFinder().find(f)[0] 1277 >>> flags = doctest.REPORT_UDIFF 1278 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1279 ... # doctest: +ELLIPSIS 1280 ********************************************************************** 1281 File ..., line 3, in f 1282 Failed example: 1283 print '\n'.join('abcdefg') 1284 Differences (unified diff with -expected +actual): 1285 @@ -1,7 +1,7 @@ 1286 a 1287 -B 1288 +b 1289 c 1290 d 1291 +e 1292 f 1293 g 1294 -h 1295 TestResults(failed=1, attempted=1) 1296 1297 The REPORT_CDIFF flag causes failures that involve multi-line expected 1298 and actual outputs to be displayed using a context diff: 1299 1300 >>> # Reuse f() from the REPORT_UDIFF example, above. 1301 >>> test = doctest.DocTestFinder().find(f)[0] 1302 >>> flags = doctest.REPORT_CDIFF 1303 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1304 ... # doctest: +ELLIPSIS 1305 ********************************************************************** 1306 File ..., line 3, in f 1307 Failed example: 1308 print '\n'.join('abcdefg') 1309 Differences (context diff with expected followed by actual): 1310 *************** 1311 *** 1,7 **** 1312 a 1313 ! B 1314 c 1315 d 1316 f 1317 g 1318 - h 1319 --- 1,7 ---- 1320 a 1321 ! b 1322 c 1323 d 1324 + e 1325 f 1326 g 1327 TestResults(failed=1, attempted=1) 1328 1329 1330 The REPORT_NDIFF flag causes failures to use the difflib.Differ algorithm 1331 used by the popular ndiff.py utility. This does intraline difference 1332 marking, as well as interline differences. 1333 1334 >>> def f(x): 1335 ... r''' 1336 ... >>> print "a b c d e f g h i j k l m" 1337 ... a b c d e f g h i j k 1 m 1338 ... ''' 1339 >>> test = doctest.DocTestFinder().find(f)[0] 1340 >>> flags = doctest.REPORT_NDIFF 1341 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1342 ... # doctest: +ELLIPSIS 1343 ********************************************************************** 1344 File ..., line 3, in f 1345 Failed example: 1346 print "a b c d e f g h i j k l m" 1347 Differences (ndiff with -expected +actual): 1348 - a b c d e f g h i j k 1 m 1349 ? ^ 1350 + a b c d e f g h i j k l m 1351 ? + ++ ^ 1352 TestResults(failed=1, attempted=1) 1353 1354 The REPORT_ONLY_FIRST_FAILURE suppresses result output after the first 1355 failing example: 1356 1357 >>> def f(x): 1358 ... r''' 1359 ... >>> print 1 # first success 1360 ... 1 1361 ... >>> print 2 # first failure 1362 ... 200 1363 ... >>> print 3 # second failure 1364 ... 300 1365 ... >>> print 4 # second success 1366 ... 4 1367 ... >>> print 5 # third failure 1368 ... 500 1369 ... ''' 1370 >>> test = doctest.DocTestFinder().find(f)[0] 1371 >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE 1372 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1373 ... # doctest: +ELLIPSIS 1374 ********************************************************************** 1375 File ..., line 5, in f 1376 Failed example: 1377 print 2 # first failure 1378 Expected: 1379 200 1380 Got: 1381 2 1382 TestResults(failed=3, attempted=5) 1383 1384 However, output from `report_start` is not suppressed: 1385 1386 >>> doctest.DocTestRunner(verbose=True, optionflags=flags).run(test) 1387 ... # doctest: +ELLIPSIS 1388 Trying: 1389 print 1 # first success 1390 Expecting: 1391 1 1392 ok 1393 Trying: 1394 print 2 # first failure 1395 Expecting: 1396 200 1397 ********************************************************************** 1398 File ..., line 5, in f 1399 Failed example: 1400 print 2 # first failure 1401 Expected: 1402 200 1403 Got: 1404 2 1405 TestResults(failed=3, attempted=5) 1406 1407 For the purposes of REPORT_ONLY_FIRST_FAILURE, unexpected exceptions 1408 count as failures: 1409 1410 >>> def f(x): 1411 ... r''' 1412 ... >>> print 1 # first success 1413 ... 1 1414 ... >>> raise ValueError(2) # first failure 1415 ... 200 1416 ... >>> print 3 # second failure 1417 ... 300 1418 ... >>> print 4 # second success 1419 ... 4 1420 ... >>> print 5 # third failure 1421 ... 500 1422 ... ''' 1423 >>> test = doctest.DocTestFinder().find(f)[0] 1424 >>> flags = doctest.REPORT_ONLY_FIRST_FAILURE 1425 >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test) 1426 ... # doctest: +ELLIPSIS 1427 ********************************************************************** 1428 File ..., line 5, in f 1429 Failed example: 1430 raise ValueError(2) # first failure 1431 Exception raised: 1432 ... 1433 ValueError: 2 1434 TestResults(failed=3, attempted=5) 1435 1436 New option flags can also be registered, via register_optionflag(). Here 1437 we reach into doctest's internals a bit. 1438 1439 >>> unlikely = "UNLIKELY_OPTION_NAME" 1440 >>> unlikely in doctest.OPTIONFLAGS_BY_NAME 1441 False 1442 >>> new_flag_value = doctest.register_optionflag(unlikely) 1443 >>> unlikely in doctest.OPTIONFLAGS_BY_NAME 1444 True 1445 1446 Before 2.4.4/2.5, registering a name more than once erroneously created 1447 more than one flag value. Here we verify that's fixed: 1448 1449 >>> redundant_flag_value = doctest.register_optionflag(unlikely) 1450 >>> redundant_flag_value == new_flag_value 1451 True 1452 1453 Clean up. 1454 >>> del doctest.OPTIONFLAGS_BY_NAME[unlikely] 1455 1456 """ 1457 1458 def option_directives(): r""" 1459 Tests of `DocTestRunner`'s option directive mechanism. 1460 1461 Option directives can be used to turn option flags on or off for a 1462 single example. To turn an option on for an example, follow that 1463 example with a comment of the form ``# doctest: +OPTION``: 1464 1465 >>> def f(x): r''' 1466 ... >>> print range(10) # should fail: no ellipsis 1467 ... [0, 1, ..., 9] 1468 ... 1469 ... >>> print range(10) # doctest: +ELLIPSIS 1470 ... [0, 1, ..., 9] 1471 ... ''' 1472 >>> test = doctest.DocTestFinder().find(f)[0] 1473 >>> doctest.DocTestRunner(verbose=False).run(test) 1474 ... # doctest: +ELLIPSIS 1475 ********************************************************************** 1476 File ..., line 2, in f 1477 Failed example: 1478 print range(10) # should fail: no ellipsis 1479 Expected: 1480 [0, 1, ..., 9] 1481 Got: 1482 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1483 TestResults(failed=1, attempted=2) 1484 1485 To turn an option off for an example, follow that example with a 1486 comment of the form ``# doctest: -OPTION``: 1487 1488 >>> def f(x): r''' 1489 ... >>> print range(10) 1490 ... [0, 1, ..., 9] 1491 ... 1492 ... >>> # should fail: no ellipsis 1493 ... >>> print range(10) # doctest: -ELLIPSIS 1494 ... [0, 1, ..., 9] 1495 ... ''' 1496 >>> test = doctest.DocTestFinder().find(f)[0] 1497 >>> doctest.DocTestRunner(verbose=False, 1498 ... optionflags=doctest.ELLIPSIS).run(test) 1499 ... # doctest: +ELLIPSIS 1500 ********************************************************************** 1501 File ..., line 6, in f 1502 Failed example: 1503 print range(10) # doctest: -ELLIPSIS 1504 Expected: 1505 [0, 1, ..., 9] 1506 Got: 1507 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1508 TestResults(failed=1, attempted=2) 1509 1510 Option directives affect only the example that they appear with; they 1511 do not change the options for surrounding examples: 1512 1513 >>> def f(x): r''' 1514 ... >>> print range(10) # Should fail: no ellipsis 1515 ... [0, 1, ..., 9] 1516 ... 1517 ... >>> print range(10) # doctest: +ELLIPSIS 1518 ... [0, 1, ..., 9] 1519 ... 1520 ... >>> print range(10) # Should fail: no ellipsis 1521 ... [0, 1, ..., 9] 1522 ... ''' 1523 >>> test = doctest.DocTestFinder().find(f)[0] 1524 >>> doctest.DocTestRunner(verbose=False).run(test) 1525 ... # doctest: +ELLIPSIS 1526 ********************************************************************** 1527 File ..., line 2, in f 1528 Failed example: 1529 print range(10) # Should fail: no ellipsis 1530 Expected: 1531 [0, 1, ..., 9] 1532 Got: 1533 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1534 ********************************************************************** 1535 File ..., line 8, in f 1536 Failed example: 1537 print range(10) # Should fail: no ellipsis 1538 Expected: 1539 [0, 1, ..., 9] 1540 Got: 1541 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1542 TestResults(failed=2, attempted=3) 1543 1544 Multiple options may be modified by a single option directive. They 1545 may be separated by whitespace, commas, or both: 1546 1547 >>> def f(x): r''' 1548 ... >>> print range(10) # Should fail 1549 ... [0, 1, ..., 9] 1550 ... >>> print range(10) # Should succeed 1551 ... ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE 1552 ... [0, 1, ..., 9] 1553 ... ''' 1554 >>> test = doctest.DocTestFinder().find(f)[0] 1555 >>> doctest.DocTestRunner(verbose=False).run(test) 1556 ... # doctest: +ELLIPSIS 1557 ********************************************************************** 1558 File ..., line 2, in f 1559 Failed example: 1560 print range(10) # Should fail 1561 Expected: 1562 [0, 1, ..., 9] 1563 Got: 1564 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1565 TestResults(failed=1, attempted=2) 1566 1567 >>> def f(x): r''' 1568 ... >>> print range(10) # Should fail 1569 ... [0, 1, ..., 9] 1570 ... >>> print range(10) # Should succeed 1571 ... ... # doctest: +ELLIPSIS,+NORMALIZE_WHITESPACE 1572 ... [0, 1, ..., 9] 1573 ... ''' 1574 >>> test = doctest.DocTestFinder().find(f)[0] 1575 >>> doctest.DocTestRunner(verbose=False).run(test) 1576 ... # doctest: +ELLIPSIS 1577 ********************************************************************** 1578 File ..., line 2, in f 1579 Failed example: 1580 print range(10) # Should fail 1581 Expected: 1582 [0, 1, ..., 9] 1583 Got: 1584 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1585 TestResults(failed=1, attempted=2) 1586 1587 >>> def f(x): r''' 1588 ... >>> print range(10) # Should fail 1589 ... [0, 1, ..., 9] 1590 ... >>> print range(10) # Should succeed 1591 ... ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE 1592 ... [0, 1, ..., 9] 1593 ... ''' 1594 >>> test = doctest.DocTestFinder().find(f)[0] 1595 >>> doctest.DocTestRunner(verbose=False).run(test) 1596 ... # doctest: +ELLIPSIS 1597 ********************************************************************** 1598 File ..., line 2, in f 1599 Failed example: 1600 print range(10) # Should fail 1601 Expected: 1602 [0, 1, ..., 9] 1603 Got: 1604 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 1605 TestResults(failed=1, attempted=2) 1606 1607 The option directive may be put on the line following the source, as 1608 long as a continuation prompt is used: 1609 1610 >>> def f(x): r''' 1611 ... >>> print range(10) 1612 ... ... # doctest: +ELLIPSIS 1613 ... [0, 1, ..., 9] 1614 ... ''' 1615 >>> test = doctest.DocTestFinder().find(f)[0] 1616 >>> doctest.DocTestRunner(verbose=False).run(test) 1617 TestResults(failed=0, attempted=1) 1618 1619 For examples with multi-line source, the option directive may appear 1620 at the end of any line: 1621 1622 >>> def f(x): r''' 1623 ... >>> for x in range(10): # doctest: +ELLIPSIS 1624 ... ... print x, 1625 ... 0 1 2 ... 9 1626 ... 1627 ... >>> for x in range(10): 1628 ... ... print x, # doctest: +ELLIPSIS 1629 ... 0 1 2 ... 9 1630 ... ''' 1631 >>> test = doctest.DocTestFinder().find(f)[0] 1632 >>> doctest.DocTestRunner(verbose=False).run(test) 1633 TestResults(failed=0, attempted=2) 1634 1635 If more than one line of an example with multi-line source has an 1636 option directive, then they are combined: 1637 1638 >>> def f(x): r''' 1639 ... Should fail (option directive not on the last line): 1640 ... >>> for x in range(10): # doctest: +ELLIPSIS 1641 ... ... print x, # doctest: +NORMALIZE_WHITESPACE 1642 ... 0 1 2...9 1643 ... ''' 1644 >>> test = doctest.DocTestFinder().find(f)[0] 1645 >>> doctest.DocTestRunner(verbose=False).run(test) 1646 TestResults(failed=0, attempted=1) 1647 1648 It is an error to have a comment of the form ``# doctest:`` that is 1649 *not* followed by words of the form ``+OPTION`` or ``-OPTION``, where 1650 ``OPTION`` is an option that has been registered with 1651 `register_option`: 1652 1653 >>> # Error: Option not registered 1654 >>> s = '>>> print 12 #doctest: +BADOPTION' 1655 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) 1656 Traceback (most recent call last): 1657 ValueError: line 1 of the doctest for s has an invalid option: '+BADOPTION' 1658 1659 >>> # Error: No + or - prefix 1660 >>> s = '>>> print 12 #doctest: ELLIPSIS' 1661 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) 1662 Traceback (most recent call last): 1663 ValueError: line 1 of the doctest for s has an invalid option: 'ELLIPSIS' 1664 1665 It is an error to use an option directive on a line that contains no 1666 source: 1667 1668 >>> s = '>>> # doctest: +ELLIPSIS' 1669 >>> test = doctest.DocTestParser().get_doctest(s, {}, 's', 's.py', 0) 1670 Traceback (most recent call last): 1671 ValueError: line 0 of the doctest for s has an option directive on a line with no example: '# doctest: +ELLIPSIS' 1672 1673 """ 1674 1675 def test_unicode_output(self): r""" 1676 1677 Check that unicode output works: 1678 1679 >>> u'\xe9' 1680 u'\xe9' 1681 1682 If we return unicode, SpoofOut's buf variable becomes automagically 1683 converted to unicode. This means all subsequent output becomes converted 1684 to unicode, and if the output contains non-ascii characters that failed. 1685 It used to be that this state change carried on between tests, meaning 1686 tests would fail if unicode has been output previously in the testrun. 1687 This test tests that this is no longer so: 1688 1689 >>> print u'abc' 1690 abc 1691 1692 And then return a string with non-ascii characters: 1693 1694 >>> print u'\xe9'.encode('utf-8') 1695 1696 1697 """ 1698 1699 1700 def test_testsource(): r""" 1701 Unit tests for `testsource()`. 1702 1703 The testsource() function takes a module and a name, finds the (first) 1704 test with that name in that module, and converts it to a script. The 1705 example code is converted to regular Python code. The surrounding 1706 words and expected output are converted to comments: 1707 1708 >>> import test.test_doctest 1709 >>> name = 'test.test_doctest.sample_func' 1710 >>> print doctest.testsource(test.test_doctest, name) 1711 # Blah blah 1712 # 1713 print sample_func(22) 1714 # Expected: 1715 ## 44 1716 # 1717 # Yee ha! 1718 <BLANKLINE> 1719 1720 >>> name = 'test.test_doctest.SampleNewStyleClass' 1721 >>> print doctest.testsource(test.test_doctest, name) 1722 print '1\n2\n3' 1723 # Expected: 1724 ## 1 1725 ## 2 1726 ## 3 1727 <BLANKLINE> 1728 1729 >>> name = 'test.test_doctest.SampleClass.a_classmethod' 1730 >>> print doctest.testsource(test.test_doctest, name) 1731 print SampleClass.a_classmethod(10) 1732 # Expected: 1733 ## 12 1734 print SampleClass(0).a_classmethod(10) 1735 # Expected: 1736 ## 12 1737 <BLANKLINE> 1738 """ 1739 1740 def test_debug(): r""" 1741 1742 Create a docstring that we want to debug: 1743 1744 >>> s = ''' 1745 ... >>> x = 12 1746 ... >>> print x 1747 ... 12 1748 ... ''' 1749 1750 Create some fake stdin input, to feed to the debugger: 1751 1752 >>> import tempfile 1753 >>> real_stdin = sys.stdin 1754 >>> sys.stdin = _FakeInput(['next', 'print x', 'continue']) 1755 1756 Run the debugger on the docstring, and then restore sys.stdin. 1757 1758 >>> try: doctest.debug_src(s) 1759 ... finally: sys.stdin = real_stdin 1760 > <string>(1)<module>() 1761 (Pdb) next 1762 12 1763 --Return-- 1764 > <string>(1)<module>()->None 1765 (Pdb) print x 1766 12 1767 (Pdb) continue 1768 1769 """ 1770 1771 def test_pdb_set_trace(): 1772 """Using pdb.set_trace from a doctest. 1773 1774 You can use pdb.set_trace from a doctest. To do so, you must 1775 retrieve the set_trace function from the pdb module at the time 1776 you use it. The doctest module changes sys.stdout so that it can 1777 capture program output. It also temporarily replaces pdb.set_trace 1778 with a version that restores stdout. This is necessary for you to 1779 see debugger output. 1780 1781 >>> doc = ''' 1782 ... >>> x = 42 1783 ... >>> raise Exception('cl') 1784 ... Traceback (most recent call last): 1785 ... Exception: cl 1786 ... >>> import pdb; pdb.set_trace() 1787 ... ''' 1788 >>> parser = doctest.DocTestParser() 1789 >>> test = parser.get_doctest(doc, {}, "foo-br@baz", "foo-br@baz.py", 0) 1790 >>> runner = doctest.DocTestRunner(verbose=False) 1791 1792 To demonstrate this, we'll create a fake standard input that 1793 captures our debugger input: 1794 1795 >>> import tempfile 1796 >>> real_stdin = sys.stdin 1797 >>> sys.stdin = _FakeInput([ 1798 ... 'print x', # print data defined by the example 1799 ... 'continue', # stop debugging 1800 ... '']) 1801 1802 >>> try: runner.run(test) 1803 ... finally: sys.stdin = real_stdin 1804 --Return-- 1805 > <doctest foo-br@baz[2]>(1)<module>()->None 1806 -> import pdb; pdb.set_trace() 1807 (Pdb) print x 1808 42 1809 (Pdb) continue 1810 TestResults(failed=0, attempted=3) 1811 1812 You can also put pdb.set_trace in a function called from a test: 1813 1814 >>> def calls_set_trace(): 1815 ... y=2 1816 ... import pdb; pdb.set_trace() 1817 1818 >>> doc = ''' 1819 ... >>> x=1 1820 ... >>> calls_set_trace() 1821 ... ''' 1822 >>> test = parser.get_doctest(doc, globals(), "foo-br@baz", "foo-br@baz.py", 0) 1823 >>> real_stdin = sys.stdin 1824 >>> sys.stdin = _FakeInput([ 1825 ... 'print y', # print data defined in the function 1826 ... 'up', # out of function 1827 ... 'print x', # print data defined by the example 1828 ... 'continue', # stop debugging 1829 ... '']) 1830 1831 >>> try: 1832 ... runner.run(test) 1833 ... finally: 1834 ... sys.stdin = real_stdin 1835 --Return-- 1836 > <doctest test.test_doctest.test_pdb_set_trace[8]>(3)calls_set_trace()->None 1837 -> import pdb; pdb.set_trace() 1838 (Pdb) print y 1839 2 1840 (Pdb) up 1841 > <doctest foo-br@baz[1]>(1)<module>() 1842 -> calls_set_trace() 1843 (Pdb) print x 1844 1 1845 (Pdb) continue 1846 TestResults(failed=0, attempted=2) 1847 1848 During interactive debugging, source code is shown, even for 1849 doctest examples: 1850 1851 >>> doc = ''' 1852 ... >>> def f(x): 1853 ... ... g(x*2) 1854 ... >>> def g(x): 1855 ... ... print x+3 1856 ... ... import pdb; pdb.set_trace() 1857 ... >>> f(3) 1858 ... ''' 1859 >>> test = parser.get_doctest(doc, globals(), "foo-br@baz", "foo-br@baz.py", 0) 1860 >>> real_stdin = sys.stdin 1861 >>> sys.stdin = _FakeInput([ 1862 ... 'list', # list source from example 2 1863 ... 'next', # return from g() 1864 ... 'list', # list source from example 1 1865 ... 'next', # return from f() 1866 ... 'list', # list source from example 3 1867 ... 'continue', # stop debugging 1868 ... '']) 1869 >>> try: runner.run(test) 1870 ... finally: sys.stdin = real_stdin 1871 ... # doctest: +NORMALIZE_WHITESPACE 1872 --Return-- 1873 > <doctest foo-br@baz[1]>(3)g()->None 1874 -> import pdb; pdb.set_trace() 1875 (Pdb) list 1876 1 def g(x): 1877 2 print x+3 1878 3 -> import pdb; pdb.set_trace() 1879 [EOF] 1880 (Pdb) next 1881 --Return-- 1882 > <doctest foo-br@baz[0]>(2)f()->None 1883 -> g(x*2) 1884 (Pdb) list 1885 1 def f(x): 1886 2 -> g(x*2) 1887 [EOF] 1888 (Pdb) next 1889 --Return-- 1890 > <doctest foo-br@baz[2]>(1)<module>()->None 1891 -> f(3) 1892 (Pdb) list 1893 1 -> f(3) 1894 [EOF] 1895 (Pdb) continue 1896 ********************************************************************** 1897 File "foo-br@baz.py", line 7, in foo-br@baz 1898 Failed example: 1899 f(3) 1900 Expected nothing 1901 Got: 1902 9 1903 TestResults(failed=1, attempted=3) 1904 """ 1905 1906 def test_pdb_set_trace_nested(): 1907 """This illustrates more-demanding use of set_trace with nested functions. 1908 1909 >>> class C(object): 1910 ... def calls_set_trace(self): 1911 ... y = 1 1912 ... import pdb; pdb.set_trace() 1913 ... self.f1() 1914 ... y = 2 1915 ... def f1(self): 1916 ... x = 1 1917 ... self.f2() 1918 ... x = 2 1919 ... def f2(self): 1920 ... z = 1 1921 ... z = 2 1922 1923 >>> calls_set_trace = C().calls_set_trace 1924 1925 >>> doc = ''' 1926 ... >>> a = 1 1927 ... >>> calls_set_trace() 1928 ... ''' 1929 >>> parser = doctest.DocTestParser() 1930 >>> runner = doctest.DocTestRunner(verbose=False) 1931 >>> test = parser.get_doctest(doc, globals(), "foo-br@baz", "foo-br@baz.py", 0) 1932 >>> real_stdin = sys.stdin 1933 >>> sys.stdin = _FakeInput([ 1934 ... 'print y', # print data defined in the function 1935 ... 'step', 'step', 'step', 'step', 'step', 'step', 'print z', 1936 ... 'up', 'print x', 1937 ... 'up', 'print y', 1938 ... 'up', 'print foo', 1939 ... 'continue', # stop debugging 1940 ... '']) 1941 1942 >>> try: 1943 ... runner.run(test) 1944 ... finally: 1945 ... sys.stdin = real_stdin 1946 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace() 1947 -> self.f1() 1948 (Pdb) print y 1949 1 1950 (Pdb) step 1951 --Call-- 1952 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(7)f1() 1953 -> def f1(self): 1954 (Pdb) step 1955 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(8)f1() 1956 -> x = 1 1957 (Pdb) step 1958 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1() 1959 -> self.f2() 1960 (Pdb) step 1961 --Call-- 1962 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(11)f2() 1963 -> def f2(self): 1964 (Pdb) step 1965 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(12)f2() 1966 -> z = 1 1967 (Pdb) step 1968 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(13)f2() 1969 -> z = 2 1970 (Pdb) print z 1971 1 1972 (Pdb) up 1973 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(9)f1() 1974 -> self.f2() 1975 (Pdb) print x 1976 1 1977 (Pdb) up 1978 > <doctest test.test_doctest.test_pdb_set_trace_nested[0]>(5)calls_set_trace() 1979 -> self.f1() 1980 (Pdb) print y 1981 1 1982 (Pdb) up 1983 > <doctest foo-br@baz[1]>(1)<module>() 1984 -> calls_set_trace() 1985 (Pdb) print foo 1986 *** NameError: name 'foo' is not defined 1987 (Pdb) continue 1988 TestResults(failed=0, attempted=2) 1989 """ 1990 1991 def test_DocTestSuite(): 1992 """DocTestSuite creates a unittest test suite from a doctest. 1993 1994 We create a Suite by providing a module. A module can be provided 1995 by passing a module object: 1996 1997 >>> import unittest 1998 >>> import test.sample_doctest 1999 >>> suite = doctest.DocTestSuite(test.sample_doctest) 2000 >>> suite.run(unittest.TestResult()) 2001 <unittest.result.TestResult run=9 errors=0 failures=4> 2002 2003 We can also supply the module by name: 2004 2005 >>> suite = doctest.DocTestSuite('test.sample_doctest') 2006 >>> suite.run(unittest.TestResult()) 2007 <unittest.result.TestResult run=9 errors=0 failures=4> 2008 2009 The module need not contain any doctest examples: 2010 2011 >>> suite = doctest.DocTestSuite('test.sample_doctest_no_doctests') 2012 >>> suite.run(unittest.TestResult()) 2013 <unittest.result.TestResult run=0 errors=0 failures=0> 2014 2015 However, if DocTestSuite finds no docstrings, it raises an error: 2016 2017 >>> try: 2018 ... doctest.DocTestSuite('test.sample_doctest_no_docstrings') 2019 ... except ValueError as e: 2020 ... error = e 2021 2022 >>> print(error.args[1]) 2023 has no docstrings 2024 2025 You can prevent this error by passing a DocTestFinder instance with 2026 the `exclude_empty` keyword argument set to False: 2027 2028 >>> finder = doctest.DocTestFinder(exclude_empty=False) 2029 >>> suite = doctest.DocTestSuite('test.sample_doctest_no_docstrings', 2030 ... test_finder=finder) 2031 >>> suite.run(unittest.TestResult()) 2032 <unittest.result.TestResult run=0 errors=0 failures=0> 2033 2034 We can use the current module: 2035 2036 >>> suite = test.sample_doctest.test_suite() 2037 >>> suite.run(unittest.TestResult()) 2038 <unittest.result.TestResult run=9 errors=0 failures=4> 2039 2040 We can supply global variables. If we pass globs, they will be 2041 used instead of the module globals. Here we'll pass an empty 2042 globals, triggering an extra error: 2043 2044 >>> suite = doctest.DocTestSuite('test.sample_doctest', globs={}) 2045 >>> suite.run(unittest.TestResult()) 2046 <unittest.result.TestResult run=9 errors=0 failures=5> 2047 2048 Alternatively, we can provide extra globals. Here we'll make an 2049 error go away by providing an extra global variable: 2050 2051 >>> suite = doctest.DocTestSuite('test.sample_doctest', 2052 ... extraglobs={'y': 1}) 2053 >>> suite.run(unittest.TestResult()) 2054 <unittest.result.TestResult run=9 errors=0 failures=3> 2055 2056 You can pass option flags. Here we'll cause an extra error 2057 by disabling the blank-line feature: 2058 2059 >>> suite = doctest.DocTestSuite('test.sample_doctest', 2060 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE) 2061 >>> suite.run(unittest.TestResult()) 2062 <unittest.result.TestResult run=9 errors=0 failures=5> 2063 2064 You can supply setUp and tearDown functions: 2065 2066 >>> def setUp(t): 2067 ... import test.test_doctest 2068 ... test.test_doctest.sillySetup = True 2069 2070 >>> def tearDown(t): 2071 ... import test.test_doctest 2072 ... del test.test_doctest.sillySetup 2073 2074 Here, we installed a silly variable that the test expects: 2075 2076 >>> suite = doctest.DocTestSuite('test.sample_doctest', 2077 ... setUp=setUp, tearDown=tearDown) 2078 >>> suite.run(unittest.TestResult()) 2079 <unittest.result.TestResult run=9 errors=0 failures=3> 2080 2081 But the tearDown restores sanity: 2082 2083 >>> import test.test_doctest 2084 >>> test.test_doctest.sillySetup 2085 Traceback (most recent call last): 2086 ... 2087 AttributeError: 'module' object has no attribute 'sillySetup' 2088 2089 The setUp and tearDown funtions are passed test objects. Here 2090 we'll use the setUp function to supply the missing variable y: 2091 2092 >>> def setUp(test): 2093 ... test.globs['y'] = 1 2094 2095 >>> suite = doctest.DocTestSuite('test.sample_doctest', setUp=setUp) 2096 >>> suite.run(unittest.TestResult()) 2097 <unittest.result.TestResult run=9 errors=0 failures=3> 2098 2099 Here, we didn't need to use a tearDown function because we 2100 modified the test globals, which are a copy of the 2101 sample_doctest module dictionary. The test globals are 2102 automatically cleared for us after a test. 2103 """ 2104 2105 def test_DocFileSuite(): 2106 """We can test tests found in text files using a DocFileSuite. 2107 2108 We create a suite by providing the names of one or more text 2109 files that include examples: 2110 2111 >>> import unittest 2112 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2113 ... 'test_doctest2.txt', 2114 ... 'test_doctest4.txt') 2115 >>> suite.run(unittest.TestResult()) 2116 <unittest.result.TestResult run=3 errors=0 failures=3> 2117 2118 The test files are looked for in the directory containing the 2119 calling module. A package keyword argument can be provided to 2120 specify a different relative location. 2121 2122 >>> import unittest 2123 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2124 ... 'test_doctest2.txt', 2125 ... 'test_doctest4.txt', 2126 ... package='test') 2127 >>> suite.run(unittest.TestResult()) 2128 <unittest.result.TestResult run=3 errors=0 failures=3> 2129 2130 Support for using a package's __loader__.get_data() is also 2131 provided. 2132 2133 >>> import unittest, pkgutil, test 2134 >>> added_loader = False 2135 >>> if not hasattr(test, '__loader__'): 2136 ... test.__loader__ = pkgutil.get_loader(test) 2137 ... added_loader = True 2138 >>> try: 2139 ... suite = doctest.DocFileSuite('test_doctest.txt', 2140 ... 'test_doctest2.txt', 2141 ... 'test_doctest4.txt', 2142 ... package='test') 2143 ... suite.run(unittest.TestResult()) 2144 ... finally: 2145 ... if added_loader: 2146 ... del test.__loader__ 2147 <unittest.result.TestResult run=3 errors=0 failures=3> 2148 2149 '/' should be used as a path separator. It will be converted 2150 to a native separator at run time: 2151 2152 >>> suite = doctest.DocFileSuite('../test/test_doctest.txt') 2153 >>> suite.run(unittest.TestResult()) 2154 <unittest.result.TestResult run=1 errors=0 failures=1> 2155 2156 If DocFileSuite is used from an interactive session, then files 2157 are resolved relative to the directory of sys.argv[0]: 2158 2159 >>> import types, os.path, test.test_doctest 2160 >>> save_argv = sys.argv 2161 >>> sys.argv = [test.test_doctest.__file__] 2162 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2163 ... package=types.ModuleType('__main__')) 2164 >>> sys.argv = save_argv 2165 2166 By setting `module_relative=False`, os-specific paths may be 2167 used (including absolute paths and paths relative to the 2168 working directory): 2169 2170 >>> # Get the absolute path of the test package. 2171 >>> test_doctest_path = os.path.abspath(test.test_doctest.__file__) 2172 >>> test_pkg_path = os.path.split(test_doctest_path)[0] 2173 2174 >>> # Use it to find the absolute path of test_doctest.txt. 2175 >>> test_file = os.path.join(test_pkg_path, 'test_doctest.txt') 2176 2177 >>> suite = doctest.DocFileSuite(test_file, module_relative=False) 2178 >>> suite.run(unittest.TestResult()) 2179 <unittest.result.TestResult run=1 errors=0 failures=1> 2180 2181 It is an error to specify `package` when `module_relative=False`: 2182 2183 >>> suite = doctest.DocFileSuite(test_file, module_relative=False, 2184 ... package='test') 2185 Traceback (most recent call last): 2186 ValueError: Package may only be specified for module-relative paths. 2187 2188 You can specify initial global variables: 2189 2190 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2191 ... 'test_doctest2.txt', 2192 ... 'test_doctest4.txt', 2193 ... globs={'favorite_color': 'blue'}) 2194 >>> suite.run(unittest.TestResult()) 2195 <unittest.result.TestResult run=3 errors=0 failures=2> 2196 2197 In this case, we supplied a missing favorite color. You can 2198 provide doctest options: 2199 2200 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2201 ... 'test_doctest2.txt', 2202 ... 'test_doctest4.txt', 2203 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE, 2204 ... globs={'favorite_color': 'blue'}) 2205 >>> suite.run(unittest.TestResult()) 2206 <unittest.result.TestResult run=3 errors=0 failures=3> 2207 2208 And, you can provide setUp and tearDown functions: 2209 2210 >>> def setUp(t): 2211 ... import test.test_doctest 2212 ... test.test_doctest.sillySetup = True 2213 2214 >>> def tearDown(t): 2215 ... import test.test_doctest 2216 ... del test.test_doctest.sillySetup 2217 2218 Here, we installed a silly variable that the test expects: 2219 2220 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2221 ... 'test_doctest2.txt', 2222 ... 'test_doctest4.txt', 2223 ... setUp=setUp, tearDown=tearDown) 2224 >>> suite.run(unittest.TestResult()) 2225 <unittest.result.TestResult run=3 errors=0 failures=2> 2226 2227 But the tearDown restores sanity: 2228 2229 >>> import test.test_doctest 2230 >>> test.test_doctest.sillySetup 2231 Traceback (most recent call last): 2232 ... 2233 AttributeError: 'module' object has no attribute 'sillySetup' 2234 2235 The setUp and tearDown funtions are passed test objects. 2236 Here, we'll use a setUp function to set the favorite color in 2237 test_doctest.txt: 2238 2239 >>> def setUp(test): 2240 ... test.globs['favorite_color'] = 'blue' 2241 2242 >>> suite = doctest.DocFileSuite('test_doctest.txt', setUp=setUp) 2243 >>> suite.run(unittest.TestResult()) 2244 <unittest.result.TestResult run=1 errors=0 failures=0> 2245 2246 Here, we didn't need to use a tearDown function because we 2247 modified the test globals. The test globals are 2248 automatically cleared for us after a test. 2249 2250 Tests in a file run using `DocFileSuite` can also access the 2251 `__file__` global, which is set to the name of the file 2252 containing the tests: 2253 2254 >>> suite = doctest.DocFileSuite('test_doctest3.txt') 2255 >>> suite.run(unittest.TestResult()) 2256 <unittest.result.TestResult run=1 errors=0 failures=0> 2257 2258 If the tests contain non-ASCII characters, we have to specify which 2259 encoding the file is encoded with. We do so by using the `encoding` 2260 parameter: 2261 2262 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2263 ... 'test_doctest2.txt', 2264 ... 'test_doctest4.txt', 2265 ... encoding='utf-8') 2266 >>> suite.run(unittest.TestResult()) 2267 <unittest.result.TestResult run=3 errors=0 failures=2> 2268 2269 """ 2270 2271 def test_trailing_space_in_test(): 2272 """ 2273 Trailing spaces in expected output are significant: 2274 2275 >>> x, y = 'foo', '' 2276 >>> print x, y 2277 foo \n 2278 """ 2279 2280 2281 def test_unittest_reportflags(): 2282 """Default unittest reporting flags can be set to control reporting 2283 2284 Here, we'll set the REPORT_ONLY_FIRST_FAILURE option so we see 2285 only the first failure of each test. First, we'll look at the 2286 output without the flag. The file test_doctest.txt file has two 2287 tests. They both fail if blank lines are disabled: 2288 2289 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2290 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE) 2291 >>> import unittest 2292 >>> result = suite.run(unittest.TestResult()) 2293 >>> print result.failures[0][1] # doctest: +ELLIPSIS 2294 Traceback ... 2295 Failed example: 2296 favorite_color 2297 ... 2298 Failed example: 2299 if 1: 2300 ... 2301 2302 Note that we see both failures displayed. 2303 2304 >>> old = doctest.set_unittest_reportflags( 2305 ... doctest.REPORT_ONLY_FIRST_FAILURE) 2306 2307 Now, when we run the test: 2308 2309 >>> result = suite.run(unittest.TestResult()) 2310 >>> print result.failures[0][1] # doctest: +ELLIPSIS 2311 Traceback ... 2312 Failed example: 2313 favorite_color 2314 Exception raised: 2315 ... 2316 NameError: name 'favorite_color' is not defined 2317 <BLANKLINE> 2318 <BLANKLINE> 2319 2320 We get only the first failure. 2321 2322 If we give any reporting options when we set up the tests, 2323 however: 2324 2325 >>> suite = doctest.DocFileSuite('test_doctest.txt', 2326 ... optionflags=doctest.DONT_ACCEPT_BLANKLINE | doctest.REPORT_NDIFF) 2327 2328 Then the default eporting options are ignored: 2329 2330 >>> result = suite.run(unittest.TestResult()) 2331 >>> print result.failures[0][1] # doctest: +ELLIPSIS 2332 Traceback ... 2333 Failed example: 2334 favorite_color 2335 ... 2336 Failed example: 2337 if 1: 2338 print 'a' 2339 print 2340 print 'b' 2341 Differences (ndiff with -expected +actual): 2342 a 2343 - <BLANKLINE> 2344 + 2345 b 2346 <BLANKLINE> 2347 <BLANKLINE> 2348 2349 2350 Test runners can restore the formatting flags after they run: 2351 2352 >>> ignored = doctest.set_unittest_reportflags(old) 2353 2354 """ 2355 2356 def test_testfile(): r""" 2357 Tests for the `testfile()` function. This function runs all the 2358 doctest examples in a given file. In its simple invokation, it is 2359 called with the name of a file, which is taken to be relative to the 2360 calling module. The return value is (#failures, #tests). 2361 2362 We don't want `-v` in sys.argv for these tests. 2363 2364 >>> save_argv = sys.argv 2365 >>> if '-v' in sys.argv: 2366 ... sys.argv = [arg for arg in save_argv if arg != '-v'] 2367 2368 2369 >>> doctest.testfile('test_doctest.txt') # doctest: +ELLIPSIS 2370 ********************************************************************** 2371 File "...", line 6, in test_doctest.txt 2372 Failed example: 2373 favorite_color 2374 Exception raised: 2375 ... 2376 NameError: name 'favorite_color' is not defined 2377 ********************************************************************** 2378 1 items had failures: 2379 1 of 2 in test_doctest.txt 2380 ***Test Failed*** 1 failures. 2381 TestResults(failed=1, attempted=2) 2382 >>> doctest.master = None # Reset master. 2383 2384 (Note: we'll be clearing doctest.master after each call to 2385 `doctest.testfile`, to suppress warnings about multiple tests with the 2386 same name.) 2387 2388 Globals may be specified with the `globs` and `extraglobs` parameters: 2389 2390 >>> globs = {'favorite_color': 'blue'} 2391 >>> doctest.testfile('test_doctest.txt', globs=globs) 2392 TestResults(failed=0, attempted=2) 2393 >>> doctest.master = None # Reset master. 2394 2395 >>> extraglobs = {'favorite_color': 'red'} 2396 >>> doctest.testfile('test_doctest.txt', globs=globs, 2397 ... extraglobs=extraglobs) # doctest: +ELLIPSIS 2398 ********************************************************************** 2399 File "...", line 6, in test_doctest.txt 2400 Failed example: 2401 favorite_color 2402 Expected: 2403 'blue' 2404 Got: 2405 'red' 2406 ********************************************************************** 2407 1 items had failures: 2408 1 of 2 in test_doctest.txt 2409 ***Test Failed*** 1 failures. 2410 TestResults(failed=1, attempted=2) 2411 >>> doctest.master = None # Reset master. 2412 2413 The file may be made relative to a given module or package, using the 2414 optional `module_relative` parameter: 2415 2416 >>> doctest.testfile('test_doctest.txt', globs=globs, 2417 ... module_relative='test') 2418 TestResults(failed=0, attempted=2) 2419 >>> doctest.master = None # Reset master. 2420 2421 Verbosity can be increased with the optional `verbose` parameter: 2422 2423 >>> doctest.testfile('test_doctest.txt', globs=globs, verbose=True) 2424 Trying: 2425 favorite_color 2426 Expecting: 2427 'blue' 2428 ok 2429 Trying: 2430 if 1: 2431 print 'a' 2432 print 2433 print 'b' 2434 Expecting: 2435 a 2436 <BLANKLINE> 2437 b 2438 ok 2439 1 items passed all tests: 2440 2 tests in test_doctest.txt 2441 2 tests in 1 items. 2442 2 passed and 0 failed. 2443 Test passed. 2444 TestResults(failed=0, attempted=2) 2445 >>> doctest.master = None # Reset master. 2446 2447 The name of the test may be specified with the optional `name` 2448 parameter: 2449 2450 >>> doctest.testfile('test_doctest.txt', name='newname') 2451 ... # doctest: +ELLIPSIS 2452 ********************************************************************** 2453 File "...", line 6, in newname 2454 ... 2455 TestResults(failed=1, attempted=2) 2456 >>> doctest.master = None # Reset master. 2457 2458 The summary report may be suppressed with the optional `report` 2459 parameter: 2460 2461 >>> doctest.testfile('test_doctest.txt', report=False) 2462 ... # doctest: +ELLIPSIS 2463 ********************************************************************** 2464 File "...", line 6, in test_doctest.txt 2465 Failed example: 2466 favorite_color 2467 Exception raised: 2468 ... 2469 NameError: name 'favorite_color' is not defined 2470 TestResults(failed=1, attempted=2) 2471 >>> doctest.master = None # Reset master. 2472 2473 The optional keyword argument `raise_on_error` can be used to raise an 2474 exception on the first error (which may be useful for postmortem 2475 debugging): 2476 2477 >>> doctest.testfile('test_doctest.txt', raise_on_error=True) 2478 ... # doctest: +ELLIPSIS 2479 Traceback (most recent call last): 2480 UnexpectedException: ... 2481 >>> doctest.master = None # Reset master. 2482 2483 If the tests contain non-ASCII characters, the tests might fail, since 2484 it's unknown which encoding is used. The encoding can be specified 2485 using the optional keyword argument `encoding`: 2486 2487 >>> doctest.testfile('test_doctest4.txt') # doctest: +ELLIPSIS 2488 ********************************************************************** 2489 File "...", line 7, in test_doctest4.txt 2490 Failed example: 2491 u'...' 2492 Expected: 2493 u'f\xf6\xf6' 2494 Got: 2495 u'f\xc3\xb6\xc3\xb6' 2496 ********************************************************************** 2497 ... 2498 ********************************************************************** 2499 1 items had failures: 2500 2 of 4 in test_doctest4.txt 2501 ***Test Failed*** 2 failures. 2502 TestResults(failed=2, attempted=4) 2503 >>> doctest.master = None # Reset master. 2504 2505 >>> doctest.testfile('test_doctest4.txt', encoding='utf-8') 2506 TestResults(failed=0, attempted=4) 2507 >>> doctest.master = None # Reset master. 2508 2509 Switch the module encoding to 'utf-8' to test the verbose output without 2510 bothering with the current sys.stdout encoding. 2511 2512 >>> doctest._encoding, saved_encoding = 'utf-8', doctest._encoding 2513 >>> doctest.testfile('test_doctest4.txt', encoding='utf-8', verbose=True) 2514 Trying: 2515 u'f' 2516 Expecting: 2517 u'f\xf6\xf6' 2518 ok 2519 Trying: 2520 u'br' 2521 Expecting: 2522 u'b\u0105r' 2523 ok 2524 Trying: 2525 'f' 2526 Expecting: 2527 'f\xc3\xb6\xc3\xb6' 2528 ok 2529 Trying: 2530 'br' 2531 Expecting: 2532 'b\xc4\x85r' 2533 ok 2534 1 items passed all tests: 2535 4 tests in test_doctest4.txt 2536 4 tests in 1 items. 2537 4 passed and 0 failed. 2538 Test passed. 2539 TestResults(failed=0, attempted=4) 2540 >>> doctest._encoding = saved_encoding 2541 >>> doctest.master = None # Reset master. 2542 >>> sys.argv = save_argv 2543 """ 2544 2545 # old_test1, ... used to live in doctest.py, but cluttered it. Note 2546 # that these use the deprecated doctest.Tester, so should go away (or 2547 # be rewritten) someday. 2548 2549 def old_test1(): r""" 2550 >>> from doctest import Tester 2551 >>> t = Tester(globs={'x': 42}, verbose=0) 2552 >>> t.runstring(r''' 2553 ... >>> x = x * 2 2554 ... >>> print x 2555 ... 42 2556 ... ''', 'XYZ') 2557 ********************************************************************** 2558 Line 3, in XYZ 2559 Failed example: 2560 print x 2561 Expected: 2562 42 2563 Got: 2564 84 2565 TestResults(failed=1, attempted=2) 2566 >>> t.runstring(">>> x = x * 2\n>>> print x\n84\n", 'example2') 2567 TestResults(failed=0, attempted=2) 2568 >>> t.summarize() 2569 ********************************************************************** 2570 1 items had failures: 2571 1 of 2 in XYZ 2572 ***Test Failed*** 1 failures. 2573 TestResults(failed=1, attempted=4) 2574 >>> t.summarize(verbose=1) 2575 1 items passed all tests: 2576 2 tests in example2 2577 ********************************************************************** 2578 1 items had failures: 2579 1 of 2 in XYZ 2580 4 tests in 2 items. 2581 3 passed and 1 failed. 2582 ***Test Failed*** 1 failures. 2583 TestResults(failed=1, attempted=4) 2584 """ 2585 2586 def old_test2(): r""" 2587 >>> from doctest import Tester 2588 >>> t = Tester(globs={}, verbose=1) 2589 >>> test = r''' 2590 ... # just an example 2591 ... >>> x = 1 + 2 2592 ... >>> x 2593 ... 3 2594 ... ''' 2595 >>> t.runstring(test, "Example") 2596 Running string Example 2597 Trying: 2598 x = 1 + 2 2599 Expecting nothing 2600 ok 2601 Trying: 2602 x 2603 Expecting: 2604 3 2605 ok 2606 0 of 2 examples failed in string Example 2607 TestResults(failed=0, attempted=2) 2608 """ 2609 2610 def old_test3(): r""" 2611 >>> from doctest import Tester 2612 >>> t = Tester(globs={}, verbose=0) 2613 >>> def _f(): 2614 ... '''Trivial docstring example. 2615 ... >>> assert 2 == 2 2616 ... ''' 2617 ... return 32 2618 ... 2619 >>> t.rundoc(_f) # expect 0 failures in 1 example 2620 TestResults(failed=0, attempted=1) 2621 """ 2622 2623 def old_test4(): """ 2624 >>> import types 2625 >>> m1 = types.ModuleType('_m1') 2626 >>> m2 = types.ModuleType('_m2') 2627 >>> test_data = \""" 2628 ... def _f(): 2629 ... '''>>> assert 1 == 1 2630 ... ''' 2631 ... def g(): 2632 ... '''>>> assert 2 != 1 2633 ... ''' 2634 ... class H: 2635 ... '''>>> assert 2 > 1 2636 ... ''' 2637 ... def bar(self): 2638 ... '''>>> assert 1 < 2 2639 ... ''' 2640 ... \""" 2641 >>> exec test_data in m1.__dict__ 2642 >>> exec test_data in m2.__dict__ 2643 >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H}) 2644 2645 Tests that objects outside m1 are excluded: 2646 2647 >>> from doctest import Tester 2648 >>> t = Tester(globs={}, verbose=0) 2649 >>> t.rundict(m1.__dict__, "rundict_test", m1) # f2 and g2 and h2 skipped 2650 TestResults(failed=0, attempted=4) 2651 2652 Once more, not excluding stuff outside m1: 2653 2654 >>> t = Tester(globs={}, verbose=0) 2655 >>> t.rundict(m1.__dict__, "rundict_test_pvt") # None are skipped. 2656 TestResults(failed=0, attempted=8) 2657 2658 The exclusion of objects from outside the designated module is 2659 meant to be invoked automagically by testmod. 2660 2661 >>> doctest.testmod(m1, verbose=False) 2662 TestResults(failed=0, attempted=4) 2663 """ 2664 2665 ###################################################################### 2666 ## Main 2667 ###################################################################### 2668 2669 def test_main(): 2670 # Check the doctest cases in doctest itself: 2671 test_support.run_doctest(doctest, verbosity=True) 2672 2673 from test import test_doctest 2674 2675 # Ignore all warnings about the use of class Tester in this module. 2676 deprecations = [] 2677 if __debug__: 2678 deprecations.append(("class Tester is deprecated", DeprecationWarning)) 2679 if sys.py3kwarning: 2680 deprecations += [("backquote not supported", SyntaxWarning), 2681 ("execfile.. not supported", DeprecationWarning)] 2682 with test_support.check_warnings(*deprecations): 2683 # Check the doctest cases defined here: 2684 test_support.run_doctest(test_doctest, verbosity=True) 2685 2686 import sys 2687 def test_coverage(coverdir): 2688 trace = test_support.import_module('trace') 2689 tracer = trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,], 2690 trace=0, count=1) 2691 tracer.run('reload(doctest); test_main()') 2692 r = tracer.results() 2693 print 'Writing coverage results...' 2694 r.write_results(show_missing=True, summary=True, 2695 coverdir=coverdir) 2696 2697 if __name__ == '__main__': 2698 if '-c' in sys.argv: 2699 test_coverage('/tmp/doctest.cover') 2700 else: 2701 test_main() 2702