0 votes
1 view
in Python by (260 points)

Is it possible to write a doctest unit test that will check that an exception is raised?

For example, if I have a function factorial(x) that is supposed to raise an exception if x<0, how would I write the doctest for that?

1 Answer

0 votes
by (1.3k points)
edited by

Yes you can do this and here is the answer to your question:-

  • The doctest module searches for pieces of text that look like interactive Python sessions and then executes those sessions to verify that they work exactly as shown.

factorial(n):

  • It returns the factorial of n an exact integer>=0

  • But when we have a negative number then it will throw a valueError that n is negative

def factorial(n):

import math

if not n >= 0:

raise ValueError("n must be >= 0")

if math.floor(n) != n:

raise ValueError("n must be exact integer")

if n+1 == n:  # catch a value like 1e300

raise OverflowError("n too large")

result = 1

factor = 2

while factor <= n:

result *= factor

factor += 1

return result

if __name__ == "__main__":

import doctest

doctest.testmod()


 

  • If you run above code directly from the command line, doctest performs its magic:

  • python example.py -v // Pass -v to the script, and doctest prints a detailed log of what it’s trying, and prints a summary at the end:

Trying:

 factorial(5)

Expecting:

    120

ok

Trying:

    [factorial(n) for n in range(6)]

Expecting:

    [1, 1, 2, 6, 24, 120]

ok

Trying:

    [factorial(long(n)) for n in range(6)]

Expecting:

    [1, 1, 2, 6, 24, 120]

Ok

Trying:

    factorial(-1)

Expecting:

    Traceback (most recent call last):

    valueError: n too large

ok

I guess this is enough to understand and start working with doctest.

...