2cb2 Testing code in Python - doctest, unittest and others
Home Accessibility Courses Diary The Mouth Forum Resources Site Map About Us Contact
Testing code in Python - doctest, unittest and others

The doctest and unittest modules of Python allow you to provide test harnesses for your classes / packages. Designing applications from the bottom up, you'll want to ensure that each of your code levels works and works well. You'll want to provide an example of what it should do for the next level or programmer up, and you may want to be able to run the code time and time again - perhaps to test some device or algorithm you're plugging in underneath - and get a test report out from that.

With the doctest module, you initially run the python class from the interactive command line and the cut and paste the interaction into a documentation string. When you then run the code to test it, the doctest module checks that the test reproduces the same output that's in the docstring. There's an example here.

The unittest module requires you to write a series of test methods, each starting with the word "test" in their name and including code that asserts what conditions they should find after completion - perhaps an equality, or a certain value exists somewhere in a list. And at the end of all the tests, the module produces a report of which tests passed and failed. There are examples of unittest code here and here

Here's an example of unittest - I have added another test to the source code examples above (which test the system's random module!) and in this first case it all worked.

92:1 grahamellis$ python utter
testchoice (__main__.TestSequenceFunctions) ... ok
testflop (__main__.TestSequenceFunctions) ... ok
testsample (__main__.TestSequenceFunctions) ... ok
testshuffle (__main__.TestSequenceFunctions) ... ok
 
----------------------------------------------------------------------
Ran 4 tests in 0.007s
 
OK
92:1 grahamellis$


Now altering the code to assert that 42 is a number that can be found in a list of suffled numbers from 0 to 10 (which clearly it is not!) I got the following result:

92:1 grahamellis$ python utter
testchoice (__main__.TestSequenceFunctions) ... ok
testflop (__main__.TestSequenceFunctions) ... FAIL
testsample (__main__.TestSequenceFunctions) ... ok
testshuffle (__main__.TestSequenceFunctions) ... ok
 
======================================================================
FAIL: testflop (__main__.TestSequenceFunctions)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "utter", line 21, in testflop
    self.assert_(element in self.seq)
AssertionError
 
----------------------------------------------------------------------
Ran 4 tests in 0.100s
 
FAILED (failures=1)
92:1 grahamellis$


Python also has a profiler module that allows you to see your code coverage, and you should always remember to add a short test harness onto the end of your modules to ensure that the module, when loaded stand alone, is selfvalidating. There's an example here.
(written 2009-09-16, updated 2009-09-17) 2cdb

 
Associated topics are indexed under
Y115 - Additional Python Facilities
  [4085] JSON from Python - first principles, easy example - (2013-05-13)
  [3469] Teaching dilemma - old tricks and techniques, or recent enhancements? - (2011-10-08)
  [3442] A demonstration of how many Python facilities work together - (2011-09-16)
  [3089] Python regular expressions - repeating, splitting, lookahead and lookbehind - (2010-12-17)
  [2790] Joining a MySQL table from within a Python program - (2010-06-02)
  [2786] Factory methods and SqLite in use in a Python teaching example - (2010-05-29)
  [2765] Running operating system commands from your Python program - (2010-05-14)
  [2764] Python decorators - your own, staticmethod and classmethod - (2010-05-14)
  [2746] Model - View - Controller demo, Sqlite - Python 3 - Qt4 - (2010-04-29)
  [2745] Connecting Python to sqlite and MySQL databases - (2010-04-28)
  [2721] Regular Expressions in Python - (2010-04-14)
  [2655] Python - what is going on around me? - (2010-02-28)
  [2462] Python - how it saves on compile time - (2009-10-20)
  [2435] Serialization - storing and reloading objects - (2009-10-04)
  [1876] Python Regular Expressions - (2008-11-08)
  [1337] A series of tyre damages - (2007-09-08)
  [1336] Ignore case in Regular Expression - (2007-09-08)
  [1305] Regular expressions made easy - building from components - (2007-08-16)
  [1149] Turning objects into something you can store - Pickling (Python) - (2007-04-15)
  [1136] Buffering output - why it is done and issues raised in Tcl, Perl, Python and PHP - (2007-04-06)
  [1043] Sending an email from Python - (2007-01-18)
  [901] Python - listing out the contents of all variables - (2006-10-21)
  [753] Python 3000 - the next generation - (2006-06-09)
  [672] Keeping your regular expressions simple - (2006-04-05)
  [663] Python to MySQL - (2006-03-31)
  [463] Splitting the difference - (2005-10-13)
  [239] What and why for the epoch - (2005-03-08)
  [208] Examples - Gadfly, NI Number, and Tcl to C interface - (2005-02-10)
  [183] The elegance of Python - (2005-01-19)

Y116 - Python - Applying OO design techniques and best practise
  [4028] Really Simple Class and Inheritance example in Python - (2013-03-04)
  [3887] Inheritance, Composition and Associated objects - when to use which - Python example - (2012-10-10)
  [2604] Tips for writing a test program (Ruby / Python / Java) - (2010-01-29)
  [2523] Plan your application before you start - (2009-12-02)
  [2485] How do I set up a constant in Python? - (2009-10-31)
  [2363] Alpaca Case or Camel Case - (2009-08-16)
  [1181] Good Programming practise - where to initialise variables - (2007-05-09)
  [945] Code quality counts - (2006-11-26)
  [836] Build on what you already have with OO - (2006-08-17)
  [668] Python - block insets help with documentation - (2006-04-04)
  [656] Think about your design even if you don't use full UML - (2006-03-24)
  [340] Code and code maintainance efficiency - (2005-06-08)


Back to
Pound Sign in Python Program
Previous and next
or
Horse's mouth home
Forward to
Robust user input (exception handling) example in Python
Some other Articles
Further North - long summer days and lovely countryside
Removal of technical resources from this site
TypeError: super() argument 1 must be type, not classobj (Python)
Robust user input (exception handling) example in Python
Testing code in Python - doctest, unittest and others
Pound Sign in Python Program
But I am reading from a file - no need to prompt (Perl)
Low Sun - Autumn is here
Hotel Booking Scam / Cost of calls to 070 numbers
Automated Browsing in Perl
4086 posts, page by page
Link to page ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82 at 50 posts per page

459e
This is a page archived from The Horse's Mouth at http://www.wellho.net/horse/ - the diary and writings of Graham Ellis. Every attempt was made to provide current information at the time the page was written, but things do move forward in our business - new software releases, price changes, new techniques. Please check back via our main site for current courses, prices, versions, etc - any mention of a price in "The Horse's Mouth" cannot be taken as an offer to supply at that price.

Link to Ezine home page (for reading).
Link to Blogging home page (to add comments).

You can Add a comment or ranking to this page

© WELL HOUSE CONSULTANTS LTD., 2013: Well House Manor • 48 Spa Road • Melksham, Wiltshire • United Kingdom • SN12 7NY
PH: 01144 1225 708225 • FAX: 01144 1225 899360 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/2407_Tes ... thers.html • PAGE BUILT: Sat Feb 23 12:39:13 2013 • BUILD SYSTEM: wizard
0