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)
Some other Articles
Further North - long summer days and lovely countrysideRemoval of technical resources from this siteTypeError: super() argument 1 must be type, not classobj (Python)Robust user input (exception handling) example in PythonTesting code in Python - doctest, unittest and othersPound Sign in Python ProgramBut I am reading from a file - no need to prompt (Perl)Low Sun - Autumn is hereHotel Booking Scam / Cost of calls to 070 numbersAutomated Browsing in Perl