Chapter 2 Exercise Set 1: Introducing Doctest

Introducing doctest

Make a file named doctestintro.py that contains the following

"""
  >>> n
  42
"""
# Place your solution code on the line after this one...


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

Save the file and run it (click here to download a premade version of the file). When you run this program (by typing python3 doctestintro.py at the unix command prompt), it will give you an error that looks something like this:

**********************************************************************
File "doctestintro.py", line 2, in __main__
Failed example:
    n
Exception raised:
    Traceback (most recent call last):
      File "/usr/lib/python3.2/doctest.py", line 1253, in __run
        compileflags, 1), test.globs)
      File "<doctest __main__[0]>", line 1, in <module>
        n
    NameError: name 'n' is not defined
**********************************************************************
1 items had failures:
   1 of   1 in __main__
***Test Failed*** 1 failures.

You will become familiar with these tracebacks as you work with Python. The most important thing here is the last line, which tells you that the name n is not defined.

To define n, assign it a value by adding the following on the line immediately following the # Place your solution code on the line after this one... line in the program.

n = 11

Run the program again, and confirm that you now get an error like this:

**********************************************************************
File "doctestintro.py", line 2, in __main__
Failed example:
    n
Expected:
    42
Got:
    11
**********************************************************************
1 items had failures:
   1 of   1 in __main__
***Test Failed*** 1 failures.

n is now defined, but our doctest is expecting its value to be 42, not 11. Fix this by changing the assignment to n to be

n = 42

When you run the program again, you should not get an error. In fact, you won’t see any output at all. If you are running your program from a command prompt, you can add -v to the end of the command to see verbose output:

$ python3 doctestintro.py -v
Trying:
    n
Expecting:
    42
ok
1 items passed all tests:
   1 tests in __main__
1 tests in 1 items.
   1 passed and 0 failed.
Test passed.

Note

This exercises and the exercises that follow all make use of Python’s built-in automatic testing facility call doctest. For each exercise, you will create a file that contains the following at the bottom:

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

The “tests” will be written at the top of the file in triple quoted strings (called docstrings), and will look just like interactions with the Python shell. Your task will be to make the tests pass (run without failing or returning and error).

To run the tests on a unix system, type the command to launch Python 3 (python3 on most current systems) followed by the file name of your program:

$ python3 doctestintro.py

It is also possible to run your doctest from the python prompt:

>>> import doctest
>>> import doctestintro
>>> doctest.testmod(doctestintro)

doctest exercise 2

Make a file named doctestex2.py that contains the following

"""
  >>> f
  3.5
"""
# Place your solution code on the line after this one...


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

Make the test pass using what you learned in the previous exercise.

doctest exercise 3

Create a file named doctestex3.py that contains the following

"""
  >>> x + y
  42
  >>> type(message)
  <class 'str'>
  >>> len(message)
  13
"""


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

This time there are 3 tests instead of one. You will need more than one assignment statement to make these tests pass.


From here on we will just give you the doctests for each exercise. As in the previous exercises, you will need to create a file for each one and put the three lines of Python at the bottom of the file to make the tests run.

Sum and difference

"""
  >>> n + m
  15
  >>> n - m
  5
"""

Types of things

You will need to create variables of the appropriate type to make these tests pass.

"""
  >>> type(thing1)
  <class 'float'>
  >>> type(thing2)
  <class 'int'>
  >>> type(thing3)
  <class 'str'>
"""

Exponentiation

Remember that ** is the expontentiation operator for this one.

"""
  >>> x ** n
  100
"""

Three numbers with two restrictions

There are limitless solutions to this. Just find one that makes the tests pass.

"""
  >>> a + b + c
  50
  >>> a - c
  10
"""

Joining strings

Review string concatination before trying this one.

"""
  >>> s1 + s2 + s3
  'Three strings were concatinated to make this string.'
"""

Sum and difference 2

"""
  >>> n + m
  55
  >>> n - m
  -3
"""

Types of things 2

Create variables of the appropriate type to make these tests pass.

"""
  >>> type(this)
  <class 'str'>
  >>> type(that)
  <class 'int'>
  >>> type(something)
  <class 'float'>
"""

Four numbers with three restrictions

There are limitless solutions to this. Just find one that makes the tests pass.

"""
  >>> a + b + c + d
  50
  >>> a - c
  10
  >>> a + b
  20
"""

Modulus 1

Review the modulus operation before trying this one.

"""
  >>> n % 5
  2
"""