pythondoctest

Doctest and relative imports


I'm having trouble using doctest with relative imports. The simple solution is just to get rid of the relative imports. Are there any others?

Say I have a package called example containing 2 files:

example/__init__.py

"""
This package is entirely useless.
>>> arnold = Aardvark()
>>> arnold.talk()
I am an aardvark.
"""

from .A import Aardvark

if __name__ == "__main__":
    import doctest
    doctest.testmod()

example/A.py

class Aardvark(object):
    def talk(self):
        print("I am an aardvark.")

If I now attempt

python example/__init__.py

then I get the error

Traceback (most recent call last):
  File "example/__init__.py", line 8, in <module>
    from .A import Aardvark
ValueError: Attempted relative import in non-package

Solution

  • Create another file my_doctest_runner.py:

    if __name__ == "__main__":
        import doctest
        import example
        doctest.testmod(example)
    

    Execute my_doctest_runner.py to run doctests in example/__init__.py:

    $ python2.7 my_doctest_runner.py
    **********************************************************************
    File "/tmp/example/__init__.py", line 4, in example
    Failed example:
        arnold.talk()
    Expected:
        I am an aaardvark.
    Got:
        I am an aardvark.
    **********************************************************************
    1 items had failures:
       1 of   2 in example
    ***Test Failed*** 1 failures.