Doctest

1. Writing a doctest

   1 def get_percentile(number_list, percentile=50):
   2     """ 
   3     Return  percentile of the given list of numbers 
   4     
   5     Return median if percentile not given.
   6     
   7     >>> get_percentile([9, 3, 44, 17, 15])
   8     15
   9 
  10     >>> get_percentile([8, 3, 44, 17, 12, 6])
  11     10
  12 
  13     >>> get_percentile([77,29,33,93,17,13,25])
  14     29
  15 
  16     >>> get_percentile([72,38,39,72,42,80,35])
  17     42
  18 
  19     Because of the way floats are stored in memory, never compare 
  20     floats directly in doctest.
  21     >>> abs( get_percentile([91,5,31,84,37,45,25], 95) - 88.9)
  22     0.0
  23 
  24     """
  25     number_list.sort()
  26     # http://en.wikipedia.org/wiki/Percentile#Alternative_methods
  27     N = len(number_list)
  28     index = ((N-1) * percentile)/100.0
  29     if (index == 0) or (index == N):
  30         return number_list[N]
  31     else:
  32         whole,decimal = int(index), index % 1
  33         value =  ( number_list[whole] + 
  34                   decimal * ( number_list[whole + 1] -  number_list[whole]))
  35 
  36         # If integer return an int or else return the float
  37         return int(value) if not (value % 1) else value
  38 

2. Running the test

No output in normal case.

$ python -m doctest  get_median.py 
$ 

For verbosity, use the "-v" parameter.

$ python -m doctest  -v get_median.py 
Trying:
    get_percentile([9, 3, 44, 17, 15])
Expecting:
    15
ok
Trying:
    get_percentile([8, 3, 44, 17, 12, 6])
Expecting:
    10
ok
Trying:
    get_percentile([77,29,33,93,17,13,25])
Expecting:
    29
ok
Trying:
    get_percentile([72,38,39,72,42,80,35])
Expecting:
    42
ok
Trying:
    abs( get_percentile([91,5,31,84,37,45,25], 95) - 88.9)
Expecting:
    0.0
ok
1 items had no tests:
    get_median
1 items passed all tests:
   5 tests in get_median.get_percentile
5 tests in 2 items.
5 passed and 0 failed.
Test passed.

3. Reference

Python/Doctest (last edited 2010-09-12 14:26:53 by SandipBhattacharya)