Training, Open Source Programming Languages

This is page http://www.wellho.net/mouth/2407_Tes ... thers.html

Our email: info@wellho.net • Phone: 01225 708225

 
Python and Tcl - public course schedule [here]
Private courses on your site - see [here]
Please ask about maintenance training for Perl, PHP, Lua, etc
 
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)

 
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
Y115 - Additional Python Facilities
  [4709] Some gems from Intermediate Python - (2016-10-30)
  [4593] Command line parameter handling in Python via the argparse module - (2015-12-08)
  [4536] Json load from URL, recursive display, Python 3.4 - (2015-10-14)
  [4451] Running an operating system command from your Python program - the new way with the subprocess module - (2015-03-06)
  [4439] Json is the new marshall, pickle and cPickle / Python - (2015-02-22)
  [4298] Python - an interesting application - (2014-09-18)
  [4211] Handling JSON in Python (and a csv, marshall and pickle comparison) - (2013-11-16)
  [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
  [4718] Defining an object that is a modified standard type in Python - (2016-11-02)
  [4359] How to avoid too many recalculations within an object - (2014-12-21)
  [4118] We not only teach PHP and Python - we teach good PHP and Python Practice! - (2013-06-18)
  [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
4759 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, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 at 50 posts per page


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).

© WELL HOUSE CONSULTANTS LTD., 2019: 404 The Spa • Melksham, Wiltshire • United Kingdom • SN12 6QL
PH: 01225 708225 • EMAIL: info@wellho.net • WEB: http://www.wellho.net • SKYPE: wellho

PAGE: http://www.wellho.net/mouth/2407_Tes ... thers.html • PAGE BUILT: Sat May 27 16:49:10 2017 • BUILD SYSTEM: WomanWithCat